diff --git a/.env b/.env new file mode 100644 index 00000000..3097e6bd --- /dev/null +++ b/.env @@ -0,0 +1,35 @@ +# Build configuration +VERBOSE_HARNESS=0 + +# Used to determine sandbox build type: +TYPE="channel" # OR "source" + +# Used when TYPE==channel: +ALGOD_CHANNEL="nightly" + +# Used when TYPE==source: +ALGOD_URL="https://github.com/algorand/go-algorand" +ALGOD_BRANCH="master" +ALGOD_SHA="" + +# Used regardless of TYPE: +NETWORK_TEMPLATE="images/algod/DevModeNetwork.json" # refers to the ./images directory in the sandbox repo +NETWORK_NUM_ROUNDS=30000 +INDEXER_URL="https://github.com/algorand/indexer" +NODE_ARCHIVAL="False" +INDEXER_BRANCH="develop" +INDEXER_SHA="" + +# Sandbox configuration: +SANDBOX_URL="https://github.com/algorand/sandbox" +SANDBOX_BRANCH="master" +LOCAL_SANDBOX_DIR=".sandbox" + +# replacement values for Sandbox's docker-compose: +ALGOD_CONTAINER=sdk-harness-algod +KMD_PORT=60001 +ALGOD_PORT=60000 +INDEXER_CONTAINER=sdk-harness-indexer +INDEXER_PORT=59999 +POSTGRES_CONTAINER=sdk-harness-postgres +POSTGRES_PORT=65432 diff --git a/.gitignore b/.gitignore index 47acc826..b085088d 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ java_cucumber/src/test/resources/java_cucumber/*.feature js_cucumber/features/*.feature py_behave/*.feature +# asdf +.tool-versions \ No newline at end of file diff --git a/.up-env b/.up-env deleted file mode 100644 index 1580be21..00000000 --- a/.up-env +++ /dev/null @@ -1,8 +0,0 @@ -export TYPE="channel" - -# Used when TYPE=channel -export CHANNEL="nightly" - -# Used when TYPE=source -export ALGOD_URL="https://github.com/algorand/go-algorand" -export ALGOD_BRANCH="master" diff --git a/README.md b/README.md index 1bbeb2cb..a555d06e 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,13 @@ These reside in the [unit features directory](features/unit) | @unit.algod.ledger_refactoring | | | @unit.applications | Application endpoints added to Algod and Indexer. | | @unit.atomic_transaction_composer | ABI / atomic transaction construction unit tests. | +| @unit.atc_method_args | Test that algod's Atomic Transaction Composer assserts that the same number of arguments given as expected | +| @unit.c2c | Test for contract to contract calling | | @unit.dryrun | Dryrun endpoint added to Algod. | +| @unit.dryrun.trace.application | DryrunResult formatting tests. | | @unit.feetest | Fee transaction encoding tests. | | @unit.indexer | Indexer REST API unit tests. | +| @unit.indexer.ledger_refactoring | Assertions for indexer after ledger refactoring. | | @unit.indexer.logs | Application logs endpoints added to Indexer. | | @unit.indexer.rekey | Rekey endpoints added to Algod and Indexer | | @unit.offline | The first unit tests we wrote for cucumber. | @@ -36,6 +40,7 @@ These reside in the [unit features directory](features/unit) | @unit.responses.genesis | REST Client Unit Tests for GetGenesis endpoint | | @unit.responses.messagepack | REST Client MessagePack Unit Tests | | @unit.responses.messagepack.231 | REST Client MessagePack Unit Tests for Indexer 2.3.1+ | +| @unit.sourcemap | Test the sourcemap endpoint. | | @unit.stateproof.responses | REST Client Response Tests for State Proof. | | @unit.stateproof.responses.msgp | REST Client MessagePack Tests for State Proofs. | | @unit.stateproof.paths | REST Client Unit Tests for State Proof feature. | @@ -43,7 +48,6 @@ These reside in the [unit features directory](features/unit) | @unit.transactions | Transaction encoding tests. | | @unit.transactions.keyreg | Keyreg encoding tests. | | @unit.transactions.payment | Payment encoding tests. | -| @unit.dryrun.trace.application | DryrunResult formatting tests. | ### Integration Tests @@ -53,17 +57,14 @@ These reside in the [integration features directory](features/integration) | ---------------------- | -------------------------------------------------------------------------------------- | | @abi | Test the Application Binary Interface (ABI) with atomic txn composition and execution. | | @algod | General tests against algod REST endpoints. | -| @application.evaldelta | Test that eval delta fields are included in algod and indexer. | | @applications.verified | Submit all types of application transactions and verify account state. | | @assets | Submit all types of asset transactions. | | @auction | Encode and decode bids for an auction. | | @c2c | Test Contract to Contract invocations and injestion. | | @compile | Test the algod compile endpoint. | +| @compile.sourcemap | Test the algod compile endpoint returns a valid Source Map | | @dryrun | Test the algod dryrun endpoint. | | @dryrun.testing | Test the testing harness that relies on dryrun endpoint. Python only. | -| @indexer | Test all types of indexer queries and parameters against a static dataset. | -| @indexer.231 | REST Client Integration Tests for Indexer 2.3.1+ | -| @indexer.applications | Endpoints and parameters added to support applications. | | @kmd | Test the kmd REST endpoints. | | @rekey_v1 | Test the rekeying transactions. | | @send | Test the ability to submit transactions to algod. | @@ -76,9 +77,9 @@ However, a few are not fully supported: | tag | SDK's which implement | | ------------------------------- | ---------------------------- | -| @application.evaldelta | Java only | | @dryrun.testing | Python only | -| @indexer.rekey | missing from Python and JS | +| @unit.c2c | missing from Python | +| @unit.indexer.rekey | missing from Python and JS | | @unit.responses.genesis | missing from Python and Java | | @unit.responses.messagepack | missing from Python | | @unit.responses.messagepack.231 | missing from Python and JS | @@ -167,14 +168,15 @@ The SDKs come with a Makefile to coordinate running the cucumber test suites. Th - **unit**: runs all of the short unit tests. - **integration**: runs all integration tests. +- **harness**: downloads this repo and calls `up.sh` to stand up a sandbox ready for running tests - **docker-test**: installs feature file dependencies, starts the test environment, and runs the SDK tests in a docker container. At a high level, the **docker-test** target is required to: -1. clone `algorand-sdk-testing`. -2. copy supported feature files from the `features` directory into the SDK. -3. build and start the test environment by calling `./scripts/up.sh` -4. launch an SDK container using `--network host` which runs the cucumber test suite. +1. clone `algorand-sdk-testing` +2. copy supported feature files from the `features` directory into the SDK +3. build and start the test environment by calling `./scripts/up.sh` which clones `sandbox` and stands it up +4. run all cucumber tests against the `sandbox` containers ### Running tests during development @@ -186,12 +188,15 @@ Once the test environment is running you can use `make unit` and `make integrati ## Integration test environment -Docker compose is used to manage several containers which work together to provide the test environment. Currently that includes algod, kmd, indexer and a postgres database. The services run on specific ports with specific API tokens. Refer to [docker-compose.yml](docker-compose.yml) and the [docker](docker/) directory for how this is configured. +Algorand's [sandbox](https://github.com/algorand/sandbox) is used to manage several containers which work together to provide the test environment. This includes `algod`, `kmd`, `indexer` and a `postgres` database. The services run on specific ports with specific API tokens. Refer to [.env](.env) and to [sandbox'es docker-compose.yml](https://github.com/algorand/sandbox/blob/master/docker-compose.yml) for how these are configured. ![Integration Test Environment](docs/SDK%20Test%20Environment.png) -### Start the test environment +### Managing the test environment + +[up.sh](scripts/up.sh) is used to bring up the test environment. Not surprisingly, [down.sh](scripts/down.sh) brings it all down. -There are a number of [scripts](scripts/) to help with managing the test environment. The names should help you understand what they do, but to get started simply run **up.sh** to bring up a new environment, and **down.sh** to shut it down. +When starting the environment, we default to using `go-algorand`'s nightly build. If you're interested in running tests against a specific branch of `go-algorand`, you should set `TYPE="source"` in `.env` +and set `ALGOD_URL`, and either `ALGOD_BRANCH` or `ALGOD_SHA` appropriately. -When starting the environment we avoid using the cache intentionally. It uses the go-algorand nightly build, and we want to ensure that the containers are always running against the most recent nightly build. In the future these scripts should be improved, but for now we completely avoid using cached docker containers to ensure that we don't accidentally run against a stale environment. +`indexer` and even the `sandbox` itself can be configured similarly through `.env`. diff --git a/config.harness b/config.harness new file mode 100644 index 00000000..87fe74e1 --- /dev/null +++ b/config.harness @@ -0,0 +1,15 @@ +export ALGOD_CHANNEL="$ALGOD_CHANNEL" +export ALGOD_URL="$ALGOD_URL" +export ALGOD_BRANCH="$ALGOD_BRANCH" +export ALGOD_SHA="$ALGOD_SHA" +export NETWORK="" +export NETWORK_TEMPLATE="$NETWORK_TEMPLATE" +export NETWORK_BOOTSTRAP_URL="" +export NETWORK_GENESIS_FILE="" +export NETWORK_NUM_ROUNDS=$NETWORK_NUM_ROUNDS +export NODE_ARCHIVAL="$NODE_ARCHIVAL" +export INDEXER_URL="$INDEXER_URL" +export INDEXER_BRANCH="$INDEXER_BRANCH" +export INDEXER_SHA="$INDEXER_SHA" +export INDEXER_DISABLED="" +export INDEXER_ENABLE_ALL_PARAMETERS="false" diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index d502adba..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,154 +0,0 @@ -version: '3' - -services: - algod: - image: "sdk-harness-algod" - container_name: sdk-harness-algod - build: - context: . - dockerfile: "./docker/algod/${TYPE:-channel}/Dockerfile" - args: - # This is used with TYPE="channel" to override the channel. - CHANNEL: "${CHANNEL:-nightly}" - - # Set network template file to dev mode network if it is not manually set. - NETWORK_TEMPLATE_PATH: "/tmp/network_config/${NETWORK_TEMPLATE:-DevModeNetwork.json}" - - # This is used with TYPE="source" to override the git information. - URL: "${ALGOD_URL:-https://github.com/algorand/go-algorand}" - BRANCH: "${ALGOD_BRANCH:-master}" - ports: - - 60001:60001 - - 60000:60000 - networks: - - sdk-harness - volumes: - - genesis-file:/genesis-file - - # Live indexer instance connected to algod - indexer-live: - image: "sdk-harness-indexer-live" - container_name: sdk-harness-indexer-live - build: - context: . - dockerfile: ./docker/indexer/Dockerfile - args: - # allow override of the git information. - URL: "${INDEXER_URL:-https://github.com/algorand/indexer}" - BRANCH: "${INDEXER_BRANCH:-develop}" - ports: - - 60002:8980 - restart: unless-stopped - networks: - - sdk-harness - environment: - TYPE: "live" - CONNECTION_STRING: "host=indexer-db port=5432 user=algorand password=harness dbname=live sslmode=disable" - volumes: - - genesis-file:/genesis-file - - # Applications Branch using dataset1 - indexer-221-1: - image: "sdk-harness-indexer-release" - container_name: sdk-harness-indexer-release - build: - context: . - dockerfile: ./docker/indexer/Dockerfile - args: - URL: "https://github.com/algorand/indexer" - BRANCH: "master" - SHA: "a30878e3669310c30a2b916fb41511516b906c9a" - ports: - - 59999:8980 - restart: unless-stopped - networks: - - sdk-harness - environment: - TYPE: "snapshot" - SNAPSHOT_FILE: /tmp/dataset1.tar.bz2 - CONNECTION_STRING: "host=indexer-db port=5432 user=algorand password=harness dbname=dataset1 sslmode=disable" - - # Applications Branch using dataset2 - indexer-221-2: - image: "sdk-harness-indexer-applications" - container_name: sdk-harness-indexer-applications - build: - context: . - dockerfile: ./docker/indexer/Dockerfile - args: - URL: "https://github.com/algorand/indexer" - BRANCH: "master" - SHA: "a30878e3669310c30a2b916fb41511516b906c9a" - ports: - - 59998:8980 - restart: unless-stopped - networks: - - sdk-harness - environment: - TYPE: "snapshot" - SNAPSHOT_FILE: /tmp/dataset2.tar.bz2 - CONNECTION_STRING: "host=indexer-db port=5432 user=algorand password=harness dbname=dataset2 sslmode=disable" - - # Create/Delete/Rewards Branch using dataset1 - indexer-23x-1: - image: "sdk-harness-indexer-23x-1" - container_name: sdk-harness-indexer-23x-1 - build: - context: . - dockerfile: ./docker/indexer/Dockerfile - args: - URL: "https://github.com/algorand/indexer" - # TODO: Set back to master when include-all makes it to master. - BRANCH: "develop" - SHA: "cf93e3acacdf6fde9afd0b6b24fa0fde723ff43b" - ports: - - 59997:8980 - restart: unless-stopped - networks: - - sdk-harness - environment: - TYPE: "snapshot" - SNAPSHOT_FILE: /tmp/dataset1.tar.bz2 - CONNECTION_STRING: "host=indexer-db port=5432 user=algorand password=harness dbname=dataset1_2 sslmode=disable" - - # Create/Delete/Rewards Branch using dataset2 - indexer-23x-2: - image: "sdk-harness-indexer-23x-2" - container_name: sdk-harness-indexer-23x-2 - build: - context: . - dockerfile: ./docker/indexer/Dockerfile - args: - URL: "https://github.com/algorand/indexer" - # TODO: Set back to master + SHA when include-all makes it to master. - BRANCH: "develop" - SHA: "cf93e3acacdf6fde9afd0b6b24fa0fde723ff43b" - ports: - - 59996:8980 - restart: unless-stopped - networks: - - sdk-harness - environment: - TYPE: "snapshot" - SNAPSHOT_FILE: /tmp/dataset2.tar.bz2 - CONNECTION_STRING: "host=indexer-db port=5432 user=algorand password=harness dbname=dataset2_2 sslmode=disable" - - indexer-db: - image: "postgres" - container_name: sdk-harness-postgres - volumes: - - ./docker/indexer/init-scripts:/docker-entrypoint-initdb.d - ports: - - 65432:5432 - networks: - - sdk-harness - environment: - POSTGRES_USER: algorand - POSTGRES_PASSWORD: harness - POSTGRES_MULTIPLE_DATABASES: live, dataset1, dataset2, dataset1_2, dataset2_2 - -networks: - sdk-harness: - -volumes: - genesis-file: diff --git a/docker/algod/channel/Dockerfile b/docker/algod/channel/Dockerfile deleted file mode 100644 index 2d97d437..00000000 --- a/docker/algod/channel/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM ubuntu:20.04 - -ARG CHANNEL=nightly -ENV BIN_DIR="$HOME/node" -ARG NETWORK_TEMPLATE_PATH - -ENV DEBIAN_FRONTEND noninteractive - -RUN echo "Installing from channel: ${CHANNEL}" - -# Basic dependencies. -ENV HOME /opt -RUN apt-get update && apt-get install -y apt-utils curl git git-core bsdmainutils python3 - -# Copy everything into the container. -COPY . /tmp - -# Install algod binaries from a channel. -RUN python3 /tmp/docker/algod/setup.py install \ - --bin-dir "${BIN_DIR}" \ - --channel "${CHANNEL}" - -RUN python3 /tmp/docker/algod/setup.py configure \ - --bin-dir "${BIN_DIR}" \ - --network-dir /opt/testnetwork \ - --network-template "$NETWORK_TEMPLATE_PATH" \ - --network-token aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ - --algod-port 60000 \ - --kmd-port 60001 - - -# Start algod -CMD ["/usr/bin/env", "bash", "-c", "python3 /tmp/docker/algod/setup.py start --bin-dir \"$BIN_DIR\" --network-dir \"/opt/testnetwork\" --copy-genesis-to \"/genesis-file\""] diff --git a/docker/algod/setup.py b/docker/algod/setup.py deleted file mode 100755 index ae858e86..00000000 --- a/docker/algod/setup.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import os -import pprint -import shutil -import subprocess -import tarfile -import time -import json -import urllib.request -from os.path import expanduser, join - -parser = argparse.ArgumentParser(description='Install, configure, and start algod.') - -# Shared parameters -base_parser = argparse.ArgumentParser(add_help=False) -base_parser.add_argument('--bin-dir', required=True, help='Location to install algod binaries.') - -subparsers = parser.add_subparsers() - -install = subparsers.add_parser('install', parents=[base_parser], help='Install the binaries.') -install.add_argument('--channel', required=True, help='Channel to install, nightly and beta are good options.') - -configure = subparsers.add_parser('configure', parents=[base_parser], help='Configure private network for SDK.') -configure.add_argument('--network-template', required=True, help='Path to private network template file.') -configure.add_argument('--network-token', required=True, help='Valid token to use for algod/kmd.') -configure.add_argument('--algod-port', required=True, help='Port to use for algod.') -configure.add_argument('--kmd-port', required=True, help='Port to use for kmd.') -configure.add_argument('--network-dir', required=True, help='Path to create network.') - -start = subparsers.add_parser('start', parents=[base_parser], help='Start the network.') -start.add_argument('--network-dir', required=True, help='Path to create network.') -start.add_argument('--copy-genesis-to', required=False, help='Copy the genesis to a given folder.') - -pp = pprint.PrettyPrinter(indent=4) - -def install_algod_binaries(bin_dir, channel): - """ - Download and install algod. - """ - home = expanduser('~') - os.makedirs("%s/inst" % home, exist_ok=True) - print('downloading updater...') - url='https://algorand-releases.s3.amazonaws.com/channel/stable/install_stable_linux-amd64_3.8.0.tar.gz' - updater_tar='%s/inst/installer.tar.gz' % home - filedata = urllib.request.urlretrieve(url, updater_tar) - tar = tarfile.open(updater_tar) - tar.extractall(path='%s/inst' % home) - subprocess.check_call(['%s/inst/update.sh -i -c %s -p %s -d %s/data -n' % (home, channel, bin_dir, bin_dir)], shell=True) - - -def algod_directories(network_dir): - """ - Compute data/kmd directories. - """ - data_dir=join(network_dir, 'Node') - - kmd_dir = [filename for filename in os.listdir(data_dir) if filename.startswith('kmd')][0] - kmd_dir=join(data_dir, kmd_dir) - - return data_dir, kmd_dir - - -def create_network(bin_dir, network_dir, template, token, algod_port, kmd_port): - """ - Create a private network. - """ - # Reset network dir before creating a new one. - if os.path.exists(args.network_dir): - shutil.rmtree(args.network_dir) - - # $BIN_DIR/goal network create -n testnetwork -r $NETWORK_DIR -t network_config/$TEMPLATE - subprocess.check_call(['%s/goal network create -n testnetwork -r %s -t %s' % (bin_dir, network_dir, template)], shell=True) - node_dir, kmd_dir = algod_directories(network_dir) - - # Set tokens - with open(join(node_dir, 'algod.token'), 'w') as f: - f.write(token) - with open(join(kmd_dir, 'kmd.token'), 'w') as f: - f.write(token) - - # Setup config, inject port - with open(join(node_dir, 'config.json'), 'w') as f: - f.write('{ "GossipFanout": 1, "EndpointAddress": "0.0.0.0:%s", "DNSBootstrapID": "", "IncomingConnectionsLimit": 0, "Archival":true, "isIndexerActive":true, "EnableDeveloperAPI":true}' % algod_port) - with open(join(kmd_dir, 'kmd_config.json'), 'w') as f: - f.write('{ "address":"0.0.0.0:%s", "allowed_origins":["*"]}' % kmd_port) - - -def start_network(bin_dir, network_dir): - """ - # $BIN_DIR/goal network start -r $NETWORK_DIR - - kmd start runs forever, so this command never returns. - """ - data_dir, kmd_dir = algod_directories(network_dir) - subprocess.check_call(['%s/goal network start -r %s' % (bin_dir, network_dir)], shell=True) - subprocess.check_call(['%s/kmd start -t 0 -d %s' % (bin_dir, kmd_dir)], shell=True) - - -def install_handler(args): - """ - install subcommand - create and configure the network. - """ - install_algod_binaries(args.bin_dir, args.channel) - -def configure_handler(args): - """ - configure subcommand - configure a private network using the installed binaries. - """ - create_network(args.bin_dir, args.network_dir, args.network_template, args.network_token, args.algod_port, args.kmd_port) - - -def start_handler(args): - """ - start subcommand - start algod + kmd - """ - # Optionally copy the genesis file to shared location before starting. - if args.copy_genesis_to is not None: - print('copying genesis file...') - node_dir, _ = algod_directories(args.network_dir) - genesis_file = join(node_dir, 'genesis.json') - dest = join(args.copy_genesis_to, 'genesis.json') - shutil.copyfile(genesis_file, dest) - else: - print('Not copying genesis file...') - - start_network(args.bin_dir, args.network_dir) - - -if __name__ == '__main__': - install.set_defaults(func=install_handler) - configure.set_defaults(func=configure_handler) - start.set_defaults(func=start_handler) - - args = parser.parse_args() - args.func(args) diff --git a/docker/algod/source/Dockerfile b/docker/algod/source/Dockerfile deleted file mode 100644 index 5775058e..00000000 --- a/docker/algod/source/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM golang:1.17 - -ARG URL=https://github.com/algorand/go-algorand -ARG BRANCH=master -ARG NETWORK_TEMPLATE_PATH - -RUN echo "Installing from source. ${URL} -- ${BRANCH}" -ENV BIN_DIR="$GOPATH/bin" - -ENV DEBIAN_FRONTEND noninteractive - -# Basic dependencies. -ENV HOME /opt -RUN apt-get update && apt-get install -y apt-utils curl git git-core bsdmainutils python3 - -# Copy everything into the container. -COPY . /tmp - -# Install algod binaries. -RUN git clone --single-branch --branch "${BRANCH}" "${URL}" && \ - cd go-algorand && \ - ./scripts/configure_dev.sh && \ - make install - -# Configure private network -RUN python3 /tmp/docker/algod/setup.py configure \ - --bin-dir "$BIN_DIR" \ - --network-dir /opt/testnetwork \ - --network-template "$NETWORK_TEMPLATE_PATH" \ - --network-token aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ - --algod-port 60000 \ - --kmd-port 60001 - -# Start algod -CMD ["/usr/bin/env", "bash", "-c", "python3 /tmp/docker/algod/setup.py start --bin-dir \"$BIN_DIR\" --network-dir \"/opt/testnetwork\" --copy-genesis-to \"/genesis-file\""] diff --git a/docker/indexer/Dockerfile b/docker/indexer/Dockerfile deleted file mode 100644 index 0ebe03ae..00000000 --- a/docker/indexer/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM golang:1.17-alpine - -ARG URL=https://github.com/algorand/indexer -ARG BRANCH=master -ARG SHA="" - -RUN echo "Installing from source. ${URL} -- ${BRANCH} -- ${SHA}" - -RUN apk update && apk add --no-cache --update \ - alpine-sdk git bzip2 make bash libtool autoconf automake boost-dev musl-dev - -# Install indexer binaries. -RUN git clone --single-branch --branch "${BRANCH}" "${URL}" /opt/indexer -ENV HOME /opt/indexer -WORKDIR /opt/indexer -RUN if [ "${SHA}" != "" ]; then echo "Checking out ${SHA}" && git checkout "${SHA}"; fi -RUN make -RUN cp cmd/algorand-indexer/algorand-indexer /tmp - -ENV DEBIAN_FRONTEND noninteractive - -COPY docker/indexer/setup.sh /tmp/setup.sh -COPY docker/indexer/data/* /tmp/ - -RUN ls -lh /tmp - -CMD ["/tmp/setup.sh"] diff --git a/docker/indexer/data/dataset1.tar.bz2 b/docker/indexer/data/dataset1.tar.bz2 deleted file mode 100644 index 03baa8c8..00000000 Binary files a/docker/indexer/data/dataset1.tar.bz2 and /dev/null differ diff --git a/docker/indexer/data/dataset2.tar.bz2 b/docker/indexer/data/dataset2.tar.bz2 deleted file mode 100644 index 61ffae3a..00000000 Binary files a/docker/indexer/data/dataset2.tar.bz2 and /dev/null differ diff --git a/docker/indexer/e2edata.tar.bz2 b/docker/indexer/e2edata.tar.bz2 deleted file mode 100644 index 03baa8c8..00000000 Binary files a/docker/indexer/e2edata.tar.bz2 and /dev/null differ diff --git a/docker/indexer/init-scripts/create-multiple-postgresql-databases.sh b/docker/indexer/init-scripts/create-multiple-postgresql-databases.sh deleted file mode 100755 index 68977f0f..00000000 --- a/docker/indexer/init-scripts/create-multiple-postgresql-databases.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# source: https://github.com/mrts/docker-postgresql-multiple-databases - -set -e -set -u - -function create_user_and_database() { - local database=$1 - echo " Creating user and database '$database'" - psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL - CREATE USER $database; - CREATE DATABASE $database; - GRANT ALL PRIVILEGES ON DATABASE $database TO $database; -EOSQL -} - -if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then - echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES" - for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do - create_user_and_database $db - done - echo "Multiple databases created" -fi diff --git a/docker/indexer/setup.sh b/docker/indexer/setup.sh deleted file mode 100755 index e0c513b0..00000000 --- a/docker/indexer/setup.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -# Start indexer daemon. There are various configurations controlled by -# environment variables. -# -# Configuration: -# TYPE [snapshot] - load a snapshot, start indexer in readonly mode. -# [live ] - connect to an existing algod instance. -# CONNECTION_STRING - the postgres connection string to use. -# SNAPSHOT_FILE - snapshot to import. -# -# Volume: -# /genesis-file/genesis.json - Must be mounted when connecting to algod. -set -e - - -TYPE="${TYPE:-snapshot}" - -start_with_algod() { - echo "Starting indexer against algod." - - /tmp/algorand-indexer daemon \ - --algod-net "algod:60000" \ - --algod-token aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ - --genesis "/genesis-file/genesis.json" \ - -P "$CONNECTION_STRING" -} - -import_and_start_readonly() { - echo "Starting indexer with DB." - - # Extract the correct dataset - ls -lh /tmp - echo "Extracting ${SNAPSHOT_FILE}" - tar -xf "${SNAPSHOT_FILE}" -C /tmp - - /tmp/algorand-indexer import \ - -P "$CONNECTION_STRING" \ - --genesis "/tmp/algod/genesis.json" \ - /tmp/blocktars/* - - /tmp/algorand-indexer daemon -P "$CONNECTION_STRING" -} - -case $TYPE in - live) start_with_algod ;; - snapshot) import_and_start_readonly ;; - *) echo "Unknown setup type: $TYPE" && help && exit 1 ;; -esac - -sleep infinity diff --git a/docs/SDK Test Environment.drawio b/docs/SDK Test Environment.drawio index 0e3fefe0..0293522a 100644 --- a/docs/SDK Test Environment.drawio +++ b/docs/SDK Test Environment.drawio @@ -1 +1,105 @@ -7Vrbcts2EP0azyQP7vBu6TGW3dSZpE3rTOs8dWASphiThAJCtpSvL0AAvACQKEuUqMbyeGxgCRLk2bMXAHvmTrLFewxm008ogumZY0WLM/fqzHHG9oj+ZYIlF4zcgAtinERcZNeC2+QHFEJLSOdJBIvWQIJQSpJZWxiiPIchackAxui5PewBpe1ZZyCGmuA2BKku/SeJyFR8hW/V8t9gEk/lzLYlrmRADhaCYgoi9NwQuddn7gQjRHgrW0xgyrCTuPD7fl1xtXoxDHOyyQ1fJ5Pvz+Ns9On9uROd3938+fftp3OHP+UJpHPxwVcofISY6iGi8i+wIPTfdf6UYJRnbCb+LWQpASJwQae/nJIspQKbNguC0SOcoBRhKslRTkdePiRpqohAmsQ57Yb0sZDKL58gJgmF/p24kCVRxKa5fJ4mBN7OQMjmfKY8ozKM5nkE2bdZtKeDIfBhz4SLhkiA8x6iDBK8pEPEVXcsFCWYWinuuda7EwjZtKFzOQ4IqsXVo2tt0IZQyAuU42rKAWmMqF6ClEF+j2krJuXXByBjoPC/+oDHLNIUZwK1oUVQzLg9PSQLBnMfEHu+AvFIh3hkQHi0L4Q9DWENJphH75gfqXkbgWJaEs828V56CWcdZDBqeR0dsAYgvgEQKcMwBSR5avsqE0pihs8oYSZcUT5o6+PCV4Au0ByHUNzV9C0dD3I85UEE4BgS7UGl0qrP3l6PvqZH4bn+muckyeBr8WG20+3DbJOF7c2HBZpmPqOCxJjGdFULNEDOWDNcpgmFBa8AraGle47fx/tKAMLHuET1jzmhT4FC3gO0vkLxwNehNUWHvfku+QlNX0Xdyq3oIkymKEY5SK9r6WUt/YjQTKDzDRKyFKkXmBO0zq3ZLdquxZY7jzVfMObjuG/o5lCn03yZN6ReHSwbA2bMORWrnWVgtQngt/Mt2uBP7NWxjTXzuaHQLyDWY/ybDBTUB72VV4oZyFv0CL7PWa55GXIX9o4hFt+DN/Qz6C99P8vYesuaTM00ec7J+QPIknTJb89QjorSOltDipJKbIA1W9Tz1tmKr64XfAoJk5bZcNWTEPklSFRyxdrsxXyGik+h7xprV2MlQ7d6jFM/hquiuiIyMr8EnUpLhfjll7Je2WZZGevI/6uHl3manIlrrpqp4QuZrPSG7J7SVJnE5pPwvI0JeOYmZxSvzx3eJgBVlypsalvzmVlUI71RDaa1bMDWlHM/WV1rXhL+0niNmmcljxvzq5oru5X6msI2qcQ4jX3caKiRcruRVD2+pNkbOmk2Jcn7CDwUMry8Y8nRL67sfi27ll0JrhYie+K9pejpQau8/pmubCkILLcoh/UVyeRuxeFD2U6alK+9UXiJ4BNM0ewUX07x5RRffuL44g8eXywNlu740l5K97LMqeNPO/pc+B3BZ4c44m0YR9zjiiP6PhpdLVn6ArWtpQ6y98Bt121zu+p3LNr3th0ij0MOy224SMhdo8157ItezWLWWTYpfaemW/xOdzTqMAFjtqWb2A6WEvw/LUXfD2OWonu8wS1FWu9QluJ4W1hKOMdPVTq/05KjTfguj98nsx13Q2aPj4rZjn5a5Y/pz9Ex27cHjgHOxWtltr8hs6WGjoXa+vESo7YeyoemdjA4tXVzfyXUHm1I7ePaAJKv3WS257rHR2zDmnRfxP6W/e7N7z98//Yn/dof44fzD1/+lWo73Jbny6hs2sdUKLYdr11Zc9XpsoMdebzVmZyj8MQbKzVQHeNd21aosdsZnpE724T718UdbxDueC/kjjLe9fo9/zVyZ5vtgp+VO0aABikFcNQjuS7qqON7Lh0wIrNNKvazUmfNivXg3Ll4IXeU8X2XnZitapst+NdFHn8Q8gQvJI9atHaImiWJoV6NeYUpMthYv6yeNt9cXfPz4cnHG94IUU5AkpcVTgo3Bzg1s9XM01AOeNhSZh113Ya1WuaVB2DuTsthzzHapI7mYeqctbJYtTx50zrnwOt40J7rnCWuDSWnKATpFDH7Uo1oRj2yxoGhl/KmkmTTUl5Ftj9D0Teq92YonWHkZCg7G4oxgdnm8KidVBwwmzFSoNPxrl4ObbBscsws633Xcd1LKmeguhVu4ao0v2SAcWNX5R1wO90IlL4Ru+9Cy3F9si+O+rvIu3FdZS/8djb0q4Ms7fz1y/zO8a41Uiizh6WdnkGsLvlMKVSnes9Tveep3tM9qnrPnaKcWu/p7q/e80yA1XBgNUzu9X8= \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/SDK Test Environment.png b/docs/SDK Test Environment.png index b3ac5bcf..a86021b0 100644 Binary files a/docs/SDK Test Environment.png and b/docs/SDK Test Environment.png differ diff --git a/features/integration/algod.feature b/features/integration/algod.feature index 9a3f559c..c3216c0b 100644 --- a/features/integration/algod.feature +++ b/features/integration/algod.feature @@ -20,8 +20,6 @@ Feature: Algod Given a kmd client And wallet information Then I get transactions by address and round - And I get transactions by address only - And I get transactions by address and date Scenario: Getting transaction by ID Given a kmd client @@ -30,19 +28,10 @@ Feature: Algod When I get the private key And I sign the transaction with the private key And I send the transaction - Then I can get the transaction by ID Scenario: Get pending transactions Then I get pending transactions - Scenario Outline: Get Transactions By Address and Limit Count - Given a kmd client - And wallet information - When I get recent transactions, limited by transactions - Examples: - | cnt | - | 0 | - | 1 | Scenario: Suggested params When I get the suggested params diff --git a/features/integration/compile.feature b/features/integration/compile.feature index 6a5547b2..52356038 100644 --- a/features/integration/compile.feature +++ b/features/integration/compile.feature @@ -4,28 +4,28 @@ Feature: Compile @compile Scenario Outline: Compile programs - When I compile a teal program - Then it is compiled with and and + When I compile a teal program "" + Then it is compiled with and "" and "" Examples: - | program | status | result | hash | - | "programs/one.teal" | 200 | "AiABASI=" | "YOE6C22GHCTKAN3HU4SE5PGIPN5UKXAJTXCQUPJ3KKF5HOAH646MKKCPDA" | - | "programs/invalid.teal" | 400 | "" | "" | + | program | status | result | hash | + | programs/one.teal | 200 | AiABASI= | YOE6C22GHCTKAN3HU4SE5PGIPN5UKXAJTXCQUPJ3KKF5HOAH646MKKCPDA| + | programs/invalid.teal | 400 | | | @compile Scenario Outline: Teal compiles to its associated binary - When I compile a teal program - Then base64 decoding the response is the same as the binary + When I compile a teal program "" + Then base64 decoding the response is the same as the binary "" Examples: - | teal | program | - | "programs/one.teal" | "programs/one.teal.tok" | - | "programs/zero.teal" | "programs/zero.teal.tok" | - | "programs/abi_method_call.teal" | "programs/abi_method_call.teal.tok" | + | teal | program | + | programs/one.teal | programs/one.teal.tok | + | programs/zero.teal | programs/zero.teal.tok | + | programs/abi_method_call.teal | programs/abi_method_call.teal.tok | @compile.sourcemap Scenario Outline: Algod compiling Teal returns a valid Source Map - When I compile a teal program with mapping enabled - Then the resulting source map is the same as the json + When I compile a teal program "" with mapping enabled + Then the resulting source map is the same as the json "" Examples: - | teal | sourcemap | - | "programs/quine.teal" | "v2algodclient_responsejsons/sourcemap.json" | \ No newline at end of file + | teal | sourcemap | + | programs/quine.teal | v2algodclient_responsejsons/sourcemap2.json | \ No newline at end of file diff --git a/features/integration/dryrun.feature b/features/integration/dryrun.feature index 6e4296d0..9b071645 100644 --- a/features/integration/dryrun.feature +++ b/features/integration/dryrun.feature @@ -4,11 +4,11 @@ Feature: Dryrun Given an algod v2 client Scenario Outline: Dryrun execution with binary and source programs - When I dryrun a program - Then I get execution result + When I dryrun a "" program "" + Then I get execution result "" Examples: - | program | kind | result | - | "programs/one.teal.tok" | "compiled" | "PASS" | - | "programs/zero.teal.tok" | "compiled" | "REJECT" | - | "programs/one.teal" | "source" | "PASS" | - | "programs/zero.teal" | "source" | "REJECT" | + | program | kind | result | + | programs/one.teal.tok | compiled | PASS | + | programs/zero.teal.tok | compiled | REJECT | + | programs/one.teal | source | PASS | + | programs/zero.teal | source | REJECT | diff --git a/features/integration/dryrun_testing.feature b/features/integration/dryrun_testing.feature index 3e06b00b..f02ad8d3 100644 --- a/features/integration/dryrun_testing.feature +++ b/features/integration/dryrun_testing.feature @@ -4,47 +4,47 @@ Feature: Dryrun Testing Given an algod v2 client Scenario Outline: Dryrun test case with simple assert - Given dryrun test case with of type - Then status assert of is succeed + Given dryrun test case with "" of type "" + Then status assert of "" is succeed Examples: - | program | kind | status | - | "programs/one.teal.tok" | "lsig" | "PASS" | - | "programs/one.teal.tok" | "approv" | "PASS" | - | "programs/one.teal.tok" | "clearp" | "PASS" | - | "programs/zero.teal.tok" | "lsig" | "REJECT" | - | "programs/zero.teal.tok" | "approv" | "REJECT" | - | "programs/zero.teal.tok" | "clearp" | "REJECT" | - | "programs/one.teal" | "lsig" | "PASS" | - | "programs/one.teal" | "approv" | "PASS" | - | "programs/one.teal" | "clearp" | "PASS" | - | "programs/zero.teal" | "lsig" | "REJECT" | - | "programs/zero.teal" | "approv" | "REJECT" | - | "programs/zero.teal" | "clearp" | "REJECT" | + | program | kind | status | + | programs/one.teal.tok | lsig | PASS | + | programs/one.teal.tok | approv | PASS | + | programs/one.teal.tok | clearp | PASS | + | programs/zero.teal.tok | lsig | REJECT | + | programs/zero.teal.tok | approv | REJECT | + | programs/zero.teal.tok | clearp | REJECT | + | programs/one.teal | lsig | PASS | + | programs/one.teal | approv | PASS | + | programs/one.teal | clearp | PASS | + | programs/zero.teal | lsig | REJECT | + | programs/zero.teal | approv | REJECT | + | programs/zero.teal | clearp | REJECT | Scenario Outline: Dryrun test case with global state delta assert succeed - Given dryrun test case with of type - Then global delta assert with , and is succeed + Given dryrun test case with "" of type "" + Then global delta assert with "", "" and is succeed Examples: - | program | kind | key | action | value | - | "programs/globalwrite.teal" | "approv" | "Ynl0ZXNrZXk=" | 1 | "dGVzdA==" | - | "programs/globalwrite.teal" | "approv" | "aW50a2V5" | 2 | "11" | - | "programs/globalwrite.teal" | "clearp" | "Ynl0ZXNrZXk=" | 1 | "dGVzdA==" | - | "programs/globalwrite.teal" | "clearp" | "aW50a2V5" | 2 | "11" | + | program | kind | key | action | value | + | programs/globalwrite.teal | approv | Ynl0ZXNrZXk= | 1 | dGVzdA== | + | programs/globalwrite.teal | approv | aW50a2V5 | 2 | 11 | + | programs/globalwrite.teal | clearp | Ynl0ZXNrZXk= | 1 | dGVzdA== | + | programs/globalwrite.teal | clearp | aW50a2V5 | 2 | 11 | Scenario Outline: Dryrun test case with global state delta assert failed - Given dryrun test case with of type - Then global delta assert with , and is failed + Given dryrun test case with "" of type "" + Then global delta assert with "", "" and is failed Examples: - | program | kind | key | action | value | - | "programs/globalwrite.teal" | "clearp" | "Ynl0ZXNrZXk=" | 1 | "test" | - | "programs/globalwrite.teal" | "approv" | "aW50a2V5" | 2 | "12" | + | program | kind | key | action | value| + | programs/globalwrite.teal | clearp | Ynl0ZXNrZXk= | 1 | test | + | programs/globalwrite.teal | approv | aW50a2V5 | 2 | 12 | Scenario Outline: Dryrun test case with local state delta assert succeed - Given dryrun test case with of type - Then local delta assert for of accounts with , and is succeed + Given dryrun test case with "" of type "" + Then local delta assert for "" of accounts with "", "" and is succeed Examples: - | program | kind | addr | index | key | action | value | - | "programs/localwrite.teal" | "approv" | "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ" | 0 | "Ynl0ZXNrZXk=" | 1 | "dGVzdA==" | - | "programs/localwrite.teal" | "approv" | "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ" | 0 | "aW50a2V5" | 2 | "11" | - | "programs/localwrite.teal" | "clearp" | "6Z3C3LDVWGMX23BMSYMANACQOSINPFIRF77H7N3AWJZYV6OH6GWTJKVMXY" | 1 | "Ynl0ZXNrZXk=" | 1 | "dGVzdA==" | - | "programs/localwrite.teal" | "clearp" | "6Z3C3LDVWGMX23BMSYMANACQOSINPFIRF77H7N3AWJZYV6OH6GWTJKVMXY" | 1 | "aW50a2V5" | 2 | "11" | + | program | kind | addr | index | key | action | value | + | programs/localwrite.teal | approv | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ | 0 | Ynl0ZXNrZXk= | 1 | dGVzdA== | + | programs/localwrite.teal | approv | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ | 0 | aW50a2V5 | 2 | 11 | + | programs/localwrite.teal | clearp | 6Z3C3LDVWGMX23BMSYMANACQOSINPFIRF77H7N3AWJZYV6OH6GWTJKVMXY | 1 | Ynl0ZXNrZXk= | 1 | dGVzdA== | + | programs/localwrite.teal | clearp | 6Z3C3LDVWGMX23BMSYMANACQOSINPFIRF77H7N3AWJZYV6OH6GWTJKVMXY | 1 | aW50a2V5 | 2 | 11 | diff --git a/features/integration/evaldelta.feature b/features/integration/evaldelta.feature deleted file mode 100644 index c0fbe1ab..00000000 --- a/features/integration/evaldelta.feature +++ /dev/null @@ -1,26 +0,0 @@ -Feature: EvalDelta - # These are optional for the SDKs to implement because - # their primary purpose is testing algod / indexer - - Background: - Given a kmd client - And wallet information - And an algod v2 client connected to "localhost" port 60000 with token "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - And I create a new transient account and fund it with 100000000 microalgos. - And indexer client 3 at "localhost" port 60002 with token "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - - @applications.evaldelta - Scenario Outline:Set '' in state - # Create app - Given I build an application transaction with the transient account, the current application, suggested params, operation "create_optin", approval-program "", clear-program "programs/one.teal.tok", global-bytes , global-ints , local-bytes , local-ints , app-args "", foreign-apps "", foreign-assets "", app-accounts "", extra-pages 0 - And I sign and submit the transaction, saving the txid. If there is an error it is "". - Then the unconfirmed pending transaction by ID should have no apply data fields. - And I wait for the transaction to be confirmed. - Then the confirmed pending transaction by ID should have a "" state change for "Zm9v" to "", indexer 3 should also confirm this. - - Examples: - | program | state-location | global-bytes | global-ints | local-bytes | local-ints | arg | value | - | programs/globwrite.teal.tok | global | 1 | 0 | 0 | 0 | str:hello | aGVsbG8= | - | programs/globwrite_int.teal.tok | global | 0 | 1 | 0 | 0 | int:90000 | 90000 | - | programs/locwrite.teal.tok | local | 0 | 0 | 1 | 0 | str:hello | aGVsbG8= | - | programs/locwrite_int.teal.tok | local | 0 | 0 | 0 | 1 | int:90000 | 90000 | diff --git a/features/integration/indexer.feature b/features/integration/indexer.feature deleted file mode 100644 index 859ac1ee..00000000 --- a/features/integration/indexer.feature +++ /dev/null @@ -1,531 +0,0 @@ -Feature: Indexer Integration Tests - - For all queries, parameters will not be set for default values as defined by: - * Numeric inputs: 0 - * String inputs: "" - - Background: - Given indexer client 1 at "localhost" port 59999 with token "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - Given indexer client 2 at "localhost" port 59998 with token "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - # Indexer 2.3.x Dataset 1 - Given indexer client 3 at "localhost" port 59997 with token "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - # Indexer 2.3.x Dataset 2 - Given indexer client 4 at "localhost" port 59996 with token "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - - @indexer - Scenario Outline: /health - When I use to check the services health - Then I receive status code - - Examples: - | indexer | status | - | 1 | 200 | - - # - # /blocks/{round-number} - # - @indexer - Scenario Outline: /blocks/ - When I use to lookup block - Then The block was confirmed at , contains transactions, has the previous block hash "" - - Examples: - | indexer | number | timestamp | num | hash | - | 1 | 7 | 1585684086 | 8 | PpPusF+bU/uNLS5ODG/hG0pP0vehdSSlBcnnyZDr770= | - | 1 | 20 | 1585684138 | 2 | 9jzxFIKLoTGkFl60aqGwyzO0AVyMBnbs/Wb5R9hPrsA= | - | 1 | 100 | 1585684463 | 0 | rEWRbwgzDagT5wYTf9TuiuC+VR3XLLy4S73vInxkmrA= | - - # - # /accounts/{account-id} - # - @indexer - Scenario Outline: has asset - /account/ - When I use to lookup account "" at round 0 - Then The account has assets, the first is asset has a frozen status of "" and amount . - - Examples: - | indexer | account | num | index | frozen | units | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 1 | 9 | false | 999931337000 | - | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | 1 | 9 | false | 68663000 | - - @indexer - Scenario Outline: creator - /account/ - When I use to lookup account "" at round 0 - Then The account created assets, the first is asset is named "" with a total amount of "" - - Examples: - | indexer | account | num | index | name | total | unit | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 1 | 9 | bogocoin | 1000000000000 | bogo | - - @indexer - Scenario Outline: lookup - /account/ - When I use to lookup account "" at round 0 - Then The account has <μalgos> μalgos and assets, 0 has 0 - - Examples: - | indexer | account | μalgos | num | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 999899126000 | 1 | - | 1 | FROJFIFQRARWEHOL6GR3MBFCDJY76CPF3UY55HM3PCK42AD5HA5SKKXLLA | 4992999999993000 | 0 | - - # - # /accounts/{account-id} - at round (rollback test) - # - @indexer - Scenario Outline: rewind - /accounts/{account-id}?round= - When I use to lookup account "" at round - Then The account has <μalgos> μalgos and assets, has - - Examples: - | indexer | account | round | μalgos | num | asset-id | asset-amount | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 351 | 999899126000 | 1 | 9 | 999931337000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 30 | 999899126000 | 1 | 9 | 999931337000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 29 | 999898989000 | 1 | 9 | 999900000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 27 | 999998990000 | 1 | 9 | 999900000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 25 | 999998991000 | 1 | 9 | 1000000000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 21 | 999999992000 | 1 | 9 | 1000000000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 19 | 999998995000 | 1 | 9 | 1000000000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 17 | 999998995000 | 1 | 9 | 999999000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 15 | 999998996000 | 1 | 9 | 1000000000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 11 | 999999997000 | 1 | 9 | 1000000000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 9 | 999899998000 | 1 | 9 | 1000000000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 6 | 999999999000 | 1 | 9 | 1000000000000 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 4 | 1000000000000 | 1 | 9 | 0 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 2 | 0 | 1 | 9 | 0 | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 1 | 0 | 1 | 9 | 0 | - - # - # /assets/{asset-id} - # - @indexer - Scenario Outline: lookup - /assets/ - When I use to lookup asset - Then The asset found has: "", "", "", , "", , "" - - Examples: - | indexer | asset-id | name | units | creator | decimals | default-frozen | total | clawback | - | 1 | 9 | bogocoin | bogo | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 0 | false | 1000000000000 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | - - # - # /assets/{asset-id}/balances - # - @indexer - Scenario Outline: balances - /assets//balances?gt=<=&limit= - When I use to lookup asset balances for with , , and token "" - Then There are with the asset, the first is "" has "" and - - Examples: - | indexer | asset-id | currency-gt | currency-lt | limit | num-accounts | account | is-frozen | amount | - | 1 | 9 | 0 | 0 | 0 | 2 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | false | 999931337000 | - | 1 | 9 | 0 | 0 | 1 | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | false | 999931337000 | - | 1 | 9 | 0 | 0 | 1 | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | false | 999931337000 | - | 1 | 9 | 68663000 | 0 | 0 | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | false | 999931337000 | - | 1 | 9 | 0 | 68663001 | 0 | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | false | 68663000 | - # these pick up deleted asset balances in dataset 1 + 2.3.x. - #| 3 | 9 | 0 | 0 | 0 | 2 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | false | 999931337000 | - #| 3 | 9 | 0 | 0 | 1 | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | false | 999931337000 | - #| 3 | 9 | 0 | 0 | 1 | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | false | 999931337000 | - #| 3 | 9 | 0 | 68663001 | 0 | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | false | 68663000 | - - - @indexer - Scenario Outline: /assets/{asset-id}/balances?next=token - When I use to lookup asset balances for with , , and token "" - And I get the next page using to lookup asset balances for with , , - Then There are with the asset, the first is "" has "" and - - Examples: - | indexer | asset-id | currency-gt | currency-lt | limit | num-accounts | account | is-frozen | amount | - | 1 | 9 | 0 | 0 | 1 | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | false | 68663000 | - # this picks up a deleted asset balance - #| 3 | 9 | 1 | 0 | 1 | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | false | 68663000 | - - ##################### - - # - # /accounts - # - @indexer - Scenario Outline: general - /accounts?asset-id=&limit=>=<= - When I use to search for an account with , , , and token "" - Then There are , the first has , , , , "
", , "", "" - - Examples: - | indexer | asset-id | limit | currency-gt | currency-lt | num | pending-rewards | rewards-base | rewards | without-rewards | address | amount | status | type | - # These changed when adding 'ORDER BY' in the backend - #| 1 | 0 | 0 | 0 | 0 | 32 | 0 | 0 | 0 | 1000000 | XKWNJ6MDJWB5WEIARTAJI6GMCX3ETHBSM4OZ2NYACFEXHQJ2RHTC4SHH5A | 1000000 | Offline | | - #| 1 | 0 | 10 | 0 | 0 | 10 | 0 | 0 | 0 | 1000000 | XKWNJ6MDJWB5WEIARTAJI6GMCX3ETHBSM4OZ2NYACFEXHQJ2RHTC4SHH5A | 1000000 | Offline | | - | 1 | 0 | 0 | 0 | 0 | 32 | 0 | 0 | 0 | 0 | A5QNF7MATDBZHXVYROXVZ6WTWMMDGX5RPEUCYAQEINOS3LQUW7NQGUJ4OI | 0 | Offline | lsig | - | 1 | 0 | 10 | 0 | 0 | 10 | 0 | 0 | 0 | 0 | A5QNF7MATDBZHXVYROXVZ6WTWMMDGX5RPEUCYAQEINOS3LQUW7NQGUJ4OI | 0 | Offline | lsig | - | 1 | 9 | 0 | 68663000 | 0 | 1 | 0 | 0 | 0 | 999899126000 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 999899126000 | Offline | sig | - | 1 | 9 | 0 | 0 | 68663001 | 1 | 0 | 0 | 0 | 998000 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | 998000 | Offline | lsig | - | 1 | 0 | 0 | 798999 | 799001 | 1 | 0 | 0 | 0 | 799000 | RRHDAJKO5HQBLHPCVK6K7U54LENDIP2JKM3RNRYX2G254VUXBRQD35CK4E | 799000 | Offline | msig | - # this picks up a deleted account - | 3 | 9 | 0 | 1 | 68663001 | 1 | 0 | 0 | 0 | 998000 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | 998000 | Offline | lsig | - - # - # /accounts - online - # - @indexer - Scenario Outline: online - /accounts?asset-id=&limit=>=<= - When I use to search for an account with , , , and token "" - Then The first account is online and has "
", , , , "", "" - - Examples: - | indexer | asset-id | limit | currency-gt | currency-lt | address | key-dilution | first-valid | last-valid | vote-key | selection-key | - | 1 | 0 | 0 | 998999 | 999001 | NNFTUMXU5EMDOSFRGQ55TOGOJIS7P7POIDHJTQNQUBVVYJ6GCIPHOMAMQE | 10000 | 0 | 100 | h0wDwh1yhWiWu0S79wEiQaWXnNLCMjcce5MPeWPRQ/Q= | Ob0jBcHd0uh6nMjls6bOHlissWvPlINGiREJ+gaEOSg= | - # These changed when adding 'ORDER BY' in the backend - #| 1 | 0 | 0 | 4992999999992999 | 0 | FROJFIFQRARWEHOL6GR3MBFCDJY76CPF3UY55HM3PCK42AD5HA5SKKXLLA | 10000 | 0 | 3000000 | mQzj8cwerZh1QzdCR9WBteLQ6MQszzLP4MAjSi5wuD4= | NRnpzxRIGUnTICoPloP9eWU1W6OPksR0ReEDRTwzoYg= | - | 1 | 0 | 0 | 4992999999992999 | 0 | BYP7VVRIBDOOFKEYICNYIM43S6DW7RIZC73XNMKF3KT5YUITDDMH3W5D5Q | 10000 | 0 | 3000000 | 9OO2S7ikfESeDZg8Z9mrzdN2Lh52UBSVH9uD7XqQHhs= | BkTjDJB2Su5Fi9uwJTODkxpEjrhCJSYtF10m0ee6THU= | - - - # - # /accounts - paging - # - @indexer - Scenario Outline: paging - /accounts?asset-id=&limit=>=<= - When I use to search for an account with , , , and token "" - Then I get the next page using to search for an account with , , and - Then There are , the first has , , , , "
", , "", "" - - Examples: - | indexer | asset-id | limit | currency-gt | currency-lt | num | pending-rewards | rewards-base | rewards | without-rewards | address | amount | status | type | - | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 149234 | A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE | 149234 | NotParticipating | | - # These changed when adding 'ORDER BY' in the backend - #| 1 | 0 | 10 | 0 | 0 | 10 | 0 | 0 | 0 | 99862000 | M7E3Z6MJ7LZT725IK3ZQ6YE64TUTVU6VPPHFMT3DSD5KRDYRE44BE6GY5A | 99862000 | Offline | lsig | - | 1 | 0 | 10 | 0 | 0 | 10 | 0 | 0 | 0 | 999899996766 | LQU5S7HMDXLQUQD5BKIMPPZYK7LYXPC5AVGIWNVNTBVQHL3GCXFVXZFJ3A | 999899996766 | Offline | sig | - - # - # /accounts - paging multiple times - # - @indexer - Scenario Outline: paging 6 times - /accounts?asset-id=&limit=>=<= - When I use to search for an account with , , , and token "" - Then I get the next page using to search for an account with , , and - Then I get the next page using to search for an account with , , and - Then I get the next page using to search for an account with , , and - Then I get the next page using to search for an account with , , and - Then I get the next page using to search for an account with , , and - Then I get the next page using to search for an account with , , and - Then There are , the first has , , , , "
", , "", "" - - Examples: - | indexer | asset-id | limit | currency-gt | currency-lt | num | pending-rewards | rewards-base | rewards | without-rewards | address | amount | status | type | - | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | GP44P6YCVSRK4IYIEZYDYO5POY3QO5VTATZIMRI6DFLMO2EPK7GBBNQRCM | 0 | Offline | lsig | - | 1 | 0 | 2 | 0 | 0 | 2 | 0 | 0 | 0 | 999000 | NNFTUMXU5EMDOSFRGQ55TOGOJIS7P7POIDHJTQNQUBVVYJ6GCIPHOMAMQE | 999000 | Online | sig | - - # - # /transactions - # When I use to search for transactions with , "", "", "", "", , , , , "", "", , , "
", "", "" and token "" - # - @indexer - Scenario Outline: /transactions?note-prefix - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - - Examples: - | indexer | note-prefix | num | txid | - | 1 | XQ== | 2 | U2KNU7B55LZU6SWX66VHIZMJT4OX6YMNCIKBLV4BLYVTBCU3ZW2A | - | 1 | VA== | 3 | IMFJQCCF5T2DOVSKHP2NHDKV5A2VGVIW24LNQUBDOH33UMIE545Q | - | 1 | 1111 | 0 | | - - @indexer - Scenario Outline: /transactions?tx-type= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction has tx-type "" - - Examples: - | indexer | tx-type | num | txid | - | 1 | pay | 41 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | keyreg | 1 | HG3DLU47GVRCLIG3SIHM6TTWINUN7VOKKAJWZRYZQA4NDO7PNXMA | - | 1 | acfg | 1 | KGG5ZGQQ57Y2ZDH5CFRYMJODPJ4TVIQBAPKT3HK3PIS6A6K4T5GQ | - | 1 | axfer | 6 | IIWBLLEXCFDQQHENIU2JBXSFDNNHLO5C2M5PE3UIHQ3YXN2TWRUA | - | 1 | afrz | 0 | | - - @indexer - Scenario Outline: /transactions?sig-type= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction has sig-type "" - - Examples: - | indexer | sig-type | num | txid | - | 1 | sig | 25 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | lsig | 24 | SPRRY5NZETQFP3C7MHEDURQRUUC5JVESSRXRXVJAHENZ6OJJKMXQ | - | 1 | msig | 0 | | - - @indexer - Scenario Outline: /transactions?tx-id= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - - Examples: - | indexer | num | txid | - | 1 | 0 | DN7MBMCL5JQ3PFUQS7TMX5AH4EEKOBJVDUF4TCV6WERATKFLQF4M | - | 1 | 1 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | 1 | SPRRY5NZETQFP3C7MHEDURQRUUC5JVESSRXRXVJAHENZ6OJJKMXQ | - - @indexer - Scenario Outline: /transactions?round= - When I use to search for transactions with 0, "", "", "", "", , 0, 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction has round - - Examples: - | indexer | round | num | txid | - | 1 | 10 | 2 | TF5YEFGB7AQT4ZXVGBEY76TGV7D2QF4HMSGAVGUJE764ZIGXS3NQ | - | 1 | 22 | 3 | DWSC3DPKFU7TIPMOVJZM25XYBUNJQASGVDYS7QREO33UEA6FYSNA | - | 1 | 30 | 2 | 5UWAFFNPPECDJHAYYRRLE3WIWGO2WVH4LZMPLVQBS4E76UERRATA | - - @indexer - Scenario Outline: /transactions?min-round= - When I use to search for transactions with 0, "", "", "", "", 0, , 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction has round >= - - Examples: - | indexer | min-round | num | txid | - | 1 | 10 | 25 | TF5YEFGB7AQT4ZXVGBEY76TGV7D2QF4HMSGAVGUJE764ZIGXS3NQ | - | 1 | 22 | 10 | DWSC3DPKFU7TIPMOVJZM25XYBUNJQASGVDYS7QREO33UEA6FYSNA | - | 1 | 30 | 2 | 5UWAFFNPPECDJHAYYRRLE3WIWGO2WVH4LZMPLVQBS4E76UERRATA | - - @indexer - Scenario Outline: /transactions?max-round= - When I use to search for transactions with 0, "", "", "", "", 0, 0, , 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction has round <= - - Examples: - | indexer | max-round | num | txid | - | 1 | 10 | 26 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | 22 | 42 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | 30 | 49 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - - @indexer - Scenario Outline: /transactions?asset-id= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, , "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction works with asset-id - - Examples: - | indexer | asset-id | num | txid | - | 1 | 9 | 7 | KGG5ZGQQ57Y2ZDH5CFRYMJODPJ4TVIQBAPKT3HK3PIS6A6K4T5GQ | - - @indexer - Scenario Outline: /transactions?before-time= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction is older than "" - - Examples: - | indexer | before | num | txid | - | 1 | 2020-03-31T19:47:49Z | 0 | | - | 1 | 2020-03-31T19:48:49Z | 35 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | 2021-03-31T19:47:49Z | 49 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - - @indexer - Scenario Outline: /transactions?after-time= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction is newer than "" - - Examples: - | indexer | after | num | txid | - | 1 | 2019-01-01T01:01:01Z | 49 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | 2020-03-31T19:48:49Z | 14 | GLEDN6PCACB6WI72ABZ34CEAIXZCZQ7HLVZI7SLWIR46JHUHXQJA | - | 1 | 2029-01-01T01:01:01Z | 0 | | - - @indexer - Scenario Outline: /transactions?currency-gt=¤cy-lt= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", , , "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction moves between and currency - - Examples: - | indexer | currency-gt | currency-lt | num | txid | - | 1 | 0 | 10 | 2 | TK3KPYVH7CCDMGG4TP66HGQTJKA2ETCECEBEQ4QXFTLQZZR6XVMA | - | 1 | 1 | 0 | 34 | 3LC3FNFWZVKLOSQQLKTTAPHHWKKHEVJDWBVIWAMYP7MNQQHZP5BA | - | 1 | 10000 | 1000000 | 2 | VUOIU472GVEML5AS22TP5GSBIEITZFRZWVXVQQ7UD33QR7A5K3ZA | - - @indexer - Scenario Outline: /transactions?asset-id=¤cy-gt=¤cy-lt= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, , "", "", , , "", "", "" and token "" - Then there are transactions in the response, the first is "". - And Every transaction moves between and currency - - Examples: - | indexer | asset-id | currency-gt | currency-lt | num | txid | - | 1 | 9 | 1 | 0 | 3 | E36LBI7IN5OJGEFWKPCEQ2L436DFYHKAMEMASZXEVMP64F76HVNA | - | 1 | 9 | 0 | 100000000 | 2 | E36LBI7IN5OJGEFWKPCEQ2L436DFYHKAMEMASZXEVMP64F76HVNA | - | 1 | 9 | 1000000 | 100000000 | 1 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - - @indexer - Scenario Outline: account filter /transactions?address=
&address-role=&exclude-close-to= - When I use to search for transactions with 0, "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "
", "", "" and token "" - Then there are transactions in the response, the first is "". - - Examples: - | indexer | address | address-role | exclude-close-to | num | txid | - | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | | | 4 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | sender | | 2 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | receiver | | 3 | 53CGXAKDKMPOXQHMFK5CFZAYP3KJLD3LMG3DFZBVIT6XR7O3ATVA | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | | | 13 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | receiver | | 6 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | receiver | true | 3 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | sender | | 7 | UIMZOGVGZYQQIXIGZ3QJBL3TPP2P5T4GUMMFG5HCA7MFQSPYR6QA | - - # - # /accounts/{account-id}/transactions - same as /transactions but the validation just ensures that all results include the specified account - # - @indexer - Scenario Outline: /accounts//transactions - When I use to search for all "" transactions - Then there are transactions in the response, the first is "". - - Examples: - | indexer | account-id | num | txid | - | 1 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | 13 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - | 1 | ZBBRQD73JH5KZ7XRED6GALJYJUXOMBBP3X2Z2XFA4LATV3MUJKKMKG7SHA | 4 | 3BMTOZIYGTS3XS33MXDZO6UMNUTJOLFC3527ONBCVAHY3IMEWSUA | - - - # - # /assets/{asset-id}/transactions - same as /transactions but the validation just ensures that all results are asset xfer's for the specified asset. - # - @indexer - Scenario Outline: /assets//transactions - When I use to search for all asset transactions - Then there are transactions in the response, the first is "". - - Examples: - | indexer | asset-id | num | txid | - | 1 | 9 | 7 | KGG5ZGQQ57Y2ZDH5CFRYMJODPJ4TVIQBAPKT3HK3PIS6A6K4T5GQ | - - # - # /transaction paging - # - @indexer - Scenario Outline: /transactions?limit=&next=token - When I use to search for transactions with , "", "", "", "", 0, 0, , 0, "", "", 0, 0, "", "", "" and token "" - And I get the next page using to search for transactions with and - And I get the next page using to search for transactions with and - And I get the next page using to search for transactions with and - And I get the next page using to search for transactions with and - Then there are transactions in the response, the first is "". - - Examples: - | indexer | limit | max-round | num | txid | - | 1 | 1 | 10 | 1 | QW2BAFU3JR7YDKDHG6BDAFJZTY7V7XBMZKHUGX2CBUG3PKHGAVMA | - | 1 | 5 | 10 | 5 | KHTHBNR3MVPNVLGMHPDO73N6FL43WBQHPMW2PFY2LQIAQJZF77FA | - - # - # /assets - # - @indexer - Scenario Outline: /assets - When I use to search for assets with 0, , "", "", "", and token "" - Then there are assets in the response, the first is . - - Examples: - | indexer | asset-id-in | creator | name | unit | num | asset-id-out | - | 1 | 0 | | | | 1 | 9 | - | 1 | 8 | | | | 0 | 0 | - | 1 | 9 | | | | 1 | 9 | - | 1 | 0 | | bogocoin | | 1 | 9 | - | 1 | 0 | | BoGoCoIn | | 1 | 9 | - | 1 | 0 | | GoCo | | 1 | 9 | - | 1 | 0 | | | bogo | 1 | 9 | - | 1 | 0 | | | boGO | 1 | 9 | - | 1 | 0 | | | oG | 1 | 9 | - | 1 | 0 | OSY2LBBSYJXOBAO6T5XGMGAJM77JVPQ7OLRR5J3HEPC3QWBTQZNWSEZA44 | | | 1 | 9 | - | 1 | 0 | | none | | 0 | 9 | - - @indexer.applications - Scenario Outline: /applications?id=&limit=&next= - When I use to search for applications with , , and token "" - Then the parsed response should equal "". - - Examples: - | indexer | application-id | limit | token | jsonfile | - | 2 | 22 | 0 | | v2indexerclient_responsejsons/indexer_v2_app_search_22.json | - | 2 | 70 | 0 | | v2indexerclient_responsejsons/indexer_v2_app_search_70.json | - | 2 | 0 | 3 | | v2indexerclient_responsejsons/indexer_v2_app_search_limit_3.json | - | 2 | 0 | 1 | 25 | v2indexerclient_responsejsons/indexer_v2_app_search_next_25.json | - - @indexer.231 - Scenario Outline: /applications?id=&limit=&next= - When I use to search for applications with , , "" and token "" - Then the parsed response should equal "". - Examples: - | indexer | application-id | limit | include-all | token | jsonfile | - | 4 | 22 | 0 | false | | v23x_indexerclient_responsejsons/indexer_v2_app_search_22.json | - | 4 | 70 | 0 | false | | v23x_indexerclient_responsejsons/indexer_v2_app_search_70.json | - | 4 | 0 | 3 | false | | v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3.json | - | 4 | 0 | 1 | false | 25 | v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25.json | - | 4 | 22 | 0 | true | | v23x_indexerclient_responsejsons/indexer_v2_app_search_22_all.json | - | 4 | 70 | 0 | true | | v23x_indexerclient_responsejsons/indexer_v2_app_search_70_all.json | - | 4 | 0 | 3 | true | | v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3_all.json | - | 4 | 0 | 1 | true | 25 | v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25_all.json | - - @indexer.applications - Scenario Outline: /applications/ - When I use to lookup application with - Then the parsed response should equal "". - - Examples: - | indexer | application-id | jsonfile | - | 2 | 22 | v2indexerclient_responsejsons/indexer_v2_app_lookup_22.json | - | 2 | 70 | v2indexerclient_responsejsons/indexer_v2_app_lookup_70.json | - - @indexer.231 - Scenario Outline: /applications/ - When I use to lookup application with and "" - Then the parsed response should equal "". - Examples: - | indexer | application-id | include-all | jsonfile | - | 4 | 22 | false | v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22.json | - | 4 | 70 | false | v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70.json | - | 4 | 22 | true | v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22_all.json | - | 4 | 70 | true | v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70_all.json | - - # - # /transactions - # - @indexer.applications - Scenario Outline: /transactions?everything - #When I use to search for transactions with , "", "", "", "", , , , , "", "", , , "
", "", "", and token "" - When I use to search for transactions with , "", "", "", "", 0, 0, 0, 0, "", "", 0, 0, "", "", "", and token "" - Then the parsed response should equal "". - - Examples: - | indexer | limit | application-id | jsonfile | - | 2 | 0 | 70 | v2indexerclient_responsejsons/indexer_v2_tx_search_app_70.json | - | 2 | 3 | 70 | v2indexerclient_responsejsons/indexer_v2_tx_search_app_70_lim_3.json | - | 4 | 0 | 70 | v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70.json | - | 4 | 3 | 70 | v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70_lim_3.json | - - @indexer.applications - Scenario Outline: /accounts?asset-id=&limit=>=<=&auth-addr=&app-id= - When I use to search for an account with 0, 0, 0, 0, "", and token "" - Then the parsed response should equal "". - - Examples: - | indexer | application-id | jsonfile | - | 2 | 70 | v2indexerclient_responsejsons/indexer_v2_acct_search_app_70.json | - - @indexer.231 - Scenario Outline: /accounts?asset-id=&limit=>=<=&auth-addr=&app-id= - When I use to search for an account with 0, 0, 0, 0, "", , "" and token "" - Then the parsed response should equal "". - Examples: - | indexer | application-id | include-all | jsonfile | - | 4 | 70 | false | v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70.json | - | 4 | 70 | true | v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70_all.json | - - -# Paging tests: -# - assets (our test dataset only has 1 asset) - -# Error/edge cases (mixed up min/max, ...?) -# - No results -# - Invalid parameters (invalid enum) -# - Mixed up min/max diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70.json deleted file mode 100644 index defe7119..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70.json +++ /dev/null @@ -1 +0,0 @@ -{"accounts":[{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","amount":99998099,"amount-without-pending-rewards":99998000,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"Y1g=","value":{"bytes":"","type":1,"uint":0}},{"key":"bWI=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGw=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGc=","value":{"bytes":"","type":1,"uint":0}},{"key":"Ymw=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":14,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-at-round":6,"deleted":false,"pending-rewards":99,"reward-base":0,"rewards":99,"round":57,"sig-type":"sig","status":"Offline"},{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","amount":99990099,"amount-without-pending-rewards":99990099,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"dFg=","value":{"bytes":"","type":1,"uint":0}},{"key":"Zno=","value":{"bytes":"","type":1,"uint":0}},{"key":"bWI=","value":{"bytes":"","type":1,"uint":0}},{"key":"Ymw=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":12,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-at-round":4,"deleted":false,"pending-rewards":0,"reward-base":1,"rewards":99,"round":57,"sig-type":"sig","status":"Offline"},{"address":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","amount":99998099,"amount-without-pending-rewards":99998099,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"Ymw=","value":{"bytes":"","type":1,"uint":0}},{"key":"bWI=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGw=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGc=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":16,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-at-round":8,"deleted":false,"pending-rewards":0,"reward-base":1,"rewards":99,"round":57,"sig-type":"sig","status":"Offline"},{"address":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","amount":999700986699,"amount-without-pending-rewards":999700986699,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"Y1g=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":10,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-apps":[{"created-at-round":10,"deleted":false,"id":70,"params":{"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","creator":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","global-state":[{"key":"cnY=","value":{"bytes":"","type":1,"uint":0}},{"key":"dHQ=","value":{"bytes":"","type":1,"uint":0}},{"key":"cHg=","value":{"bytes":"","type":2,"uint":0}},{"key":"AAEAAAAAAAAAAQAAAAAAAAAC","value":{"bytes":"","type":1,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7}}}],"created-at-round":2,"deleted":false,"pending-rewards":0,"reward-base":1,"rewards":999699,"round":57,"sig-type":"sig","status":"Offline"}],"current-round":57,"next-token":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70_all.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70_all.json deleted file mode 100644 index defe7119..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_acct_search_app_70_all.json +++ /dev/null @@ -1 +0,0 @@ -{"accounts":[{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","amount":99998099,"amount-without-pending-rewards":99998000,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"Y1g=","value":{"bytes":"","type":1,"uint":0}},{"key":"bWI=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGw=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGc=","value":{"bytes":"","type":1,"uint":0}},{"key":"Ymw=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":14,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-at-round":6,"deleted":false,"pending-rewards":99,"reward-base":0,"rewards":99,"round":57,"sig-type":"sig","status":"Offline"},{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","amount":99990099,"amount-without-pending-rewards":99990099,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"dFg=","value":{"bytes":"","type":1,"uint":0}},{"key":"Zno=","value":{"bytes":"","type":1,"uint":0}},{"key":"bWI=","value":{"bytes":"","type":1,"uint":0}},{"key":"Ymw=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":12,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-at-round":4,"deleted":false,"pending-rewards":0,"reward-base":1,"rewards":99,"round":57,"sig-type":"sig","status":"Offline"},{"address":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","amount":99998099,"amount-without-pending-rewards":99998099,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"Ymw=","value":{"bytes":"","type":1,"uint":0}},{"key":"bWI=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGw=","value":{"bytes":"","type":1,"uint":0}},{"key":"dGc=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":16,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-at-round":8,"deleted":false,"pending-rewards":0,"reward-base":1,"rewards":99,"round":57,"sig-type":"sig","status":"Offline"},{"address":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","amount":999700986699,"amount-without-pending-rewards":999700986699,"apps-local-state":[{"deleted":false,"id":70,"key-value":[{"key":"Y1g=","value":{"bytes":"","type":1,"uint":0}}],"opted-in-at-round":10,"schema":{"num-byte-slice":0,"num-uint":7}}],"created-apps":[{"created-at-round":10,"deleted":false,"id":70,"params":{"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","creator":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","global-state":[{"key":"cnY=","value":{"bytes":"","type":1,"uint":0}},{"key":"dHQ=","value":{"bytes":"","type":1,"uint":0}},{"key":"cHg=","value":{"bytes":"","type":2,"uint":0}},{"key":"AAEAAAAAAAAAAQAAAAAAAAAC","value":{"bytes":"","type":1,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7}}}],"created-at-round":2,"deleted":false,"pending-rewards":0,"reward-base":1,"rewards":999699,"round":57,"sig-type":"sig","status":"Offline"}],"current-round":57,"next-token":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22.json deleted file mode 100644 index 745453e8..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22.json +++ /dev/null @@ -1 +0,0 @@ -{"current-round":57} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22_all.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22_all.json deleted file mode 100644 index 6d80eb74..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_22_all.json +++ /dev/null @@ -1 +0,0 @@ -{"application":{"created-at-round":4,"deleted":true,"deleted-at-round":18,"id":22,"params":{"approval-program":null,"clear-state-program":null,"creator":"GHFRLVOMKJNTJ4HY3P74ZR4CNE2PB7CYAUAJ6HVAVVDX7ZKEMLJX6AAF4M","global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}},"current-round":57} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70.json deleted file mode 100644 index c13825f6..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70.json +++ /dev/null @@ -1 +0,0 @@ -{"application":{"created-at-round":10,"deleted":false,"id":70,"params":{"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","creator":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","global-state":[{"key":"cnY=","value":{"bytes":"","type":1,"uint":0}},{"key":"dHQ=","value":{"bytes":"","type":1,"uint":0}},{"key":"cHg=","value":{"bytes":"","type":2,"uint":0}},{"key":"AAEAAAAAAAAAAQAAAAAAAAAC","value":{"bytes":"","type":1,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7}}},"current-round":57} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70_all.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70_all.json deleted file mode 100644 index c13825f6..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_lookup_70_all.json +++ /dev/null @@ -1 +0,0 @@ -{"application":{"created-at-round":10,"deleted":false,"id":70,"params":{"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","creator":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","global-state":[{"key":"cnY=","value":{"bytes":"","type":1,"uint":0}},{"key":"dHQ=","value":{"bytes":"","type":1,"uint":0}},{"key":"cHg=","value":{"bytes":"","type":2,"uint":0}},{"key":"AAEAAAAAAAAAAQAAAAAAAAAC","value":{"bytes":"","type":1,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7}}},"current-round":57} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_22.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_22.json deleted file mode 100644 index dc8d3a5f..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_22.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[],"current-round":57} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_22_all.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_22_all.json deleted file mode 100644 index 1c56216f..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_22_all.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[{"created-at-round":4,"deleted":true,"deleted-at-round":18,"id":22,"params":{"approval-program":null,"clear-state-program":null,"creator":"GHFRLVOMKJNTJ4HY3P74ZR4CNE2PB7CYAUAJ6HVAVVDX7ZKEMLJX6AAF4M","global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}}],"current-round":57,"next-token":"22"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_70.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_70.json deleted file mode 100644 index 7eb1f16e..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_70.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[{"created-at-round":10,"deleted":false,"id":70,"params":{"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","creator":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","global-state":[{"key":"cnY=","value":{"bytes":"","type":1,"uint":0}},{"key":"dHQ=","value":{"bytes":"","type":1,"uint":0}},{"key":"cHg=","value":{"bytes":"","type":2,"uint":0}},{"key":"AAEAAAAAAAAAAQAAAAAAAAAC","value":{"bytes":"","type":1,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7}}}],"current-round":57,"next-token":"70"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_70_all.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_70_all.json deleted file mode 100644 index 7eb1f16e..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_70_all.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[{"created-at-round":10,"deleted":false,"id":70,"params":{"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","creator":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","global-state":[{"key":"cnY=","value":{"bytes":"","type":1,"uint":0}},{"key":"dHQ=","value":{"bytes":"","type":1,"uint":0}},{"key":"cHg=","value":{"bytes":"","type":2,"uint":0}},{"key":"AAEAAAAAAAAAAQAAAAAAAAAC","value":{"bytes":"","type":1,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7}}}],"current-round":57,"next-token":"70"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3.json deleted file mode 100644 index 35a28030..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[{"created-at-round":4,"deleted":false,"id":20,"params":{"approval-program":"ASABASI=","clear-state-program":"ASABASI=","creator":"DQ5PMCTEBZLM4UJEDSGZLKAV6ZGXRK2C5WYAFC63RSHI54ASQSJHDMMTUM","global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}},{"created-at-round":4,"deleted":false,"id":25,"params":{"approval-program":"AiABASYBA2ZvbygoZyJD","clear-state-program":"AiABASYBA2ZvbygoZyJD","creator":"4PAFVTSMBHAAO7UAYI73KL6OFCVIZUIJKRCBYFF5UN7FDJ7CVUXSWM3G3I","global-state":[{"key":"Zm9v","value":{"bytes":"","type":2,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}},{"created-at-round":4,"deleted":false,"id":26,"params":{"approval-program":"AiABASYBA2Zvbyg2GgBnIkM=","clear-state-program":"ASABASI=","creator":"7IROB3J2FTR7LYQA3QOUYSTKCQTSVJK4FTTC77KWSE5NMRATEZXP6TARPA","global-state":[{"key":"Zm9v","value":{"bytes":"","type":2,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}}],"current-round":57,"next-token":"26"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3_all.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3_all.json deleted file mode 100644 index d957e441..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_limit_3_all.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[{"created-at-round":4,"deleted":false,"id":20,"params":{"approval-program":"ASABASI=","clear-state-program":"ASABASI=","creator":"DQ5PMCTEBZLM4UJEDSGZLKAV6ZGXRK2C5WYAFC63RSHI54ASQSJHDMMTUM","global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}},{"created-at-round":4,"deleted":true,"deleted-at-round":18,"id":22,"params":{"approval-program":null,"clear-state-program":null,"creator":"GHFRLVOMKJNTJ4HY3P74ZR4CNE2PB7CYAUAJ6HVAVVDX7ZKEMLJX6AAF4M","global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}},{"created-at-round":4,"deleted":false,"id":25,"params":{"approval-program":"AiABASYBA2ZvbygoZyJD","clear-state-program":"AiABASYBA2ZvbygoZyJD","creator":"4PAFVTSMBHAAO7UAYI73KL6OFCVIZUIJKRCBYFF5UN7FDJ7CVUXSWM3G3I","global-state":[{"key":"Zm9v","value":{"bytes":"","type":2,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}}],"current-round":57,"next-token":"25"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25.json deleted file mode 100644 index 930918ca..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[{"created-at-round":4,"deleted":false,"id":26,"params":{"approval-program":"AiABASYBA2Zvbyg2GgBnIkM=","clear-state-program":"ASABASI=","creator":"7IROB3J2FTR7LYQA3QOUYSTKCQTSVJK4FTTC77KWSE5NMRATEZXP6TARPA","global-state":[{"key":"Zm9v","value":{"bytes":"","type":2,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}}],"current-round":57,"next-token":"26"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25_all.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25_all.json deleted file mode 100644 index 930918ca..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_app_search_next_25_all.json +++ /dev/null @@ -1 +0,0 @@ -{"applications":[{"created-at-round":4,"deleted":false,"id":26,"params":{"approval-program":"AiABASYBA2Zvbyg2GgBnIkM=","clear-state-program":"ASABASI=","creator":"7IROB3J2FTR7LYQA3QOUYSTKCQTSVJK4FTTC77KWSE5NMRATEZXP6TARPA","global-state":[{"key":"Zm9v","value":{"bytes":"","type":2,"uint":0}}],"global-state-schema":{"num-byte-slice":1,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0}}}],"current-round":57,"next-token":"26"} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70.json deleted file mode 100644 index bc67d880..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70.json +++ /dev/null @@ -1 +0,0 @@ -{"current-round":57,"next-token":"OQAAAAAAAAABAAAA","transactions":[{"application-transaction":{"accounts":[],"application-args":["e30=","AAAAAACYloA="],"application-id":0,"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7},"on-completion":"optin"},"close-rewards":0,"closing-amount":0,"confirmed-round":10,"created-application-index":70,"fee":1000,"first-valid":9,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"cHg=","value":{"action":2,"bytes":"e30=","uint":0}},{"key":"cnY=","value":{"action":1,"uint":10000000}},{"key":"dHQ=","value":{"action":1,"uint":10000000}}],"id":"ZMVCPLPFWA7KIFMABIFW3Z5ZAMB6K5PPJIC3NNVJBXQTD4VNYY7Q","intra-round-offset":3,"last-valid":1009,"local-state-delta":[{"address":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","delta":[{"key":"Y1g=","value":{"action":1,"uint":1}}]}],"note":"shiGwECq2uk=","receiver-rewards":0,"round-time":1594078666,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"imsBzWAkybslMtNwVQgUrc9TUpKa/LSzYBtQfirqiopAPSo52SOftlqUlM3lQzQXZ5T1siL5I8G1E6f1+zYUBQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":[],"application-args":[],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"optin"},"close-rewards":0,"closing-amount":0,"confirmed-round":12,"fee":1000,"first-valid":11,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"CEMWL66BUWMVAPN7UM5GVD2JK2R3D7O5WYROATZ5H76XFJMY42FA","intra-round-offset":6,"last-valid":1011,"note":"5HFY3Rv6bsg=","receiver-rewards":0,"round-time":1594078675,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"ofBq3j2Bj2e9FLgl7GBzcCVht7V3cuZ3qDTBQ4CqfBEr+YvV6tVLmnbVazYL4jhZu5Nf3fgE4qK86E/fvzHqAg=="},"tx-type":"appl"},{"application-transaction":{"accounts":[],"application-args":[],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"optin"},"close-rewards":0,"closing-amount":0,"confirmed-round":14,"fee":1000,"first-valid":13,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"5ZPTP5NO2HHPKXMEBOT7F2GIVHYLAWOPPSBAEEQPIPGDZAJSCZGQ","intra-round-offset":4,"last-valid":1013,"note":"7X/AZB64LqU=","receiver-rewards":0,"round-time":1594078683,"sender":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","sender-rewards":0,"signature":{"sig":"xeocsXQpk0/a6nwOVAyThl+PQ15nZmoxDmZSskjEGrbRFbHBgkPF8//R+9+ZSMSMaaWLTMBuAipzJHkItyB9Bg=="},"tx-type":"appl"},{"application-transaction":{"accounts":[],"application-args":[],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"optin"},"close-rewards":0,"closing-amount":0,"confirmed-round":16,"fee":1000,"first-valid":15,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"64LCNZM3S2Y4PPKJKXGFPLV2PQU65P3VQZW37KZMNRVXKD4PZS6Q","intra-round-offset":0,"last-valid":1015,"note":"+AMbnU4Vpfg=","receiver-rewards":0,"round-time":1594078691,"sender":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","sender-rewards":0,"signature":{"sig":"fE4UlHlbLuvyqo+Bw/CpuQwsQ62LWWyOoYqJuhQZxf+bYAnBTwzigxUN65NFAqXZhc/k09Z4mij2YU16dDaNBA=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["dFg=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":19,"fee":1000,"first-valid":18,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"JAIKZYH4HOB4NTE6DFP5ODJVBI3EBFRPTXQ3OXVIPKVEAZ5OQRBA","intra-round-offset":1,"last-valid":1018,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"dFg=","value":{"action":1,"uint":1}}]}],"note":"0Xl2Lg2DgY0=","receiver-rewards":0,"round-time":1594078703,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"C3VFreWWpBJE48I/zSPNSvrhmEtteTvDqs3SI73TJGG3JXgc9cOpbBs6LLGMH/mrg4a6XCPcwXP2YxroKlonBQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["Zno=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":21,"fee":1000,"first-valid":20,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"FITP4RBJ3AQLUDZ3AT6PIEI4MEUX3ARQGWUJD4KBS2TWVDBEWY2A","intra-round-offset":1,"last-valid":1020,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"Zno=","value":{"action":1,"uint":1}}]}],"note":"xi5rpEcZak8=","receiver-rewards":0,"round-time":1594078711,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"rv2LCwB6PmrI/rrJYaYZccMVNFoP/zZcO3lpZcHlryHU835NFVEs1Dd9LaPBvfYWwll0lYJMQGY7pxqvSB49DA=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["bWI=","AAAAAACYloA="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":23,"fee":1000,"first-valid":22,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"ROPOFOXE7Q3L6JDVPQTCESXHZJ6PIEENRCW47HECTPWZDSAARTXA","intra-round-offset":0,"last-valid":1022,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"bWI=","value":{"action":1,"uint":10000000}}]}],"note":"BfmKx1MIJGQ=","receiver-rewards":0,"round-time":1594078719,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"r4iCZwgvMFkbEz45ahvJoJwqpWQ74hj3Zgm89Cm3HmTbwRCCbCTZCTBO/cH7K7HQ3toHkyYXFyWI3QL4JIgxCA=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["dFg=","AAAAAAAAAAA="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":25,"fee":1000,"first-valid":24,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"ND3VDEX6I6JXYZNUT5I2D6P2EBJ7LZ7GOG2YIKUA3O45BRB32R3Q","intra-round-offset":0,"last-valid":1024,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"dFg=","value":{"action":1,"uint":0}}]}],"note":"CtYTbSTqGrE=","receiver-rewards":0,"round-time":1594078727,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"h3KN1dMV3NCoZXojqPoM3jkPlIn8F7euwsau9gk7fwIWJGOveu+awsBS1mJI4YeO0FQAaZZZM82loYrEqhraAg=="},"tx-type":"appl"},{"application-transaction":{"accounts":["KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4"],"application-args":["Y1g=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":27,"fee":1000,"first-valid":26,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"7NLH5RFTQ4GYECAVXOPMF3NV4ZTMLIGCSELVHPPOWD3IEE7S46NA","intra-round-offset":1,"last-valid":1026,"local-state-delta":[{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","delta":[{"key":"Y1g=","value":{"action":1,"uint":1}}]}],"note":"F0wxvv9pxMc=","receiver-rewards":0,"round-time":1594078735,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"alBR32shg7QO19KG2Rkq1nH4Ldrk/Zt+fzYnFF03DOSM4iyVoyxppQ/gplNJS+bqkdaNxBpQsAgR1OXhGo1bCA=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["dFg=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":29,"fee":1000,"first-valid":28,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"FORSL23COZ7OU7JG34NJU5OT7W36APCYBID3CP7F3U27SVJJKTWA","intra-round-offset":0,"last-valid":1028,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"dFg=","value":{"action":1,"uint":1}}]}],"note":"uDhCGdc6zuE=","receiver-rewards":0,"round-time":1594078743,"sender":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","sender-rewards":0,"signature":{"sig":"h6d5A5j51WwCAt9d/Nfc2ZLVx68VZYkMuZod1ckseMToBzWOl9j5i+XuJnw2TABlsLjHd9mZhHrZx8dtuDlTBQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":["KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4"],"application-args":["Y1g=","AAAAAAAAAAA="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":31,"fee":1000,"first-valid":30,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"CHIWGKT2TMTSM63JE4COOMRV24JRICQQHPYJOLTSIVN643RTTLXQ","intra-round-offset":0,"last-valid":1030,"local-state-delta":[{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","delta":[{"key":"Y1g=","value":{"action":1,"uint":0}}]}],"note":"jguXrA9v8BM=","receiver-rewards":0,"round-time":1594078751,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"CzmHp2yscAZnMxVkfUewmo47EKHAdCLZgPkZXyNuti5mru159ReD9c3s+rosrP2s0YeAAzhvnmnUdmliX20xDA=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["bW4=","AAAAAAAAA+g="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":33,"fee":1000,"first-valid":32,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"cnY=","value":{"action":1,"uint":9999000}}],"id":"CVWZUAB5OBOSDRG5VVAGAHIG3NYFOZ3CLGAIFIJKPHZCYXTPHZBA","intra-round-offset":1,"last-valid":1032,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"Ymw=","value":{"action":1,"uint":1000}}]}],"note":"Uo/zRVhVPOk=","receiver-rewards":0,"round-time":1594078760,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"pDyz6YQcvKilreCaF4x+7rjBA8ZGH+LlI3vIGsjVpZB7AuvEoC39Iq12TPqb7xFeO129WbcwPJKt3rDf9TxQBg=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["bW4=","AAAAAAAAA+g="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":35,"fee":1000,"first-valid":34,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"cnY=","value":{"action":1,"uint":9998000}}],"id":"YTV6LYPEPWT3EOL7GREXHDRONER5LLWF27ZSHWMJJ5SC5TBZPRGA","intra-round-offset":0,"last-valid":1034,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"Ymw=","value":{"action":1,"uint":2000}}]}],"note":"Xk7CEuUYzds=","receiver-rewards":0,"round-time":1594078768,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"vebthWTngGA1fWEZXLq81OXw/CmSWnO4cDoh9o7jT5TWf/LrLNJjDj8sLGpBNy2YLgLmn/oZhYwKdmVjjB05CQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["YnI=","AAAAAAAAA+g="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":37,"fee":1000,"first-valid":36,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"cnY=","value":{"action":1,"uint":9999000}}],"id":"D4XCBEH3YVRH44JZG7BJRGWEPAENQ6QC7VL4DRU4X5AMIXUEXB6Q","intra-round-offset":0,"last-valid":1036,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"Ymw=","value":{"action":1,"uint":1000}}]}],"note":"TViK1VXHWac=","receiver-rewards":0,"round-time":1594078776,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"8qJ1MIpd3FO1jDBXH2NDnPR7ry+MhCj2jpFb2Vu/rKCZ2tnUau/SrYltt5lL3Kylv98wy/wViTxh07p5f7VrCw=="},"tx-type":"appl"},{"application-transaction":{"accounts":["NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA"],"application-args":["YnI=","AAAAAAAAA+g="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":39,"fee":1000,"first-valid":38,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"cnY=","value":{"action":1,"uint":10000000}}],"id":"Q4XRMOWUHLBC4RXOXSBNEDP6QL7O4O6NH7ZFKGILNW7ZHRHINI6A","intra-round-offset":0,"last-valid":1038,"local-state-delta":[{"address":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","delta":[{"key":"Ymw=","value":{"action":1,"uint":0}}]}],"note":"xK/ybKPRIPc=","receiver-rewards":0,"round-time":1594078784,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"Ojgq3pf27Gl4AbXLFzgbV9/o/S+a0/I535b381PosFQFOBKsHj2jXW52qU4A+4HaILpVBBnRSkpy5xxSgEIHDA=="},"tx-type":"appl"},{"application-transaction":{"accounts":["P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4"],"application-args":["bW4=","AAAAAAAAA+g="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":41,"fee":1000,"first-valid":40,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"cnY=","value":{"action":1,"uint":9999000}}],"id":"IKKRID67WKSWXAKB2EDFHIZVFB7KH3JOMZGHOZPBESZWT7374DAA","intra-round-offset":0,"last-valid":1040,"local-state-delta":[{"address":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","delta":[{"key":"Ymw=","value":{"action":1,"uint":1000}}]}],"note":"VpdzRMA1QVk=","receiver-rewards":0,"round-time":1594078792,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":999699,"signature":{"sig":"Iy/NqQze0ygl8GSWp9yfK/n+gRRcuVM+BFdLh1ulKaCo4sWUKIF3rQhM+OgL6f8zwSykdkzaA+p8EWDLfyk+Dw=="},"tx-type":"appl"},{"application-transaction":{"accounts":["P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4"],"application-args":["bWI=","AAAAAACYloA="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":43,"fee":1000,"first-valid":42,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"YPV5JIB5QBA4Y7Z5LHRXOO3AVLF7BJKTYIYQVYWSEDDOXHADY52A","intra-round-offset":1,"last-valid":1042,"local-state-delta":[{"address":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","delta":[{"key":"bWI=","value":{"action":1,"uint":10000000}}]}],"note":"k1qsNuXoeJw=","receiver-rewards":0,"round-time":1594078800,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":99,"signature":{"sig":"9UlxNQfXyMtwTv6bpry65322GI8JwTGokp1HY52B/1WuBzcLdy8AU44HnVsU7EX9cfwFhJhsmotew4vhfAojCg=="},"tx-type":"appl"},{"application-transaction":{"accounts":["KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4"],"application-args":["bWI=","AAAAAACYloA="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":45,"fee":1000,"first-valid":44,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"73SDAIKNWYHOYUKN2E5VQYPMCBPXOUDRH3U3PVTANQE25XT6CQCQ","intra-round-offset":0,"last-valid":1044,"local-state-delta":[{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","delta":[{"key":"bWI=","value":{"action":1,"uint":10000000}}]}],"note":"AnXtirC/FTE=","receiver-rewards":0,"round-time":1594078808,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"ZYma4ejihDlU0QS1ISoNJ9Caw/ZE9JG11xCql97PeFw2esEjYTX6baO7EBmALZYLxiwjb4kJWJfE9QcuMrK5CQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":["P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4"],"application-args":["dGw=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":47,"fee":1000,"first-valid":46,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"IG73HNAI4TDLOHRH7OQOU24D2N7PF4ABM44LKNPOSBJ5O57GLIRA","intra-round-offset":0,"last-valid":1046,"local-state-delta":[{"address":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","delta":[{"key":"dGw=","value":{"action":1,"uint":1}}]}],"note":"VDCq69SosCg=","receiver-rewards":0,"round-time":1594078816,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"D0hJJSsKeweVxcb79qj/zY6Galaj6WcMqbbAi5W3scvizx3UA6I7IbvMfdQfUS7q0WBFT0Vm0eY4Nq7rQCJ+DQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":["KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4"],"application-args":["dGw=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":49,"fee":1000,"first-valid":48,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"YVWWPERWR7OPWM2O63JPCHEMPLNP4XIEKPTYNW7GXWKWCMUZBTQQ","intra-round-offset":0,"last-valid":1048,"local-state-delta":[{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","delta":[{"key":"dGw=","value":{"action":1,"uint":1}}]}],"note":"XiMuuKMkHd4=","receiver-rewards":0,"round-time":1594078824,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"IA3isUUw6nC6cx84OP1pmMO8+YGPAz0PCACmErHlCu4+bAMP+/Yofe8v+ptgJ8MK7UAtGWls5vb1coshcsB1Ag=="},"tx-type":"appl"},{"application-transaction":{"accounts":["P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4"],"application-args":["dGc=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":51,"fee":1000,"first-valid":50,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"JQT4CG7PUHDS5R4BOPCZBG2LPWNGEYEBZ6KBCG477GIVMF2KJ2EA","intra-round-offset":1,"last-valid":1050,"local-state-delta":[{"address":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","delta":[{"key":"dGc=","value":{"action":1,"uint":1}}]}],"note":"QeEiR6rBC7Y=","receiver-rewards":0,"round-time":1594078832,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"sbuwcVhSN462oU/yOmPDgCZHlHRarJqop1AjVISvXAC6SxBicemybTu/zrGUvdcUDSFxB4e6o6ultyRAkmvQDQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":["KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4"],"application-args":["dGc=","AAAAAAAAAAI="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":53,"fee":1000,"first-valid":52,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"VMNKGJ7ZTAWGAC3OEYYZVQV2P6W7NXAQBLNNSV4RKTVYONPLXDUQ","intra-round-offset":0,"last-valid":1052,"local-state-delta":[{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","delta":[{"key":"dGc=","value":{"action":1,"uint":2}}]}],"note":"Jnm4gE1AeGE=","receiver-rewards":0,"round-time":1594078840,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"BPZUU++De6ksBnyVIClSiu5DI+ixYq9NYDNTi+8y47dDeWJkDBdXLvjXPIRnShnANFmJq20oWvNVUOM5TiM4BQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":[],"application-args":["AAAAAAAAAAE=","AAAAAAAAAAI=","AAAAAAAAAAE="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":55,"fee":1000,"first-valid":54,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"AAEAAAAAAAAAAQAAAAAAAAAC","value":{"action":1,"uint":1}}],"id":"J5SZNWKP3F7YBOYXV4VKMWDBJSBJRXGHAZYS45XBNBTCMJNIOP4A","intra-round-offset":1,"last-valid":1054,"note":"fkrgi+sDrDY=","receiver-rewards":0,"round-time":1594078848,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"1tBFJQkANkZvrXaYCFuiXtpqTjzdOKDdLxOWPEtNNUJMPGyNyet5kHYmCfHXsARPJmP0yAY2GMhF37Wx47NGCg=="},"tx-type":"appl"},{"application-transaction":{"accounts":["KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4"],"application-args":["AAAAAAAAACo="],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"noop"},"close-rewards":0,"closing-amount":0,"confirmed-round":57,"fee":1000,"first-valid":56,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"XFPWUFURA4HOMCETWKHBPZYQGLJ42H7KSB2FETF7FUVOR5JVHHOA","intra-round-offset":1,"last-valid":1056,"local-state-delta":[{"address":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","delta":[{"key":"Ymw=","value":{"action":1,"uint":958}}]},{"address":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","delta":[{"key":"Ymw=","value":{"action":1,"uint":42}}]}],"note":"BpDTlCceLgM=","receiver-rewards":0,"round-time":1594078857,"sender":"P344CA4TM5MMTUEF5REWHUO3QDITXC6Y4WRRA4K66T2EZOT6FXANFPMZA4","sender-rewards":99,"signature":{"sig":"pUNAum/OroNimGxfHl08dsxg6t8TjOYBk2KA5wvOUymkSUky3yeE4R2Ej1rB9oxTam5NU1wcb/ISde/bJaI8Aw=="},"tx-type":"appl"}]} diff --git a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70_lim_3.json b/features/resources/v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70_lim_3.json deleted file mode 100644 index d19d8f92..00000000 --- a/features/resources/v23x_indexerclient_responsejsons/indexer_v2_tx_search_app_70_lim_3.json +++ /dev/null @@ -1 +0,0 @@ -{"current-round":57,"next-token":"DgAAAAAAAAAEAAAA","transactions":[{"application-transaction":{"accounts":[],"application-args":["e30=","AAAAAACYloA="],"application-id":0,"approval-program":"AiAHAAUEAQIIAyYOAmNYAnRYAm1uAmJyAmZ6Am1iAnRsAnRnAmJsAnJ2AnBzAgABAnR0AnB4MRgiEkAB3jEZIxJAAbwxGSQSQAGiMRklEkABjjEZIhIxHSEEDBBAAAEAMR0iEkABHDEbJRJAALUxGyEEEkAAAQA2GgAoEjYaACkSEUAAjDYaACoSQABjNhoAKxJAADolNhoANhoBF2Y2GgAnBBIiKGIlEiIpYiUSERAiKWIlEjYaACcFEjYaACcGEhE2GgAnBxIREBElQABQJScIJScIYjYaARcJZicJJwlkNhoBFwhnIihiJRIlQAAvJScIJScIYjYaARcIZicJJwlkNhoBFwlnIihiJRIlQAAOJTYaADYaARdmIihiJRIlQABcIicIIicIYjYaABcJZiUnCCUnCGI2GgAXCGYnCmQiEiUnCGIlJwViDhAiJwRiIhIQJScEYiISECInBmIyBwwQJScGYjIHDBAnCyInB2IWUCUnB2IWUGQlCTIHDBAlQABZMRslEkAARjYaAhciEkAAEycLNhoAUDYaAVA2GgIXZyVAAAsnCzYaAFA2GgFQaTYaABUhBRI2GgEVIQUSEDEbIQYSECIpYiUSECVAAAwnCjYaABdnIihiJRIlQABiMRsiEjEdIhIQJUAAVTEbIhIxHSISECIoYiUSECVAAEIxGyISMR0iEhAiKGIlEhAnCWQnDGQSECVAACciKCVmJw02GgBnJwk2GgEXZycMNhoBF2cxGyEEEjEdIhIQMRklEhA=","clear-state-program":"AiABACYCAnJ2AmJsKChkIiliCGc=","foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":1,"num-uint":43},"local-state-schema":{"num-byte-slice":0,"num-uint":7},"on-completion":"optin"},"close-rewards":0,"closing-amount":0,"confirmed-round":10,"created-application-index":70,"fee":1000,"first-valid":9,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","global-state-delta":[{"key":"cHg=","value":{"action":2,"bytes":"e30=","uint":0}},{"key":"cnY=","value":{"action":1,"uint":10000000}},{"key":"dHQ=","value":{"action":1,"uint":10000000}}],"id":"ZMVCPLPFWA7KIFMABIFW3Z5ZAMB6K5PPJIC3NNVJBXQTD4VNYY7Q","intra-round-offset":3,"last-valid":1009,"local-state-delta":[{"address":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","delta":[{"key":"Y1g=","value":{"action":1,"uint":1}}]}],"note":"shiGwECq2uk=","receiver-rewards":0,"round-time":1594078666,"sender":"6AZC53IE3ZOSW6WDJVMCLCFW6VJFPYBEDSXUVSEODQF7CYBIC6LHTWXUAM","sender-rewards":0,"signature":{"sig":"imsBzWAkybslMtNwVQgUrc9TUpKa/LSzYBtQfirqiopAPSo52SOftlqUlM3lQzQXZ5T1siL5I8G1E6f1+zYUBQ=="},"tx-type":"appl"},{"application-transaction":{"accounts":[],"application-args":[],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"optin"},"close-rewards":0,"closing-amount":0,"confirmed-round":12,"fee":1000,"first-valid":11,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"CEMWL66BUWMVAPN7UM5GVD2JK2R3D7O5WYROATZ5H76XFJMY42FA","intra-round-offset":6,"last-valid":1011,"note":"5HFY3Rv6bsg=","receiver-rewards":0,"round-time":1594078675,"sender":"NL7OCUFWGXF6B2IUGVMVUXXKRZPVZBVBVFO7PNFMN2IWSUIZY7D52MFJMA","sender-rewards":0,"signature":{"sig":"ofBq3j2Bj2e9FLgl7GBzcCVht7V3cuZ3qDTBQ4CqfBEr+YvV6tVLmnbVazYL4jhZu5Nf3fgE4qK86E/fvzHqAg=="},"tx-type":"appl"},{"application-transaction":{"accounts":[],"application-args":[],"application-id":70,"foreign-apps":[],"foreign-assets":[],"global-state-schema":{"num-byte-slice":0,"num-uint":0},"local-state-schema":{"num-byte-slice":0,"num-uint":0},"on-completion":"optin"},"close-rewards":0,"closing-amount":0,"confirmed-round":14,"fee":1000,"first-valid":13,"genesis-hash":"7iETbAkbHk1hPv6SM7X9/PcKw9uZbBmEgjJmUjLK+tQ=","id":"5ZPTP5NO2HHPKXMEBOT7F2GIVHYLAWOPPSBAEEQPIPGDZAJSCZGQ","intra-round-offset":4,"last-valid":1013,"note":"7X/AZB64LqU=","receiver-rewards":0,"round-time":1594078683,"sender":"KGDN7U6QWB6SO34CIKWQRPUQIUP3INMBX6JP5JJLHHUYXPMADB5DYGOCJ4","sender-rewards":0,"signature":{"sig":"xeocsXQpk0/a6nwOVAyThl+PQ15nZmoxDmZSskjEGrbRFbHBgkPF8//R+9+ZSMSMaaWLTMBuAipzJHkItyB9Bg=="},"tx-type":"appl"}]} diff --git a/features/resources/v2algodclient_responsejsons/sourcemap2.json b/features/resources/v2algodclient_responsejsons/sourcemap2.json new file mode 100644 index 00000000..c02e5872 --- /dev/null +++ b/features/resources/v2algodclient_responsejsons/sourcemap2.json @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mapping":";AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA;AASA;;;AAUA;;;AAWA;AAYA;;AAaA;AAcA;;;AAeA;AAgBA;AAiBA;;AAkBA;;AAmBA;AAoBA;AAqBA"} \ No newline at end of file diff --git a/features/unit/v2algodclient_responses.feature b/features/unit/v2algodclient_responses.feature index 11d7640a..ebcd3145 100644 --- a/features/unit/v2algodclient_responses.feature +++ b/features/unit/v2algodclient_responses.feature @@ -105,7 +105,7 @@ Feature: Algod REST API v2 Responses Scenario Outline: Dryrun response Given mock http responses in "" loaded from "" When we make any Dryrun call - Then the parsed Dryrun Response should have global delta with + Then the parsed Dryrun Response should have global delta "" with Examples: - | jsonfiles | directory | key | action | - | dryrunResponse.json | v2algodclient_responsejsons | "Creator" | 2 | + | jsonfiles | directory | key | action | + | dryrunResponse.json | v2algodclient_responsejsons | Creator | 2 | diff --git a/network_config/DevModeNetwork.json b/network_config/DevModeNetwork.json deleted file mode 100644 index a8afc1ae..00000000 --- a/network_config/DevModeNetwork.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "Genesis": { - "ConsensusProtocol": "future", - "NetworkName": "devmodenet", - "LastPartKeyRound": 10000, - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 40, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 40, - "Online": true - }, - { - "Name": "Wallet3", - "Stake": 20, - "Online": false - } - ], - "DevMode": true - }, - "Nodes": [ - { - "Name": "Node", - "IsRelay": false, - "Wallets": [ - { - "Name": "Wallet1", - "ParticipationOnly": false - }, - { - "Name": "Wallet2", - "ParticipationOnly": false - }, - { - "Name": "Wallet3", - "ParticipationOnly": false - } - ] - } - ] -} diff --git a/network_config/future_template.json b/network_config/future_template.json deleted file mode 100644 index 3cda40cc..00000000 --- a/network_config/future_template.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "Genesis": { - "ConsensusProtocol": "future", - "NetworkName": "", - "LastPartKeyRound": 10000, - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 10, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 40, - "Online": true - }, - { - "Name": "Wallet3", - "Stake": 40, - "Online": false - }, - { - "Name": "Wallet4", - "Stake": 10, - "Online": false - } - ] - }, - "Nodes": [ - { - "Name": "Primary", - "IsRelay": true, - "Wallets": [ - { - "Name": "Wallet1", - "ParticipationOnly": false - } - ] - }, - { - "Name": "Node", - "Wallets": [ - { - "Name": "Wallet2", - "ParticipationOnly": false - }, - { - "Name": "Wallet3", - "ParticipationOnly": false - }, - { - "Name": "Wallet4", - "ParticipationOnly": false - } - ] - } - ] -} diff --git a/network_config/template.json b/network_config/template.json deleted file mode 100644 index 090b275c..00000000 --- a/network_config/template.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "Genesis": { - "NetworkName": "", - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 10, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 40, - "Online": true - }, - { - "Name": "Wallet3", - "Stake": 40, - "Online": false - }, - { - "Name": "Wallet4", - "Stake": 10, - "Online": false - } - ] - }, - "Nodes": [ - { - "Name": "Primary", - "IsRelay": true, - "Wallets": [ - { - "Name": "Wallet1", - "ParticipationOnly": false - } - ] - }, - { - "Name": "Node", - "Wallets": [ - { - "Name": "Wallet2", - "ParticipationOnly": false - }, - { - "Name": "Wallet3", - "ParticipationOnly": false - }, - { - "Name": "Wallet4", - "ParticipationOnly": false - } - ] - } - ] -} diff --git a/scripts/down.sh b/scripts/down.sh index 5044bb9d..dd775f78 100755 --- a/scripts/down.sh +++ b/scripts/down.sh @@ -1,13 +1,17 @@ #!/usr/bin/env bash -rootdir=`dirname $0` -pushd $rootdir/.. > /dev/null +THIS=$(basename "$0") -docker-compose down +ENV_FILE=".env" -# In case a graceful shutdown/remove fails, bring them down the hard way. -#docker kill $(docker ps -f name="sdk-harness") -containers=$(docker ps -a -f name="sdk-harness" -q) -if [ ! -z "$containers" ]; then - docker kill $containers || true - docker rm $containers || true +# Load environment. +echo "$THIS: sourcing environment vars from-->$(pwd)/$ENV_FILE" +source "$ENV_FILE" +echo "$THIS: looking to clean up inside-->$(pwd)/$LOCAL_SANDBOX_DIR" + +if [ -d "$LOCAL_SANDBOX_DIR" ]; then + pushd "$LOCAL_SANDBOX_DIR" + ./sandbox down + ./sandbox clean +else + echo "$THIS: directory $(pwd)/$LOCAL_SANDBOX_DIR does not exist - NOOP" fi diff --git a/scripts/restart.sh b/scripts/restart.sh deleted file mode 100755 index a34cc043..00000000 --- a/scripts/restart.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -# This script is useful for development to quickly restart the -# environment for another round of tests. -set -e - -rootdir=`dirname $0` -pushd $rootdir/.. > /dev/null - -# Use this script for the following situation(s): - -# Some tests alter the state of the blockchain, and running the again -# requires the initial blockchain state. -# For example: when the test rekeys an account, running the test again -# will fail to rekey using the initial key. -# Running this script between test runs will reset the blockchain state. - -docker-compose down -docker-compose rm --force -docker-compose up -d diff --git a/scripts/up.sh b/scripts/up.sh index 95b415db..b022ea60 100755 --- a/scripts/up.sh +++ b/scripts/up.sh @@ -1,79 +1,61 @@ #!/usr/bin/env bash -# -# Bring up the SDK test environment. - -set -e - -rootdir=`dirname $0` -pushd $rootdir/.. > /dev/null - -# Defaults -TYPE_OVERRIDE="" -DAEMON_FLAG="-d" -SKIP_BUILD=0 -SHOW_HELP=0 -ENV_FILE=".up-env" -PARALLEL="--parallel" - -show_help() { - echo "Manage bringing up the SDK test environment." - echo - echo "Usage: up.sh [options]" - echo - echo "Options:" - echo " -f Override the environment file." - echo " -t Override the installation type specified in the environment file." - echo " Valid types: ['channel', 'type']" - echo " -s Skip rebuilding the docker image." - echo " -i Start the docker environment in interactive mode." - echo " -h Provide this help information." - echo " -p Disable parallel build mode. Probably only useful when editing the test environment." -} - -# Parse arguments -while getopts "pf:t:sih" opt; do - case "$opt" in - f) ENV_FILE=$OPTARG; ;; - i) unset DAEMON_FLAG; ;; - s) SKIP_BUILD=1; ;; - t) TYPE_OVERRIDE=$OPTARG; ;; - h) show_help; exit 0 ;; - p) unset PARALLEL; ;; - esac -done - -# Verify there are no positional parameters with getopt/getopts -shift "$((OPTIND-1))" -if [[ "$1" != "" ]]; then - echo "No positional arguments should be provided, found '$@'" - echo - show_help - exit -fi -# Load environment. -source $ENV_FILE +set -euo pipefail + +START=$(date "+%s") + +THIS=$(basename "$0") +ENV_FILE=".env" +echo "$THIS: sourcing environment vars from-->$(pwd)/$ENV_FILE" + +set -a +source "$ENV_FILE" +set +a -# Choose which dockerfile to use. -TYPE=${TYPE_OVERRIDE:-$TYPE} if [[ $TYPE == "channel" ]] || [[ $TYPE == "source" ]]; then - export TYPE="$TYPE" + echo "$THIS: setting sandbox variables for git based on TYPE=$TYPE." + if [[ $TYPE == "channel" ]]; then + ALGOD_URL="" + ALGOD_BRANCH="" + ALGOD_SHA="" + else + ALGOD_CHANNEL="" + fi else echo "Unknown environment: $TYPE" exit 1 fi -echo "Bringing up network with '$TYPE' configuration." - -# Make sure it isn't running +# Make sure test-sdk sandbox isn't running and clean up any docker detritous +echo "$THIS: before bootstrapping, try cleaning up first..." ./scripts/down.sh +rm -rf "$LOCAL_SANDBOX_DIR" +echo "$THIS: seconds it took to get to end of $(pwd)/$LOCAL_SANDBOX_DIR cleanup: $(($(date "+%s") - START))s" -# Remove the containers to allow re-running stateful tests. -docker-compose rm --force -# When developing, it's often useful to skip the build phase. -if [[ $SKIP_BUILD -eq 0 ]]; then - docker-compose build --no-cache $PARALLEL -fi +rootdir=$(dirname "$0") +pushd "$rootdir"/.. > /dev/null || exit + +git clone --depth 1 --branch "$SANDBOX_BRANCH" --single-branch "$SANDBOX_URL" "$LOCAL_SANDBOX_DIR" + +cp .env "$LOCAL_SANDBOX_DIR"/. + +SANDBOX_CFG="config.harness" +echo "$THIS: about to envsubst < $SANDBOX_CFG > $LOCAL_SANDBOX_DIR/$SANDBOX_CFG" +envsubst < "$SANDBOX_CFG" > "$LOCAL_SANDBOX_DIR/$SANDBOX_CFG" + +echo "$THIS: resulting $(pwd)/$LOCAL_SANDBOX_DIR/$SANDBOX_CFG:" +cat "$LOCAL_SANDBOX_DIR/$SANDBOX_CFG" + +echo "" +echo "$THIS: seconds it took to get to end of cloning sandbox into $(pwd)/$LOCAL_SANDBOX_DIR: $(($(date "+%s") - START))s" +echo "" +echo "$THIS: bringing up network with TYPE=$TYPE configuration." + +pushd "$LOCAL_SANDBOX_DIR" + +[[ "$VERBOSE_HARNESS" = 1 ]] && V_FLAG="-v" || V_FLAG="" + -docker-compose up $DAEMON_FLAG +./sandbox up "$V_FLAG" harness +echo "$THIS: seconds it took to finish getting sandbox harness ($(pwd)) up and running: $(($(date "+%s") - START))s" diff --git a/utils/create_indexer_integration_goldens.sh b/utils/create_indexer_integration_goldens.sh deleted file mode 100755 index 8303463b..00000000 --- a/utils/create_indexer_integration_goldens.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash -# -# Queries the indexer SDK testing service and generates goldens. - -rootdir=`dirname $0` -mkdir -p $rootdir/../features/resources/v23x_indexerclient_responsejsons -pushd $rootdir/../features/resources/v23x_indexerclient_responsejsons > /dev/null - -curl "localhost:59996/v2/applications?application-id=22" > indexer_v2_app_search_22.json -curl "localhost:59996/v2/applications?limit=3" > indexer_v2_app_search_limit_3.json -curl "localhost:59996/v2/applications?next=25&limit=1" > indexer_v2_app_search_next_25.json -curl "localhost:59996/v2/applications?application-id=70" > indexer_v2_app_search_70.json - -curl "localhost:59996/v2/applications/22" > indexer_v2_app_lookup_22.json -curl "localhost:59996/v2/applications/70" > indexer_v2_app_lookup_70.json - -curl "localhost:59996/v2/transactions?application-id=70" > indexer_v2_tx_search_app_70.json -curl "localhost:59996/v2/transactions?application-id=70&limit=3" > indexer_v2_tx_search_app_70_lim_3.json - -curl "localhost:59996/v2/accounts?application-id=70" > indexer_v2_acct_search_app_70.json - -# Include deleted... -curl "localhost:59996/v2/applications?include-all=true&application-id=22" > indexer_v2_app_search_22_all.json -curl "localhost:59996/v2/applications?include-all=true&limit=3" > indexer_v2_app_search_limit_3_all.json -curl "localhost:59996/v2/applications?include-all=true&next=25&limit=1" > indexer_v2_app_search_next_25_all.json -curl "localhost:59996/v2/applications?include-all=true&application-id=70" > indexer_v2_app_search_70_all.json - -curl "localhost:59996/v2/applications/22?include-all=true" > indexer_v2_app_lookup_22_all.json -curl "localhost:59996/v2/applications/70?include-all=true" > indexer_v2_app_lookup_70_all.json - -curl "localhost:59996/v2/accounts?include-all=true&application-id=70" > indexer_v2_acct_search_app_70_all.json diff --git a/utils/create_transactions.sh b/utils/create_transactions.sh deleted file mode 100755 index 3b3c3ffa..00000000 --- a/utils/create_transactions.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env bash -# -# Create cucumber example tables for app transactions -# -# Must have an applications-enabled version of goal on the path, and any running node. -# -# hint: pipe output into 'column -t' to almost get the column alignmnet correct -# even better might be to pipe it into 'column -t -s\|' and to add the bar back in - - -# this is mandatory, 'goal app' currently only supports looking up fee/first-valid/last-valid -DATA_DIR="/home/will/algorand/networks/test/Node" -ACCOUNT_1=BH55E5RMBD4GYWXGX5W5PJ5JAHPGM5OXKDQH5DC4O2MGI7NW4H6VOE4CP4 -ACCOUNT_MNEMONIC="awful drop leaf tennis indoor begin mandate discover uncle seven only coil atom any hospital uncover make any climb actor armed measure need above hundred" - -NO_ACCOUNTS= -ONE_ACCOUNT="AAZFG7YLUHOQ73J7UR7TPJA634OIDL5GIEURTW2QXN7VBRI7BDZCVN6QTI" -TWO_ACCOUNTS="AAVDEAJ3NIYOG7XCRBKCJ3T5PUCVL2XASOP3NGX4NPPZ3UX6477PBG6E4Q,AADQIC4PMKRTFMHAAXYAFSGAUULDI2ABBIYVQJ6GZ5JHY6DJPHTU2SPHYM" - -# Parse arguments -OPTS=`getopt -o hd: --long help,data: -n 'parse-options' -- "$@"` - -if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi - -eval set -- "$OPTS" - -while true; do - case "$1" in - -d | --data) DATA_DIR="$2"; shift; shift ;; - -h | --help) echo "Provide a data directory."; exit 0 ;; - * ) break ;; - esac -done - -header() { - echo " | operation | application-id | sender | approval-prog-file | clear-prog-file | global-bytes | global-ints | local-bytes | local-ints | app-args | foreign-apps | foreign-assets | app-accounts | fee | first-valid | last-valid | genesis-hash | golden |" -} - -app_row() { - goal app $1 \ - --from "$2" \ - --app-id "$3" \ - --app-arg "$4" \ - --foreign-app "${5}" \ - --foreign-asset "${6}" \ - --app-account "${7}" \ - --fee "${8}" \ - --firstvalid "${9}" \ - --lastvalid "${10}" \ - --note "" \ - -o tmp.txn \ - -d "${DATA_DIR}" - - algokey sign -m "${ACCOUNT_MNEMONIC}" --txfile tmp.txn -o tmp.stxn - GOLDEN=$(base64 -w 0 < tmp.stxn) - rm tmp.txn tmp.stxn - - echo " | $1 | $3 | $2 | | | 0 | 0 | 0 | 0 | $4 | $5 | $6 | $7 | $8 | $9 | ${10} | genesis-hash-here | ${GOLDEN} |" - - unset GOLDEN -} - -app_create_row() { - goal app create \ - --creator "$1" \ - --approval-prog-raw "$2" \ - --clear-prog-raw "$3" \ - --global-byteslices "$4" \ - --global-ints "$5" \ - --local-byteslices "$6" \ - --local-ints "$7" \ - --app-arg "$8" \ - --foreign-app "${9}" \ - --foreign-asset "${10}" \ - --app-account "${11}" \ - --fee "${12}" \ - --firstvalid "${13}" \ - --lastvalid "${14}" \ - --note "" \ - -o tmp.txn \ - -d "${DATA_DIR}" - - algokey sign -m "${ACCOUNT_MNEMONIC}" --txfile tmp.txn -o tmp.stxn - GOLDEN=$(base64 -w 0 < tmp.stxn) - rm tmp.txn tmp.stxn - - echo " | create | 0 | $1 | $2 | $3 | $4 | $5 | $6 | $7 | $8 | $9 | ${10} | ${11} | ${12} | ${13} | ${14} | genesis-hash-here | ${GOLDEN} |" - - unset GOLDEN -} - -app_update_row() { - goal app update \ - --app-id "$1" \ - --from "$2" \ - --approval-prog-raw "$3" \ - --clear-prog-raw "$4" \ - --app-arg "$5" \ - --foreign-app "${6}" \ - --foreign-asset "${7}" \ - --app-account "${8}" \ - --fee "${9}" \ - --firstvalid "${10}" \ - --lastvalid "${11}" \ - --note "" \ - -o tmp.txn \ - -d "${DATA_DIR}" - - algokey sign -m "${ACCOUNT_MNEMONIC}" --txfile tmp.txn -o tmp.stxn - GOLDEN=$(base64 -w 0 < tmp.stxn) - rm tmp.txn tmp.stxn - - echo " | update | $1 | $2 | $3 | $4 | 0 | 0 | 0 | 0 | $5 | $6 | ${7} | ${8} | ${9} | ${10} | ${11} | genesis-hash-here | ${GOLDEN} |" - - unset GOLDEN -} - -cd programs -goal clerk compile *teal > /dev/null -cd .. - -echo "Examples:" -header - -app_create_row "${ACCOUNT_1}" "programs/loccheck.teal.tok" "programs/one.teal.tok" 1 0 1 0 "str:test" 5555,6666 "" "$NO_ACCOUNT" 1234 9000 9010 -app_create_row "${ACCOUNT_1}" "programs/zero.teal.tok" "programs/one.teal.tok" 1 0 1 0 "str:test" "" "" "$ONE_ACCOUNT" 1234 9000 9010 -app_create_row "${ACCOUNT_1}" "programs/one.teal.tok" "programs/zero.teal.tok" 1 0 1 0 "str:test" 5555,6666 1000,2000 "$NO_ACCOUNT" 1234 9000 9010 -app_create_row "${ACCOUNT_1}" "programs/one.teal.tok" "programs/zero.teal.tok" 1 0 1 0 "str:test" 5555,6666 3000 "$NO_ACCOUNT" 1234 9000 9010 - -app_update_row 456 "${ACCOUNT_1}" "programs/zero.teal.tok" "programs/loccheck.teal.tok" "str:test" "" "" "$ONE_ACCOUNT" 1234 9000 9010 -app_update_row 456 "${ACCOUNT_1}" "programs/zero.teal.tok" "programs/loccheck.teal.tok" "str:test" 5555,6666 1000,2000 "$ONE_ACCOUNT" 1234 9000 9010 -app_update_row 456 "${ACCOUNT_1}" "programs/zero.teal.tok" "programs/loccheck.teal.tok" "str:test" 5555,6666 3000 "$TWO_ACCOUNT" 1234 9000 9010 - -app_row call "${ACCOUNT_1}" 100 "str:test" 5555,6666 "" "$TWO_ACCOUNTS" 1234 9000 9010 -app_row call "${ACCOUNT_1}" 100 "str:test" "" "" "$NO_ACCOUNTS" 1234 9000 9010 -app_row call "${ACCOUNT_1}" 100 "str:test" 5555,6666 7777,8888 "$TWO_ACCOUNTS" 1234 9000 9010 - -app_row optin "${ACCOUNT_1}" 100 "str:test" 5555,6666 "" "$TWO_ACCOUNTS" 1234 9000 9010 -app_row optin "${ACCOUNT_1}" 100 "str:test" "" "" "$NO_ACCOUNTS" 1234 9000 9010 -app_row optin "${ACCOUNT_1}" 100 "str:test" 5555,6666 7777,8888 "$TWO_ACCOUNTS" 1234 9000 9010 - -app_row clear "${ACCOUNT_1}" 100 "str:test" 5555,6666 "" "$TWO_ACCOUNTS" 1234 9000 9010 -app_row clear "${ACCOUNT_1}" 100 "str:test" "" "" "$NO_ACCOUNTS" 1234 9000 9010 -app_row clear "${ACCOUNT_1}" 100 "str:test" 5555,6666 7777,8888 "$TWO_ACCOUNTS" 1234 9000 9010 - -app_row closeout "${ACCOUNT_1}" 100 "str:test" 5555,6666 "" "$TWO_ACCOUNTS" 1234 9000 9010 -app_row closeout "${ACCOUNT_1}" 100 "str:test" "" "" "$NO_ACCOUNTS" 1234 9000 9010 -app_row closeout "${ACCOUNT_1}" 100 "str:test" 5555,6666 7777,8888 "$TWO_ACCOUNTS" 1234 9000 9010 - -app_row delete "${ACCOUNT_1}" 100 "str:test" 5555,6666 "" "$TWO_ACCOUNTS" 1234 9000 9010 -app_row delete "${ACCOUNT_1}" 100 "str:test" "" "" "$NO_ACCOUNTS" 1234 9000 9010 -app_row delete "${ACCOUNT_1}" 100 "str:test" 5555,6666 7777,8888 "$TWO_ACCOUNTS" 1234 9000 9010 diff --git a/utils/implements_all_tests.sh b/utils/implements_all_tests.sh index 90546428..6c7aab8e 100755 --- a/utils/implements_all_tests.sh +++ b/utils/implements_all_tests.sh @@ -18,7 +18,7 @@ isExcluded () { } # Lookup tags -TAGS=$(find . -name "*.feature" -exec cat {} \; -exec /usr/bin/echo \;|grep @|tr -d ' '|sort -u) +TAGS=$(find . -name "*.feature" -exec cat {} \; -exec /usr/bin/echo \;|grep @[a-zA-Z]|tr -d ' '|sort -u) if ! [ -r "$1" ]; then printf "Unable to read makefile at '%s'\n" "$1" diff --git a/utils/programs/asa_approve.teal b/utils/programs/asa_approve.teal deleted file mode 100644 index 710405f7..00000000 --- a/utils/programs/asa_approve.teal +++ /dev/null @@ -1,532 +0,0 @@ -#pragma version 2 -txn NumAppArgs -int 6 -== -bnz if0 -txn ApplicationID -int 0 -== -! -bnz assert2 -err -assert2: -txn NumAccounts -int 0 -== -bnz cond4 -txn NumAccounts -int 1 -== -bnz cond5 -txn NumAppArgs -int 2 -== -bnz cond6 -// transfer asset -txna ApplicationArgs 0 -btoi -store 1 -load 1 -int 0 -== -bnz unless7 -// cannot modify frozen asset -txn Sender -byte base64 Y3I= -app_global_get -== -bnz if9 -int 0 -byte base64 Zno= -app_local_get -int 1 -== -int 1 -bnz if_end10 -if9: -byte base64 Zno= -app_global_get -int 1 -== -if_end10: -! -bnz assert8 -err -assert8: -txn Sender -byte base64 Y3I= -app_global_get -== -bnz if11 -int 0 -byte base64 Ymw= -int 0 -byte base64 Ymw= -app_local_get -load 1 -- -app_local_put -int 1 -bnz if_end12 -if11: -byte base64 Ymw= -byte base64 Ymw= -app_global_get -load 1 -- -app_global_put -if_end12: -unless7: -load 1 -int 0 -== -bnz unless13 -// cannot modify frozen asset -txna Accounts 1 -byte base64 Y3I= -app_global_get -== -bnz if15 -int 1 -byte base64 Zno= -app_local_get -int 1 -== -int 1 -bnz if_end16 -if15: -byte base64 Zno= -app_global_get -int 1 -== -if_end16: -! -bnz assert14 -err -assert14: -txna Accounts 1 -byte base64 Y3I= -app_global_get -== -bnz if17 -int 1 -byte base64 Ymw= -int 1 -byte base64 Ymw= -app_local_get -load 1 -+ -app_local_put -int 1 -bnz if_end18 -if17: -byte base64 Ymw= -byte base64 Ymw= -app_global_get -load 1 -+ -app_global_put -if_end18: -unless13: -txna Accounts 2 -global ZeroAddress -== -bnz unless19 -int 0 -byte base64 Ymw= -app_local_get -store 2 -load 2 -int 0 -== -bnz unless20 -// cannot modify frozen asset -txn Sender -byte base64 Y3I= -app_global_get -== -bnz if22 -int 0 -byte base64 Zno= -app_local_get -int 1 -== -int 1 -bnz if_end23 -if22: -byte base64 Zno= -app_global_get -int 1 -== -if_end23: -! -bnz assert21 -err -assert21: -txn Sender -byte base64 Y3I= -app_global_get -== -bnz if24 -int 0 -byte base64 Ymw= -int 0 -byte base64 Ymw= -app_local_get -load 2 -- -app_local_put -int 1 -bnz if_end25 -if24: -byte base64 Ymw= -byte base64 Ymw= -app_global_get -load 2 -- -app_global_put -if_end25: -unless20: -load 2 -int 0 -== -bnz unless26 -// cannot modify frozen asset -txna Accounts 2 -byte base64 Y3I= -app_global_get -== -bnz if28 -int 2 -byte base64 Zno= -app_local_get -int 1 -== -int 1 -bnz if_end29 -if28: -byte base64 Zno= -app_global_get -int 1 -== -if_end29: -! -bnz assert27 -err -assert27: -txna Accounts 2 -byte base64 Y3I= -app_global_get -== -bnz if30 -int 2 -byte base64 Ymw= -int 2 -byte base64 Ymw= -app_local_get -load 2 -+ -app_local_put -int 1 -bnz if_end31 -if30: -byte base64 Ymw= -byte base64 Ymw= -app_global_get -load 2 -+ -app_global_put -if_end31: -unless26: -unless19: -txn NumAppArgs -int 1 -== -txn NumAccounts -int 2 -== -&& -txn OnCompletion -int 0 -== -bnz if32 -txn OnCompletion -int 2 -== -int 0 -byte base64 Ymw= -app_local_get -int 0 -== -&& -txna Accounts 2 -global ZeroAddress -== -! -&& -int 1 -bnz if_end33 -if32: -txna Accounts 2 -global ZeroAddress -== -if_end33: -&& -int 1 -bnz cond_end3 -cond6: -// clawback asset -txna ApplicationArgs 0 -btoi -store 0 -txna Accounts 1 -byte base64 Y3I= -app_global_get -== -bnz if34 -int 1 -byte base64 Ymw= -int 1 -byte base64 Ymw= -app_local_get -load 0 -- -app_local_put -int 1 -bnz if_end35 -if34: -byte base64 Ymw= -byte base64 Ymw= -app_global_get -load 0 -- -app_global_put -if_end35: -txna Accounts 2 -byte base64 Y3I= -app_global_get -== -bnz if36 -int 2 -byte base64 Ymw= -int 2 -byte base64 Ymw= -app_local_get -load 0 -+ -app_local_put -int 1 -bnz if_end37 -if36: -byte base64 Ymw= -byte base64 Ymw= -app_global_get -load 0 -+ -app_global_put -if_end37: -txn NumAccounts -int 2 -== -txn OnCompletion -int 0 -== -&& -txn Sender -byte base64 Y2w= -app_global_get -== -&& -int 1 -bnz cond_end3 -cond5: -// freeze asset holding -txna Accounts 1 -byte base64 Y3I= -app_global_get -== -bnz if38 -int 1 -byte base64 Zno= -txna ApplicationArgs 0 -btoi -app_local_put -int 1 -bnz if_end39 -if38: -byte base64 Zno= -txna ApplicationArgs 0 -btoi -app_global_put -if_end39: -txn NumAppArgs -int 1 -== -txn OnCompletion -int 0 -== -&& -txn Sender -byte base64 ZnI= -app_global_get -== -&& -int 1 -bnz cond_end3 -cond4: -// asset deletion or opt-in -txn OnCompletion -int 1 -== -! -bnz when40 -// opting in to implicit zero bl -int 0 -byte base64 Zno= -byte base64 ZGY= -app_global_get -app_local_put -when40: -txn NumAppArgs -int 0 -== -txn OnCompletion -int 5 -== -txn Sender -byte base64 bW4= -app_global_get -== -&& -byte base64 dHQ= -app_global_get -byte base64 Ymw= -app_global_get -== -&& -txn OnCompletion -int 1 -== -txn Sender -byte base64 Y3I= -app_global_get -== -! -&& -|| -&& -cond_end3: -int 1 -bnz if_end1 -if0: -// asset configuration -txn ApplicationID -int 0 -== -bnz if41 -txn Sender -byte base64 bW4= -app_global_get -== -txna ApplicationArgs 0 -global ZeroAddress -== -byte base64 bW4= -app_global_get -global ZeroAddress -== -! -|| -&& -txna ApplicationArgs 1 -global ZeroAddress -== -byte base64 cnY= -app_global_get -global ZeroAddress -== -! -|| -&& -txna ApplicationArgs 2 -global ZeroAddress -== -byte base64 ZnI= -app_global_get -global ZeroAddress -== -! -|| -&& -txna ApplicationArgs 3 -global ZeroAddress -== -byte base64 Y2w= -app_global_get -global ZeroAddress -== -! -|| -&& -bnz assert43 -err -assert43: -int 1 -bnz if_end42 -if41: -byte base64 Y3I= -txn Sender -app_global_put -byte base64 dHQ= -txna ApplicationArgs 4 -btoi -app_global_put -byte base64 Ymw= -txna ApplicationArgs 4 -btoi -app_global_put -byte base64 ZGY= -txna ApplicationArgs 5 -btoi -app_global_put -if_end42: -byte base64 bW4= -txna ApplicationArgs 0 -app_global_put -byte base64 cnY= -txna ApplicationArgs 1 -app_global_put -byte base64 ZnI= -txna ApplicationArgs 2 -app_global_put -byte base64 Y2w= -txna ApplicationArgs 3 -app_global_put -txn NumAccounts -int 0 -== -txn OnCompletion -int 0 -== -&& -txna ApplicationArgs 0 -len -int 32 -== -&& -txna ApplicationArgs 1 -len -int 32 -== -&& -txna ApplicationArgs 2 -len -int 32 -== -&& -txna ApplicationArgs 3 -len -int 32 -== -&& -if_end1: diff --git a/utils/programs/asa_approve.teal.tok b/utils/programs/asa_approve.teal.tok deleted file mode 100644 index 98ab10df..00000000 Binary files a/utils/programs/asa_approve.teal.tok and /dev/null differ diff --git a/utils/programs/asa_clear.teal b/utils/programs/asa_clear.teal deleted file mode 100644 index 999b8312..00000000 --- a/utils/programs/asa_clear.teal +++ /dev/null @@ -1,10 +0,0 @@ -#pragma version 2 -byte base64 Ymw= -byte base64 Ymw= -app_global_get -int 0 -byte base64 Ymw= -app_local_get -+ -app_global_put -int 1 diff --git a/utils/programs/asa_clear.teal.tok b/utils/programs/asa_clear.teal.tok deleted file mode 100644 index 464ba9e6..00000000 Binary files a/utils/programs/asa_clear.teal.tok and /dev/null differ diff --git a/utils/programs/assetround.teal b/utils/programs/assetround.teal deleted file mode 100644 index 0b1779d3..00000000 --- a/utils/programs/assetround.teal +++ /dev/null @@ -1,121 +0,0 @@ -#pragma version 2 -// -// Balance -// - -// Check sender's account -int 0 - -// Check app ID as passed in -txna ApplicationArgs 0 -btoi - -// Check balance -asset_holding_get AssetBalance -pop - -// Sender should have correct balance (arg 1) -txna ApplicationArgs 1 -btoi -== -bz fail - -// Check sender's account -int 0 - -// Check app ID as passed in -txna ApplicationArgs 0 -btoi - -// Check frozen status -asset_holding_get AssetFrozen -pop - -// Sender should have correct frozen status (arg 2) -txna ApplicationArgs 2 -btoi -== -bz fail - -// If we shouldn't check params (arg 3), then skip to check round -txna ApplicationArgs 3 -btoi -bnz round - -// -// Params -// - -// Check sender's account (creator) -int 0 - -// Check app ID as passed in -txna ApplicationArgs 0 -btoi - -// Check total against arg 4 -asset_params_get AssetTotal -pop -txna ApplicationArgs 4 -btoi -== -bz fail - -// Check sender's account -int 0 - -// Check app ID as passed in -txna ApplicationArgs 0 -btoi - -// Check name against arg 5 -asset_params_get AssetUnitName -pop -txna ApplicationArgs 5 -== -bz fail - -round: - -// Check round against arg 6 (arg < global Round, arg + 4 > global Round) -txna ApplicationArgs 6 -btoi - -global Round -< -bz fail - -txna ApplicationArgs 6 -btoi - -int 4 -+ - -// Check timestamp against arg 7 (arg < global LatestTimestamp + 60, arg + 60 > global LatestTimestamp) -txna ApplicationArgs 7 -btoi - -global LatestTimestamp -int 60 -+ - -< -bz fail - -txna ApplicationArgs 7 -btoi - -int 60 -+ - -global LatestTimestamp -> -bz fail - -success: -int 1 -return - -fail: -int 0 -return diff --git a/utils/programs/assetround.teal.tok b/utils/programs/assetround.teal.tok deleted file mode 100644 index 5cee76f3..00000000 Binary files a/utils/programs/assetround.teal.tok and /dev/null differ diff --git a/utils/programs/clear_program_state.teal b/utils/programs/clear_program_state.teal deleted file mode 100644 index f83715e4..00000000 --- a/utils/programs/clear_program_state.teal +++ /dev/null @@ -1,4 +0,0 @@ -#pragma version 2 -// This program clears program state - -int 1 diff --git a/utils/programs/clear_program_state.teal.tok b/utils/programs/clear_program_state.teal.tok deleted file mode 100644 index f1b653fe..00000000 --- a/utils/programs/clear_program_state.teal.tok +++ /dev/null @@ -1 +0,0 @@ - " \ No newline at end of file diff --git a/utils/programs/globcheck.teal b/utils/programs/globcheck.teal deleted file mode 100644 index 94ef4a4e..00000000 --- a/utils/programs/globcheck.teal +++ /dev/null @@ -1,69 +0,0 @@ -#pragma version 2 -// This program approves all transactions whose first arg is "hello" -// Then, accounts can write "foo": "bar" to the GlobalState by -// sending a transaction whose first argument is "write". Finally, -// accounts can send the args ["check", xyz] to confirm that the -// key at "foo" is equal to the second argument, xyz - -// If arg 0 is "hello" -txna ApplicationArgs 0 -byte base64 aGVsbG8= -== -bnz succeed - -// else - -// If arg 0 is "write" -txna ApplicationArgs 0 -byte base64 d3JpdGU= -== -bnz write - -// else - -// arg 0 must be "check" -txna ApplicationArgs 0 -byte base64 Y2hlY2s= -== - -// and arg 1 must be the value at "foo" -// Key "foo" -int 0 -byte base64 Zm9v -app_global_get_ex - -// Value must exist -int 0 -== -bnz fail - -// Value must equal arg -txna ApplicationArgs 1 -== -&& - -int 1 -bnz done - -write: -// Write to GlobalState - -// Key "foo" -byte base64 Zm9v - -// Value "bar" -byte base64 YmFy -app_global_put - -int 1 -bnz succeed - -succeed: -int 1 -int 1 -bnz done - -fail: -int 0 - -done: diff --git a/utils/programs/globcheck.teal.tok b/utils/programs/globcheck.teal.tok deleted file mode 100644 index 31efb142..00000000 Binary files a/utils/programs/globcheck.teal.tok and /dev/null differ diff --git a/utils/programs/globwrite.teal b/utils/programs/globwrite.teal deleted file mode 100644 index 443b3e7e..00000000 --- a/utils/programs/globwrite.teal +++ /dev/null @@ -1,12 +0,0 @@ -#pragma version 2 -// Key is "foo" -byte base64 Zm9v - -// Value is ApplicationArgs 0 -txna ApplicationArgs 0 - -// Write it -app_global_put - -int 1 -return diff --git a/utils/programs/globwrite.teal.tok b/utils/programs/globwrite.teal.tok deleted file mode 100644 index 6b18a63b..00000000 Binary files a/utils/programs/globwrite.teal.tok and /dev/null differ diff --git a/utils/programs/globwrite_int.teal b/utils/programs/globwrite_int.teal deleted file mode 100644 index be6ad29b..00000000 --- a/utils/programs/globwrite_int.teal +++ /dev/null @@ -1,13 +0,0 @@ -#pragma version 2 -// Key is "foo" -byte base64 Zm9v - -// Value is ApplicationArgs 0 -txna ApplicationArgs 0 -btoi - -// Write it -app_global_put - -int 1 -return diff --git a/utils/programs/globwrite_int.teal.tok b/utils/programs/globwrite_int.teal.tok deleted file mode 100644 index dfd7316b..00000000 Binary files a/utils/programs/globwrite_int.teal.tok and /dev/null differ diff --git a/utils/programs/loccheck.teal b/utils/programs/loccheck.teal deleted file mode 100644 index a5aa2e3e..00000000 --- a/utils/programs/loccheck.teal +++ /dev/null @@ -1,79 +0,0 @@ -#pragma version 2 -// This program approves all transactions whose first arg is "hello" -// Then, accounts can write "foo": "bar" to their LocalState by -// sending a transaction whose first argument is "write". Finally, -// accounts can send the args ["check", xyz] to confirm that the -// key at "foo" is equal to the second argument, xyz - -// If arg 0 is "hello" -txna ApplicationArgs 0 -byte base64 aGVsbG8= -== -bnz succeed - -// else - -// If arg 0 is "write" -txna ApplicationArgs 0 -byte base64 d3JpdGU= -== -bnz write - -// else - -// arg 0 must be "check" -txna ApplicationArgs 0 -byte base64 Y2hlY2s= -== - -// and arg 1 must be the value at "foo" -// txn.Sender -int 0 - -// App ID (this app) -int 0 - -// Key "foo" -byte base64 Zm9v -app_local_get_ex - -// Value must exist -int 0 -== -bnz fail - -// Value must equal arg -txna ApplicationArgs 1 -== -&& - -int 1 -bnz done - -write: -// Write to our LocalState - -// txn.Sender -int 0 - -// Key "foo" -byte base64 Zm9v - -// Value "bar" -byte base64 YmFy -app_local_put - -int 1 -bnz succeed - -succeed: -int 1 -int 1 -bnz done - -fail: -int 0 -int 1 -bnz done - -done: diff --git a/utils/programs/loccheck.teal.tok b/utils/programs/loccheck.teal.tok deleted file mode 100644 index 81deef21..00000000 Binary files a/utils/programs/loccheck.teal.tok and /dev/null differ diff --git a/utils/programs/locwrite.teal b/utils/programs/locwrite.teal deleted file mode 100644 index a6efb968..00000000 --- a/utils/programs/locwrite.teal +++ /dev/null @@ -1,15 +0,0 @@ -#pragma version 2 -// write to sender's account -int 0 - -// Key is "foo" -byte base64 Zm9v - -// Value is ApplicationArgs 0 -txna ApplicationArgs 0 - -// Write it -app_local_put - -int 1 -return diff --git a/utils/programs/locwrite.teal.tok b/utils/programs/locwrite.teal.tok deleted file mode 100644 index b609513f..00000000 Binary files a/utils/programs/locwrite.teal.tok and /dev/null differ diff --git a/utils/programs/locwrite_int.teal b/utils/programs/locwrite_int.teal deleted file mode 100644 index 9f2414b3..00000000 --- a/utils/programs/locwrite_int.teal +++ /dev/null @@ -1,15 +0,0 @@ -#pragma version 2 -// write to sender's account -int 0 -// Key is "foo" -byte base64 Zm9v - -// Value is ApplicationArgs 0 -txna ApplicationArgs 0 -btoi - -// Write it -app_local_put - -int 1 -return diff --git a/utils/programs/locwrite_int.teal.tok b/utils/programs/locwrite_int.teal.tok deleted file mode 100644 index 98479536..00000000 Binary files a/utils/programs/locwrite_int.teal.tok and /dev/null differ diff --git a/utils/programs/one.teal b/utils/programs/one.teal deleted file mode 100644 index 6e0d8b86..00000000 --- a/utils/programs/one.teal +++ /dev/null @@ -1,2 +0,0 @@ -#pragma version 2 -int 1 diff --git a/utils/programs/one.teal.tok b/utils/programs/one.teal.tok deleted file mode 100644 index f1b653fe..00000000 --- a/utils/programs/one.teal.tok +++ /dev/null @@ -1 +0,0 @@ - " \ No newline at end of file diff --git a/utils/programs/sectok_approve.teal b/utils/programs/sectok_approve.teal deleted file mode 100644 index baf27cb2..00000000 --- a/utils/programs/sectok_approve.teal +++ /dev/null @@ -1,386 +0,0 @@ -#pragma version 2 - -txn ApplicationID -int 0 -== -bnz cond1 -txn OnCompletion -int 5 -== -bnz cond2 -txn OnCompletion -int 4 -== -bnz cond3 -txn OnCompletion -int 1 -== -bnz cond4 -txn OnCompletion -int 0 -== -txn NumAccounts -int 2 -< -&& -bnz assert5 -err -assert5: -txn NumAccounts -int 0 -== -bnz if6 -txn NumAppArgs -int 1 -== -bnz if8 -// config -txn NumAppArgs -int 2 -== -bnz assert10 -err -assert10: -txna ApplicationArgs 0 -byte "cX" -== -txna ApplicationArgs 0 -byte "tX" -== -|| -bnz cond12 -txna ApplicationArgs 0 -byte "mn" -== -bnz cond13 -txna ApplicationArgs 0 -byte "br" -== -bnz cond14 -// set max balance, lock until, transfer group, freeze -int 1 -txna ApplicationArgs 0 -txna ApplicationArgs 1 -btoi -app_local_put -txna ApplicationArgs 0 -byte "fz" -== -int 0 -byte base64 Y1g= -app_local_get -int 1 -== -int 0 -byte base64 dFg= -app_local_get -int 1 -== -|| -&& -int 0 -byte base64 dFg= -app_local_get -int 1 -== -txna ApplicationArgs 0 -byte "mb" -== -txna ApplicationArgs 0 -byte "tl" -== -|| -txna ApplicationArgs 0 -byte "tg" -== -|| -&& -|| -int 1 -bnz cond_end11 -cond14: -// burn -int 1 -byte base64 Ymw= -int 1 -byte base64 Ymw= -app_local_get -txna ApplicationArgs 1 -btoi -- -app_local_put -byte base64 cnY= -byte base64 cnY= -app_global_get -txna ApplicationArgs 1 -btoi -+ -app_global_put -int 0 -byte base64 Y1g= -app_local_get -int 1 -== -int 1 -bnz cond_end11 -cond13: -// mint -int 1 -byte base64 Ymw= -int 1 -byte base64 Ymw= -app_local_get -txna ApplicationArgs 1 -btoi -+ -app_local_put -byte base64 cnY= -byte base64 cnY= -app_global_get -txna ApplicationArgs 1 -btoi -- -app_global_put -int 0 -byte base64 Y1g= -app_local_get -int 1 -== -int 1 -bnz cond_end11 -cond12: -// contract/transfer admin -int 1 -txna ApplicationArgs 0 -txna ApplicationArgs 1 -btoi -app_local_put -int 0 -byte base64 Y1g= -app_local_get -int 1 -== -cond_end11: -int 1 -bnz if_end9 -if8: -// transfer -int 0 -byte base64 Ymw= -int 0 -byte base64 Ymw= -app_local_get -txna ApplicationArgs 0 -btoi -- -app_local_put -int 1 -byte base64 Ymw= -int 1 -byte base64 Ymw= -app_local_get -txna ApplicationArgs 0 -btoi -+ -app_local_put -byte base64 cHM= -app_global_get -int 0 -== -int 1 -byte base64 Ymw= -app_local_get -int 1 -byte base64 bWI= -app_local_get -<= -&& -int 0 -byte base64 Zno= -app_local_get -int 0 -== -&& -int 1 -byte base64 Zno= -app_local_get -int 0 -== -&& -int 0 -byte base64 dGw= -app_local_get -global LatestTimestamp -< -&& -int 1 -byte base64 dGw= -app_local_get -global LatestTimestamp -< -&& -byte 0x0001 -int 0 -byte base64 dGc= -app_local_get -itob -concat -int 1 -byte base64 dGc= -app_local_get -itob -concat -app_global_get -int 1 -- -global LatestTimestamp -< -&& -if_end9: -int 1 -bnz if_end7 -if6: -txn NumAppArgs -int 1 -== -bnz if15 -// transfer-rule -txna ApplicationArgs 2 -btoi -int 0 -== -bnz if17 -byte 0x0001 -txna ApplicationArgs 0 -concat -txna ApplicationArgs 1 -concat -txna ApplicationArgs 2 -btoi -app_global_put -int 1 -bnz if_end18 -if17: -byte 0x0001 -txna ApplicationArgs 0 -concat -txna ApplicationArgs 1 -concat -app_global_del -if_end18: -txna ApplicationArgs 0 -len -int 8 -== -txna ApplicationArgs 1 -len -int 8 -== -&& -txn NumAppArgs -int 3 -== -&& -int 0 -byte base64 dFg= -app_local_get -int 1 -== -&& -int 1 -bnz if_end16 -if15: -// pause -byte base64 cHM= -txna ApplicationArgs 0 -btoi -app_global_put -int 0 -byte base64 Y1g= -app_local_get -int 1 -== -if_end16: -if_end7: -int 1 -bnz cond_end0 -cond4: -// opt-in -txn NumAppArgs -int 0 -== -txn NumAccounts -int 0 -== -&& -int 1 -bnz cond_end0 -cond3: -// upgrade -txn NumAppArgs -int 0 -== -txn NumAccounts -int 0 -== -&& -int 0 -byte base64 Y1g= -app_local_get -int 1 -== -&& -int 1 -bnz cond_end0 -cond2: -// destroy -txn NumAppArgs -int 0 -== -txn NumAccounts -int 0 -== -&& -int 0 -byte base64 Y1g= -app_local_get -int 1 -== -&& -byte base64 cnY= -app_global_get -byte base64 dHQ= -app_global_get -== -&& -int 1 -bnz cond_end0 -cond1: -// create -int 0 -byte base64 Y1g= -int 1 -app_local_put -byte base64 cHg= -txna ApplicationArgs 0 -app_global_put -byte base64 cnY= -txna ApplicationArgs 1 -btoi -app_global_put -byte base64 dHQ= -txna ApplicationArgs 1 -btoi -app_global_put -txn NumAppArgs -int 2 -== -txn NumAccounts -int 0 -== -&& -txn OnCompletion -int 1 -== -&& -cond_end0: diff --git a/utils/programs/sectok_approve.teal.tok b/utils/programs/sectok_approve.teal.tok deleted file mode 100644 index 2cb9d1f8..00000000 Binary files a/utils/programs/sectok_approve.teal.tok and /dev/null differ diff --git a/utils/programs/sectok_clear.teal b/utils/programs/sectok_clear.teal deleted file mode 100644 index 79d6193f..00000000 --- a/utils/programs/sectok_clear.teal +++ /dev/null @@ -1,10 +0,0 @@ -#pragma version 2 - -byte base64 cnY= -byte base64 cnY= -app_global_get -int 0 -byte base64 Ymw= -app_local_get -+ -app_global_put diff --git a/utils/programs/sectok_clear.teal.tok b/utils/programs/sectok_clear.teal.tok deleted file mode 100644 index 7658e0dc..00000000 Binary files a/utils/programs/sectok_clear.teal.tok and /dev/null differ diff --git a/utils/programs/upgraded.teal b/utils/programs/upgraded.teal deleted file mode 100644 index 8ee463ec..00000000 --- a/utils/programs/upgraded.teal +++ /dev/null @@ -1,12 +0,0 @@ -#pragma version 2 -// Key is "foo" -byte base64 Zm9v - -// Value is "foo" -byte base64 Zm9v - -// Write it -app_global_put - -int 1 -return diff --git a/utils/programs/upgraded.teal.tok b/utils/programs/upgraded.teal.tok deleted file mode 100644 index 667843a4..00000000 --- a/utils/programs/upgraded.teal.tok +++ /dev/null @@ -1 +0,0 @@ - &foo((g"C \ No newline at end of file diff --git a/utils/programs/wrongupgrade.teal b/utils/programs/wrongupgrade.teal deleted file mode 100644 index b17d4a89..00000000 --- a/utils/programs/wrongupgrade.teal +++ /dev/null @@ -1,12 +0,0 @@ -#pragma version 2 -// Key is "foo" -byte base64 Zm9v - -// Value is "xxx" -byte base64 eHh4 - -// Write it -app_global_put - -int 1 -return diff --git a/utils/programs/wrongupgrade.teal.tok b/utils/programs/wrongupgrade.teal.tok deleted file mode 100644 index 55a651d2..00000000 --- a/utils/programs/wrongupgrade.teal.tok +++ /dev/null @@ -1 +0,0 @@ - &fooxxx()g"C \ No newline at end of file diff --git a/utils/programs/xappreads.teal b/utils/programs/xappreads.teal deleted file mode 100644 index e8a1fe3e..00000000 --- a/utils/programs/xappreads.teal +++ /dev/null @@ -1,27 +0,0 @@ -#pragma version 2 -// Fetch app idx we want to read global state from -int 1 // ForeignApps index -// Fetch key "foo" -byte base64 Zm9v - -// Get value -app_global_get_ex - -// Should exist -bz fail - -// Value should be "bar" -byte base64 YmFy -== -bz fail - -// Test passed -b succeed - -fail: -int 0 -return - -succeed: -int 1 -return diff --git a/utils/programs/xappreads.teal.tok b/utils/programs/xappreads.teal.tok deleted file mode 100644 index 1d93eccd..00000000 Binary files a/utils/programs/xappreads.teal.tok and /dev/null differ diff --git a/utils/programs/zero.teal b/utils/programs/zero.teal deleted file mode 100644 index c7cc152a..00000000 --- a/utils/programs/zero.teal +++ /dev/null @@ -1,2 +0,0 @@ -#pragma version 2 -int 0 diff --git a/utils/programs/zero.teal.tok b/utils/programs/zero.teal.tok deleted file mode 100644 index 1786b44a..00000000 Binary files a/utils/programs/zero.teal.tok and /dev/null differ diff --git a/utils/unused_steps_analysis.ipynb b/utils/unused_steps_analysis.ipynb new file mode 100644 index 00000000..07b7c699 --- /dev/null +++ b/utils/unused_steps_analysis.ipynb @@ -0,0 +1,903 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cucumber Steps Analysis Notebook\n", + "\n", + "## Regex + Fuzzy Matcher of SDK Implemented Steps Against Actual Feature Steps\n", + "\n", + "### Input - use the `make display-...` commands in each SDK\n", + "### Final outputs look like this [Google spreadsheet](https://docs.google.com/spreadsheets/d/1Szfvw6_OV0cTz-IEN9bTop5ZW2i472D-pmIHyPVJing/edit#gid=737750452)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# also need to install the various Jupyter dependencies and pandas\n", + "\n", + "%pip install gherkin-official\n", + "%pip install fuzzywuzzy\n", + "\n", + "# needed for faster fuzzywuzzy:\n", + "%pip install python-Levenshtein" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from dataclasses import dataclass\n", + "from functools import reduce\n", + "from fuzzywuzzy import fuzz, process as fzp\n", + "import gherkin\n", + "import gherkin.parser\n", + "import pandas as pd\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: parse all Gherkin features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_features_df():\n", + " units = (Path.cwd().parent / \"features\" / \"unit\").glob(\"*.feature\")\n", + " integrations = (Path.cwd().parent / \"features\" / \"integration\").glob(\"*feature\")\n", + " dfu = pd.DataFrame(data=[{\"test_type\": \"unit\", \"feature_path\": line} for line in units])\n", + " dfi = pd.DataFrame(data=[{\"test_type\": \"integration\", \"feature_path\": line} for line in integrations])\n", + " feat_df = pd.concat([dfu, dfi])\n", + " feat_df[\"feature\"] = feat_df.feature_path.apply(lambda s: s.name)\n", + " return feat_df.set_index(\"feature\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "feat_df = get_features_df()\n", + "feat_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "@dataclass(eq=True, order=True, frozen=True)\n", + "class Step:\n", + " keyword: str\n", + " text: str\n", + "\n", + "def parse_features(feature_path):\n", + " parser = gherkin.parser.Parser()\n", + " with open(feature_path) as f:\n", + " feature_info = gherkin.token_scanner.TokenScanner(f.read())\n", + " return parser.parse(feature_info)\n", + "\n", + "def extract_all(key: str, d: dict, append_method=\"extend\") -> list:\n", + " extracted = []\n", + " def extractor(_d):\n", + " if key in _d:\n", + " v = _d[key]\n", + " if append_method == \"extend\":\n", + " extracted.extend(v)\n", + " else:\n", + " extracted.append(v)\n", + " for k, v in _d.items():\n", + " if k != key and isinstance(v, dict):\n", + " extractor(v)\n", + " elif isinstance(v, list):\n", + " for a in v:\n", + " if isinstance(a, dict):\n", + " extractor(a)\n", + " extractor(d)\n", + " return extracted\n", + "\n", + "def uniq(s: list):\n", + " return sorted(list(set(s)))\n", + "\n", + "def extract_tags(feature_info: dict) -> list:\n", + " return uniq([tag[\"name\"] for tag in extract_all(\"tags\", feature_info)])\n", + "\n", + "def extract_steps(feature_info: dict) -> list:\n", + " return uniq([Step(step[\"keyword\"],step[\"text\"]) for step in extract_all(\"steps\", feature_info)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Example: extract cucumber info for `c2c.feature`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "feature=\"c2c.feature\"\n", + "feat_df = get_features_df()\n", + "eg_feature = feat_df[feat_df.index == feature].feature_path.iloc[0]\n", + "\n", + "feature_info = parse_features(eg_feature)\n", + "tags = extract_tags(feature_info)\n", + "steps = extract_steps(feature_info)\n", + "\n", + "tags, steps, feature_info" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### All the Tags" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def append_tags(feat_df):\n", + " def mapper(p):\n", + " feature_info = parse_features(p)\n", + " return extract_tags(feature_info)\n", + " \n", + " feat_df[\"tags\"] = feat_df.feature_path.apply(mapper)\n", + "\n", + "tags_df = get_features_df()\n", + "append_tags(tags_df)\n", + "\n", + "tags_df[['test_type', 'tags']]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "all_tags = uniq(reduce(lambda l,x : l+x, tags_df.tags, []))\n", + "print(all_tags)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### All the Steps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_step2feat(feat_df):\n", + " def mapper(row):\n", + " feature_info = parse_features(row.feature_path)\n", + " return (row.feature, extract_steps(feature_info))\n", + " \n", + " feat_df = feat_df.reset_index()\n", + " steps = feat_df.apply(mapper, axis=1)\n", + " steps = pd.DataFrame(reduce(lambda xs, x: xs + [{\"feature\": x[0], \"step\": y} for y in x[1]], steps, []))\n", + " steps[\"gwt\"] = steps.step.apply(lambda step: step.keyword)\n", + " steps[\"step\"] = steps.step.apply(lambda step: step.text)\n", + "\n", + " feat_df = feat_df.set_index(\"feature\")\n", + " steps = steps.set_index(\"feature\")\n", + "\n", + " return feat_df.join(steps)\n", + "\n", + "def fill_step_templates(steps_df):\n", + " subs = {\n", + " r'\"<[^>]*>\"': '\"hello\"',\n", + " r'<[^(][^>]*>': '42',\n", + " }\n", + " steps_df[\"filled_step\"] = steps_df.step.replace(subs.keys(), subs.values(), regex=True)\n", + " return steps_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "all_steps = get_step2feat(get_features_df())\n", + "all_steps = fill_step_templates(all_steps)\n", + "all_steps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "filled_steps = all_steps.groupby(by=\"filled_step\").count()\n", + "filled_steps = filled_steps[[\"step\"]].rename(columns={\"step\": \"count\"}).sort_values(by=\"count\", ascending=False)\n", + "filled_steps = filled_steps.reset_index()\n", + "filled_steps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# filled_steps.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: parse the SDK-steps summaries into Pandas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2A) Java\n", + "\n", + "### e.g., created in the Java SDK via \n", + "```sh\n", + "make display-all-java-steps\n", + "```\n", + "\n", + "### i.e.:\n", + "```sh\n", + "find . 2>/dev/null | xargs grep \"io.cucumber.java.en\" 2>/dev/null | grep -v Binary | cut -d: -f1 | sort | uniq | xargs grep -E \"@(Given|Then|When)\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### `java_source2step`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# keeping a small sample for illustrative purposes:\n", + "\n", + "java_source2step = \"\"\"./src/test/java/com/algorand/algosdk/cucumber/shared/TransactionSteps.java: @When(\"I build an application transaction with operation {string}, application-id {long}, sender {string}, approval-program {string}, clear-program {string}, global-bytes {long}, global-ints {long}, local-bytes {long}, local-ints {long}, app-args {string}, foreign-apps {string}, foreign-assets {string}, app-accounts {string}, fee {long}, first-valid {long}, last-valid {long}, genesis-hash {string}, extra-pages {long}\")\n", + "./src/test/java/com/algorand/algosdk/integration/Stepdefs.java: @Then(\"I do my part\")\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `javasdk_df`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "java_source_and_step = [s2s.split(\": \") for s2s in java_source2step.split(\"\\n\")]\n", + "javasdk_df = pd.DataFrame(data=[{\"source\": line[0], \"raw_step\": line[1]} for line in java_source_and_step])\n", + "javasdk_df[[\"gwt\",\"step\"]] = javasdk_df.raw_step.str.extract(r'@([^(]*).\"([^\"]*)\"')\n", + "javasdk_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Rexify - `javasdk_rex_df`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "subs = {\n", + " ')': '\\)',\n", + " '{string}': '\"([^\"]*)\"',\n", + " '{int}': '(\\d+)',\n", + " '{long}': '(\\d+)',\n", + " '{biginteger}': '(\\d+)',\n", + "}\n", + "javasdk_rex_df = javasdk_df.copy()\n", + "for k, v in subs.items():\n", + " javasdk_rex_df[\"step\"] = javasdk_rex_df.step.str.replace(k, v, regex=False)\n", + "javasdk_rex_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# javasdk_rex_df.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2B) Python\n", + "\n", + "### e.g., created in the Python SDK via\n", + "```sh\n", + "make display-all-python-steps\n", + "```\n", + "\n", + "### i.e.:\n", + "```sh\n", + "find tests/steps -name \"*.py\" | xargs grep \"behave\" 2>/dev/null | cut -d: -f1 | sort | uniq | xargs awk \"/@(given|step|then|when)/,/[)]/\" | grep -E \"(\\\".+\\\"|\\'.+\\')\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# keeping a small sample for illustrative purposes:\n", + "\n", + "py_steps = \"\"\" 'we make an Account Information call against account \"{account}\" with exclude \"{exclude:MaybeString}\"'\n", + "@when('we make an Account Information call against account \"{account}\"')\n", + " 'we make a Lookup Account by ID call against account \"{account}\" with round {block}'\n", + " 'we make a Lookup Account by ID call against account \"{account}\" with exclude \"{exclude:MaybeString}\"'\n", + "@when(\"we make any LookupAccountByID call\")\n", + "@then('the parsed LookupAccountByID response should have address \"{address}\"')\n", + "@when(\"we make any Account Information call\")\n", + " 'the parsed Account Information response should have address \"{address}\"'\n", + "@then(\"I do my part\")\"\"\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `pysdk_df` - Unprocessed Steps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pysdk_df = pd.DataFrame(data=[{\"raw_step\": line} for line in py_steps.split(\"\\n\")])\n", + "pysdk_df[[\"1\", \"2\"]] = pysdk_df.raw_step.str.extract(r'@(given|step|then|when).(.*).')\n", + "pysdk_df[\"step\"] = pysdk_df.apply(lambda row: (row[\"raw_step\"][4:] if pd.isnull(row[\"2\"]) else row[\"2\"])[1:-1], axis=1)\n", + "pysdk_df = pysdk_df.drop([\"1\", \"2\"], axis=1)\n", + "pysdk_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Rexify - `pysdk_rex_df`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "subs = {\n", + " r'\"\\{[^}]*\\}\"': '\"([^\"]*)\"',\n", + " r'\\{[^(][^}]*\\}': '([0-9]+)',\n", + "}\n", + "pysdk_rex_df = pysdk_df.copy()\n", + "pysdk_rex_df[\"step\"] = pysdk_rex_df.step.replace(subs.keys(), subs.values(), regex=True)\n", + "pysdk_rex_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pysdk_rex_df.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2C) Go\n", + "\n", + "### e.g., created in the Go SDK via\n", + "```sh\n", + "make display-all-go-steps\n", + "```\n", + "\n", + "### i.e.:\n", + "```sh\n", + "find test -name \"*.go\" | xargs grep \"github.com/cucumber/godog\" 2>/dev/null | cut -d: -f1 | sort | uniq | xargs grep -Eo \"Step[(].[^\\`]+\" | awk '{sub(/:Step\\(./,\":\")} 1' | sed -E 's/\", [a-zA-Z0-9]+\\)//g'\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# keeping a small sample for illustrative purposes:\n", + "\n", + "go_source2step =\"\"\"test/algodclientv2_test.go:^mock http responses in \"([^\"]*)\" loaded from \"([^\"]*)\"$\n", + "test/algodclientv2_test.go:^expect error string to contain \"([^\"]*)\"$\n", + "test/algodclientv2_test.go:^we make any Pending Transaction Information call$\n", + "test/algodclientv2_test.go:^the parsed Pending Transaction Information response should have sender \"([^\"]*)\"$\n", + "test/steps_test.go:I do my part\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `gosdk_df` - already Rexify'ed" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "go_source_and_step = [s2s.split(\":\") for s2s in go_source2step.split(\"\\n\")]\n", + "gosdk_df = pd.DataFrame(data=[{\"source\": line[0], \"step\": line[1]} for line in go_source_and_step])\n", + "gosdk_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# gosdk_df.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D) Javascript\n", + "\n", + "### e.g., created in the Javascript SDK via\n", + "```sh\n", + "make display-all-hs-steps\n", + "```\n", + "\n", + "### i.e.:\n", + "```sh\n", + "tail -n +135 tests/cucumber/steps/steps.js | grep -v '^ *//' | awk \"/(Given|Then|When)/,/',/\" | grep -E \"\\'.+\\'\" | sed \"s/^[^']*'\\([^']*\\)'.*/\\1/g\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### `js_steps`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# keeping a small sample for illustrative purposes:\n", + "\n", + "js_steps = \"\"\"an algod client\n", + "a kmd client\n", + "an algod v2 client\n", + "wallet information\n", + "I get versions with algod\n", + "v1 should be in the versions\n", + "I get versions with kmd\n", + "I get the status\n", + "I get status after this block\n", + "I can get the block info\n", + "payment transaction parameters {int} {int} {int} {string} {string} {string} {int} {string} {string}\n", + "mnemonic for private key {string}\n", + "we expect the path used to be {string}\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `jssdk_df` - Unprocessed" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "jssdk_df = pd.DataFrame(data=[{\"step\": line} for line in js_steps.split(\"\\n\")])\n", + "jssdk_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# jssdk_df.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Rexify - `jssdk_rex_df`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "subs = {\n", + " ')': '\\)',\n", + " '{string}': '\"([^\"]*)\"',\n", + " '{int}': '(\\d+)',\n", + "}\n", + "jssdk_rex_df = jssdk_df.copy()\n", + "for k, v in subs.items():\n", + " jssdk_rex_df[\"step\"] = jssdk_rex_df.step.str.replace(k, v, regex=False)\n", + "jssdk_rex_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# jssdk_rex_df.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3) simulate Cucumber regex matcher" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def match_stepre2cucumber(step_re, cuke_df):\n", + " matches = cuke_df[cuke_df.filled_step.str.match(step_re)]\n", + " return None if matches.empty else matches.iloc[0].filled_step\n", + "\n", + "jss = jssdk_rex_df.iloc[2]\n", + "jsm = match_stepre2cucumber(jss.step, filled_steps)\n", + "\n", + "print(f\"\"\"{jss=}\n", + "{jsm=}\"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def match_sdk2cucumber(sdk_rex_df, cuke_df, discard_matched=True):\n", + " matches = sdk_rex_df.copy()\n", + " matches[\"cuke\"] = matches.step.apply(lambda step: match_stepre2cucumber(step, cuke_df))\n", + " if discard_matched:\n", + " matches = matches[pd.isna(matches.cuke)]\n", + " return matches" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3A) `javasdk_rex_unmatched`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "javasdk_rex_unmatched = match_sdk2cucumber(javasdk_rex_df, filled_steps)\n", + "javasdk_rex_unmatched" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3B) `pysdk_rex_unmatched`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pysdk_rex_unmatched = match_sdk2cucumber(pysdk_rex_df, filled_steps)\n", + "pysdk_rex_unmatched" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3C) `gosdk_rex_unmatched`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gosdk_rex_unmatched = match_sdk2cucumber(gosdk_df, filled_steps)\n", + "gosdk_rex_unmatched" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3D) `jssdk_rex_unmatched`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "jssdk_rex_unmatched = match_sdk2cucumber(jssdk_rex_df, filled_steps)\n", + "jssdk_rex_unmatched" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(f\"\"\"\n", + "--- AFTER APPLYING REGEX MATCHING, WE HAVE THE FOLLOWING COUNTS OF UNMATCHED STEPS. APPLY FUZZY MATCHER IF ANY REMAIN:\n", + "* {len(javasdk_rex_unmatched)=}\n", + "* {len(pysdk_rex_unmatched)=}\n", + "* {len(gosdk_rex_unmatched)=}\n", + "* {len(jssdk_rex_unmatched)=}\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4) fuzzy match remaining SDK steps against features\n", + "\n", + "### NOTE: if an SDK's `*_rex_ummatched` is empty, the fuzzy matcher will fail, as there is nothing to match. In that case, there are probably _NO UNUSED STEPS_" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def fuzz_step_v_df(step, df, total_scorer=True):\n", + " scorer = fuzz.ratio if total_scorer else fuzz.partial_ratio\n", + " return fzp.extractOne(step, df.step, scorer=scorer)\n", + "\n", + "def fuzzing_algo(samples_df, scoring_df):\n", + " \"\"\"\n", + " samples_df - \"unknown\" strings to score\n", + " scoring_df - \"univierse\" of known strings to search and find the \"best_match\"\n", + " \"\"\"\n", + " def matcher(left, total_scorer: bool):\n", + " matches = []\n", + " cols = [\"match\", \"score\", \"idx\"]\n", + " if total_scorer:\n", + " cols = list(map(lambda s: f\"total_{s}\", cols))\n", + "\n", + " def fuzzer(row):\n", + " return fuzz_step_v_df(row.step, scoring_df, total_scorer=total_scorer)\n", + "\n", + " msi = left.apply(fuzzer, axis=1, result_type='expand').rename(columns=dict(enumerate(cols)))\n", + " return pd.concat([left, msi], axis=1)\n", + " \n", + " res = matcher(samples_df, total_scorer=True)\n", + " res = res[res.total_score < 100]\n", + "\n", + " res = matcher(res, total_scorer=False) \n", + " return res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4A) fuzzy logic against javasdk" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "java_remainder = fuzzing_algo(javasdk_rex_unmatched, all_steps)\n", + "java_remainder = java_remainder.sort_values(by='score')\n", + "java_remainder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# java_remainder.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4B) fuzzy logic against pysdk" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "py_remainder = fuzzing_algo(pysdk_rex_unmatched, all_steps)\n", + "py_remainder = py_remainder.sort_values(by='score')\n", + "py_remainder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# py_remaninder.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4C) fuzzy logic against gosdk" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "go_remainder = fuzzing_algo(gosdk_rex_unmatched, all_steps)\n", + "go_remainder = go_remainder.sort_values(by='score')\n", + "go_remainder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# go_remainder.to_clipboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4D) fuzzy logic against jssdk" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "js_remainder = fuzzing_algo(jssdk_rex_unmatched, all_steps)\n", + "js_remainder = js_remainder.sort_values(by='score')\n", + "js_remainder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# js_remainder.to_clipboard()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10.4 ('py310testing-utils': venv)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.4" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "e4ee0aa24134698b20a3d6812affd410c18b1b8ee586c10cdabfed71e9fc6557" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}