diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index baa0901e5844..000000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,80 +0,0 @@ -version: 2.1 -jobs: - build: - machine: - image: ubuntu-1604:202004-01 - steps: - - checkout - - run: - name: Build - command: | - make docker-build - no_output_timeout: 2400s - - run: sudo chown -R 100:1000 docker/config/ && sudo chmod -R 777 docker/config/ - - run: - name: Infra standup - working_directory: /home/circleci/project/docker - command: docker-compose up ganache truffle - background: true - # prevent docker network creation race condition - - run: sleep 5 - - run: - name: Test - working_directory: /home/circleci/project/docker - command: docker-compose up vault_server - no_output_timeout: 2400s - - run: - name: Test validation - working_directory: /home/circleci/project/docker - command: exit $(docker-compose logs | grep -c "DID NOT PASS THE REQUIRED TEST") - - run: - name: Save Docker image - command: | - mkdir -p /tmp/workspace - docker save -o /tmp/workspace/omgnetwork_vault-latest.tar omgnetwork/vault:latest - - persist_to_workspace: - root: /tmp/workspace - paths: - - "omgnetwork_vault-latest.tar" - - publish: - machine: - image: ubuntu-1604:202004-01 - environment: - GCR_PREFIX: gcr.io/omisego-development - IMMUTABILITY_IMAGE: omgnetwork/vault - steps: - - attach_workspace: - at: /tmp/workspace - - checkout - - run: - name: Install GCloud SDK - command: | - echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list - curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - - sudo apt-get update && sudo apt-get install google-cloud-sdk - - run: - name: Publish to GCR - command: | - export SEMVER=$(cat ./VERSION) - echo $GCLOUD_SERVICE_KEY | gcloud auth activate-service-account --key-file=- - gcloud -q auth configure-docker - docker load -i /tmp/workspace/omgnetwork_vault-latest.tar - docker tag $IMMUTABILITY_IMAGE:latest $GCR_PREFIX/$IMMUTABILITY_IMAGE:$SEMVER - docker push $GCR_PREFIX/$IMMUTABILITY_IMAGE:$SEMVER - -workflows: - version: 2 - build-test-lint: - jobs: - - build - - publish: - requires: [build] - filters: &master_and_version_branches_and_all_tags - branches: - only: - - master - - /^v[0-9]+\.[0-9]+/ - tags: - only: - - /.+/ diff --git a/.github/workflows/deploy2aws-integration.yml b/.github/workflows/deploy2aws-integration.yml index 3c43061723d0..1784b92f916a 100644 --- a/.github/workflows/deploy2aws-integration.yml +++ b/.github/workflows/deploy2aws-integration.yml @@ -26,13 +26,12 @@ jobs: run: | cd ops_omgx ./cfn-devenv.sh stop --stack-name integration - ./cfn-devenv.sh restart --stack-name integration --service-name l1-proxy - ./cfn-devenv.sh restart --stack-name integration --service-name deployer + ./cfn-devenv.sh stop --stack-name integration-replica - name: Update All other services run: | cd ops_omgx - rm -rf cloudformation/deployer-rinkeby.yaml + rm -rf cloudformation/deployer-rinkeby.yaml cloudformation/dummy-transaction.yaml cloudformation/omgx-monitor.yaml ./cfn-devenv.sh update --stack-name integration --secret-name ${{ github.event.inputs.secretname }} --deploy-tag ${{ github.sha }} - cd cloudformation - aws cloudformation update-stack --stack-name integration-l1l2test --capabilities CAPABILITY_NAMED_IAM --template-body=file://04-l1-l2-test-scheduled-ecs-task.yaml --region us-east-1 --parameters ParameterKey=SecretName,ParameterValue=${{ github.event.inputs.secretname }} + ./cfn-devenv.sh restart --stack-name integration + ./cfn-devenv.sh restart --stack-name integration-replica diff --git a/.github/workflows/omgx-publish-develop.yml b/.github/workflows/omgx-publish-develop.yml index c1f88399b592..88812a698750 100644 --- a/.github/workflows/omgx-publish-develop.yml +++ b/.github/workflows/omgx-publish-develop.yml @@ -4,7 +4,7 @@ on: push: branches: - 'develop' - - 'mm/dtl-deployer-combined' + - 'inomurko/vault-integration' jobs: @@ -61,17 +61,16 @@ jobs: working-directory: ./ops run: | ./scripts/build-ci.sh - - name: Rename and retag the optimism images working-directory: ./ops run: | for i in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep omgx); do - docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):latest + docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):${{ github.sha }} done for i in $(docker images --format "{{.Repository}}:{{.Tag}}" | grep ethereumoptimism); do - docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):latest - docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):latest + docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):${{ github.sha }} + docker image tag "$i" omgx/$(echo $i | awk -F'/' '{print $2}' | awk -F':' '{print $1}'):${{ github.sha }} done docker images @@ -104,3 +103,28 @@ jobs: github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} label: ${{ needs.start-runner.outputs.label }} ec2-instance-id: ${{ needs.start-runner.outputs.ec2-instance-id }} + + push2aws: + needs: stop-runner + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_USERNAME }} + password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN_SECRET }} + + - name: Build and push docker images to AWS + run: | + cd ops_omgx + rm -rf cloudformation/deployer-rinkeby.yaml cloudformation/dummy-transaction.yaml cloudformation/omgx-monitor.yaml cloudformation/blockexplorer-blockscout.yaml cloudformation/transaction-monitor.yaml + ./cfn-devenv.sh push2aws --from-tag ${{ github.sha }} --deploy-tag ${{ github.sha }} diff --git a/.github/workflows/vault.yml b/.github/workflows/vault.yml new file mode 100644 index 000000000000..49ede492890b --- /dev/null +++ b/.github/workflows/vault.yml @@ -0,0 +1,110 @@ +name: Vault tests + + +on: + push: + paths: + - 'packages/omgx/immutability/**' + branches: + - 'master' + - 'develop' + - '*rc' + - 'regenesis/*' + pull_request: + paths: + - 'packages/omgx/immutability/**' + branches: + - 'master' + - 'develop' + - '*rc' + - 'regenesis/*' + workflow_dispatch: + +defaults: + run: + working-directory: ./ops + +jobs: + start-runner: + name: Start self-hosted EC2 runner + runs-on: ubuntu-latest + outputs: + label: ${{ steps.start-ec2-runner.outputs.label }} + ec2-instance-id: ${{ steps.start-ec2-runner.outputs.ec2-instance-id }} + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_REGION }} + - name: Start EC2 runner + id: start-ec2-runner + uses: machulav/ec2-github-runner@v2 + with: + mode: start + github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} + ec2-image-id: ami-00b46fa1102c70ff2 + ec2-instance-type: t2.xlarge + subnet-id: subnet-905870ae + security-group-id: sg-0855631d714870b32 + + vault_tests: + needs: start-runner + runs-on: ${{ needs.start-runner.outputs.label }} + env: + DATA_DIR: "vault/data/immutability/config" + steps: + - uses: actions/checkout@v2 + - name: Run vault and execute tests + working-directory: ./ops + run: | + mkdir -p $DATA_DIR + sudo chown -R 100:1000 $DATA_DIR && sudo chmod -R 777 $DATA_DIR + RUN_TEST=true TEST=true docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml up -d --build builder l1_chain deployer vault + + - name: Building logs + working-directory: ./ops + run: | + sleep 60s + docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml logs + + - name: Wait for Vault + working-directory: ./ops + run: | + while [ $(docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml logs | grep -c "Done with tests.") -ne 1 ]; + do + sleep 1 + echo "Waiting for Vault..." + done + echo "Vault has executed tests" + docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml logs + + - name: Test validation + working-directory: ./ops + run: exit $(docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml logs | grep -c "DID NOT PASS THE REQUIRED TEST") + + - name: Build the services + working-directory: ./ops + run: ./scripts/build-ci.sh + + - name: Bring the stack up + working-directory: ./ops + run: | + docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml down + rm -rf vault/ + docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml up -d + + - name: Wait for the Sequencer node + working-directory: ./ops + run: ./scripts/wait-for-sequencer.sh + + - name: Start background logging + working-directory: ./ops + run: docker-compose -f docker-compose.yml logs --follow & + + - name: Run the integration tests + working-directory: ./ops + run: docker-compose run integration_tests + + diff --git a/.gitignore b/.gitignore index db3caf236e3c..278117fb31c8 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,9 @@ env-mainnet.yml .serverless +ops/vault/data +append-sequencer-batch.hcl +append-state-batch-proposer.hcl # subgraph build generated diff --git a/ops/docker-compose-nobuild.yml b/ops/docker-compose-nobuild.yml index d35d6b658baa..9b9772bccc21 100644 --- a/ops/docker-compose-nobuild.yml +++ b/ops/docker-compose-nobuild.yml @@ -209,3 +209,18 @@ services: environment: GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL: http://l2geth:8545 GAS_PRICE_ORACLE_PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + + vault: + image: omgx/vault + deploy: + replicas: 0 + ports: + - "127.0.0.1:8200:8200" + volumes: + - "/tmp/vault_auth:/vault/config:rw" + entrypoint: + - "/bin/sh" + - -ec + - | + sleep 2 + /vault/vault.sh diff --git a/ops/docker-compose.yml b/ops/docker-compose.yml index e1c6e7cc8815..efd3ca2a0854 100644 --- a/ops/docker-compose.yml +++ b/ops/docker-compose.yml @@ -339,52 +339,6 @@ services: L2_CHAINID: 31338 #unfortunately, elsewhere the L2_CHAINID is called CHAIN_ID << : *integration_pk - # good idea, but never actually used? - # # and, tests for all the OMGX-specific services - # omgx_test_contracts: - # image: omgx/builder - # deploy: - # replicas: 0 - # build: - # context: .. - # dockerfile: ./ops/docker/Dockerfile.monorepo - # entrypoint: - # - "/bin/sh" - # - -ecx - # - | - # cd /optimism/packages/omgx/contracts - # yarn test:integration - # environment: - # L1_NODE_WEB3_URL: http://l1_chain:8545 - # L2_NODE_WEB3_URL: http://l2geth:8545 - # URL: http://deployer:8081/addresses.json - # OMGX_URL: http://omgx_deployer:8079/addresses.json - # TEST_PRIVATE_KEY_1: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" - # TEST_PRIVATE_KEY_2: "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba" - # TEST_PRIVATE_KEY_3: "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e" - - # omgx_test_relayer: - # image: omgx/builder - # deploy: - # replicas: 0 - # build: - # context: .. - # dockerfile: ./ops/docker/Dockerfile.monorepo - # entrypoint: - # - "/bin/sh" - # - -ecx - # - | - # cd /optimism/packages/omgx/message-relayer-fast - # yarn test:integration - # environment: - # L1_NODE_WEB3_URL: http://l1_chain:8545 - # L2_NODE_WEB3_URL: http://l2geth:8545 - # URL: http://deployer:8081/addresses.json - # OMGX_URL: http://omgx_deployer:8079/addresses.json - # TEST_PRIVATE_KEY_1: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" - # TEST_PRIVATE_KEY_2: "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba" - # TEST_PRIVATE_KEY_3: "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e" - # gas price system gas_oracle: depends_on: diff --git a/packages/omgx/immutability/Dockerfile b/ops/docker/Dockerfile.omgx_vault similarity index 77% rename from packages/omgx/immutability/Dockerfile rename to ops/docker/Dockerfile.omgx_vault index a920eb7b2ffa..d64c7165d074 100644 --- a/packages/omgx/immutability/Dockerfile +++ b/ops/docker/Dockerfile.omgx_vault @@ -10,14 +10,17 @@ RUN apk update && apk add git openssh gcc musl-dev linux-headers WORKDIR /app -COPY go.mod . -COPY go.sum . +COPY packages/omgx/immutability/go.mod . +COPY packages/omgx/immutability/go.sum . +COPY packages/omgx/immutability/config/vault.hcl . # Get deps - will also be cached if we won't change mod/sum RUN go version RUN go mod download -COPY / . +COPY ./ops/scripts/vault.sh . + +COPY packages/omgx/immutability/ . RUN mkdir -p /app/bin \ && CGO_ENABLED=1 GOOS=linux go build -a -i -o /app/bin/immutability-eth-plugin . \ && sha256sum -b /app/bin/immutability-eth-plugin > /app/bin/SHA256SUMS @@ -29,7 +32,7 @@ FROM vault:latest # we pass epoch time so it always upgrades ARG always_upgrade RUN echo ${always_upgrade} > /dev/null && apk update && apk upgrade -RUN apk add bash openssl jq +RUN apk add bash openssl jq curl USER vault WORKDIR /vault RUN mkdir -p /vault/ca \ @@ -39,4 +42,8 @@ RUN mkdir -p /vault/ca \ # Install the plugin. COPY --from=build /app/bin/immutability-eth-plugin /vault/plugins/immutability-eth-plugin COPY --from=build /app/bin/SHA256SUMS /vault/plugins/SHA256SUMS +COPY --from=build /app/vault.sh /vault/vault.sh +COPY --from=build /app/vault.hcl /vault/config/ +COPY --from=build /app/vault.hcl /vault/vault.hcl +COPY ./ops/scripts/provision_vault.sh . HEALTHCHECK CMD nc -zv 127.0.0.1 8900 || exit 1 diff --git a/ops/scripts/build-ci.sh b/ops/scripts/build-ci.sh index 91b5e644f69f..52e544c1f4a9 100755 --- a/ops/scripts/build-ci.sh +++ b/ops/scripts/build-ci.sh @@ -1,4 +1,4 @@ -yarn +yarn yarn build docker-compose build -- builder @@ -9,15 +9,15 @@ docker-compose build -- deployer docker rmi $(docker images -f "dangling=true" -q) -docker-compose build -- l2geth +docker-compose build -- l2geth docker-compose build -- l1_chain docker-compose build -- batch_submitter docker-compose build -- dtl docker-compose build -- relayer docker-compose build -- integration_tests - +docker-compose -f docker-compose.yml -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml build -- vault docker rmi $(docker images -f "dangling=true" -q) docker ps -wait \ No newline at end of file +wait diff --git a/ops/scripts/provision_vault.sh b/ops/scripts/provision_vault.sh new file mode 100755 index 000000000000..5d1577f87517 --- /dev/null +++ b/ops/scripts/provision_vault.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +rm /vault/test/tokens_and_accounts.sh || true +apk add --quiet --no-progress --update --no-cache make gcc g++ +apk add --quiet --no-progress --update --no-cache python3 && ln -sf python3 /usr/bin/python +python3 -m ensurepip +pip3 install --no-cache --upgrade pip setuptools +apk add --quiet --no-progress --update nodejs npm +cd /vault/test && npm install +nohup /vault/vault.sh > /tmp/vault.out & +while [ $(cat /tmp/vault.out | grep -c "Success! Enabled the immutability-eth-plugin secrets engine at: immutability-eth-plugin/") -ne 1 ]; +do + sleep 10 + echo "Waiting for Vault setup to finish..." +done +export VAULT_TOKEN=$(cat /vault/config/unseal.json | jq -r .root_token) +echo "Config and provisioning, create tokens_and_accounts.sh" +bash /vault/test/config.sh +RETRIES=${RETRIES:-60} +if [[ ! -z "$URL" ]]; then + # get the addrs from the URL provided + ADDRESSES=$(curl --fail --show-error --silent --retry-connrefused --retry $RETRIES --retry-delay 5 $URL) + echo $ADDRESSES + export OVM_CTC=$(echo $ADDRESSES | jq -r '.OVM_CanonicalTransactionChain') && echo $OVM_CTC + export OVM_SCC=$(echo $ADDRESSES | jq -r '.OVM_StateCommitmentChain') && echo $OVM_SCC +fi +echo "Sourcing tokens and accounts" +source /vault/test/tokens_and_accounts.sh + # cleanup +rm /vault/test/tokens_and_accounts.sh +echo "Executing tests" +/vault/test/execute_tests.sh diff --git a/ops/scripts/vault.sh b/ops/scripts/vault.sh new file mode 100755 index 000000000000..0811b43d92d9 --- /dev/null +++ b/ops/scripts/vault.sh @@ -0,0 +1,168 @@ +#!/bin/bash + +# Vault running in the container must listen on a different port. + +VAULT_CREDENTIALS="/vault/config/unseal.json" + +CONFIG_DIR="/vault/config" + +CA_CERT="$CONFIG_DIR/ca.crt" +CA_KEY="$CONFIG_DIR/ca.key" +TLS_KEY="$CONFIG_DIR/my-service.key" +TLS_CERT="$CONFIG_DIR/my-service.crt" +CONFIG="$CONFIG_DIR/openssl.cnf" +CSR="$CONFIG_DIR/my-service.csr" + +export VAULT_ADDR="$VAULT_ADDR" +export VAULT_CACERT="$CA_CERT" + +function create_config { + cat > "$CONFIG" << EOF + +[req] +default_bits = 2048 +encrypt_key = no +default_md = sha256 +prompt = no +utf8 = yes + +# Speify the DN here so we aren't prompted (along with prompt = no above). +distinguished_name = req_distinguished_name + +# Extensions for SAN IP and SAN DNS +req_extensions = v3_req + +# Be sure to update the subject to match your organization. +[req_distinguished_name] +C = TH +ST = Bangkok +L = Vault +O = omiseGO +CN = localhost + +# Allow client and server auth. You may want to only allow server auth. +# Link to SAN names. +[v3_req] +basicConstraints = CA:FALSE +subjectKeyIdentifier = hash +keyUsage = digitalSignature, keyEncipherment +extendedKeyUsage = clientAuth, serverAuth +subjectAltName = @alt_names + +# Alternative names are specified as IP.# and DNS.# for IPs and +# DNS accordingly. +[alt_names] +IP.1 = 127.0.0.1 +IP.2 = 192.168.64.1 +IP.3 = 192.168.122.1 +DNS.1 = localhost +EOF +} + +function gencerts { + create_config + openssl req \ + -new \ + -sha256 \ + -newkey rsa:2048 \ + -days 120 \ + -nodes \ + -x509 \ + -subj "/C=US/ST=Maryland/L=Vault/O=My Company CA" \ + -keyout "$CA_KEY" \ + -out "$CA_CERT" + + # Generate the private key for the service. Again, you may want to increase + # the bits to 2048. + openssl genrsa -out "$TLS_KEY" 2048 + + # Generate a CSR using the configuration and the key just generated. We will + # give this CSR to our CA to sign. + openssl req \ + -new -key "$TLS_KEY" \ + -out "$CSR" \ + -config "$CONFIG" + + # Sign the CSR with our CA. This will generate a new certificate that is signed + # by our CA. + openssl x509 \ + -req \ + -days 120 \ + -in "$CSR" \ + -CA "$CA_CERT" \ + -CAkey "$CA_KEY" \ + -CAcreateserial \ + -sha256 \ + -extensions v3_req \ + -extfile "$CONFIG" \ + -out "$TLS_CERT" + + openssl x509 -in "$TLS_CERT" -noout -text + + rm openssl.cnf + + chown -R nobody:nobody $CONFIG_DIR && chmod -R 777 $CONFIG_DIR +} + +gencerts + +nohup vault server -log-level=debug -config /vault/vault.hcl & +VAULT_PID=$! + +function unseal() { + VAULT_INIT=$(cat $VAULT_CREDENTIALS) + UNSEAL_KEY=$(echo $VAULT_INIT | jq -r '.unseal_keys_hex[0]') + ROOT_TOKEN=$(echo $VAULT_INIT | jq -r .root_token) + vault operator unseal $UNSEAL_KEY + export VAULT_TOKEN=$ROOT_TOKEN +} + +function configure_plugin { + plugin_file="immutability-eth-plugin" + + echo "ADDING TO CATALOG: sys/plugins/catalog/secret/${plugin_file}" + + # just testing for now + plugin_file="${plugin_file}" + sha256sum=`cat /vault/plugins/SHA256SUMS | awk '{print $1}'` + vault write sys/plugins/catalog/secret/${plugin_file} \ + sha_256="$sha256sum" \ + command="$plugin_file --ca-cert=$CA_CERT --client-cert=$TLS_CERT --client-key=$TLS_KEY" + + if [[ $? -eq 2 ]] ; then + echo "Vault Catalog update failed!" + exit 2 + fi + + echo "MOUNTING: ${plugin_file}" + vault secrets enable -path=${plugin_file} -plugin-name=${plugin_file} plugin + if [[ $? -eq 2 ]] ; then + echo "Failed to mount ${plugin_file} plugin for test!" + exit 2 + fi +} + +if [ -f "$VAULT_CREDENTIALS" ]; then + sleep 10 + unseal + vault status + vault secrets list +else + sleep 10 + echo "Generating vault credentials" + VAULT_INIT=$(vault operator init -key-shares=1 -key-threshold=1 -format=json | jq .) + echo $VAULT_INIT > $VAULT_CREDENTIALS + echo $(cat $VAULT_CREDENTIALS) + unseal + configure_plugin + vault audit enable file file_path=stdout + vault status + vault secrets list +fi + +if [ "$TEST" == "true" ]; then + echo "Dying." +else + echo "Don't exit until vault dies." + wait $VAULT_PID +fi diff --git a/ops/up_local.sh b/ops/up_local.sh index 1ad6d2b3b056..00ab4af9d0ea 100755 --- a/ops/up_local.sh +++ b/ops/up_local.sh @@ -39,6 +39,7 @@ if [[ $BUILD == 1 ]]; then docker-compose build --parallel -- deployer dtl batch_submitter relayer integration_tests docker-compose build -- omgx_message-relayer-fast docker-compose build -- gas_oracle + docker-compose build -- vault docker-compose build -- omgx_deployer elif [[ $BUILD == 0 ]]; then docker-compose -f $DIR/$DOCKERFILE pull diff --git a/ops_omgx/cloudformation/03-infrastructure-application.yaml b/ops_omgx/cloudformation/03-infrastructure-application.yaml index a4e6007b18f4..f02e6cb8a512 100644 --- a/ops_omgx/cloudformation/03-infrastructure-application.yaml +++ b/ops_omgx/cloudformation/03-infrastructure-application.yaml @@ -296,6 +296,16 @@ Resources: - "elasticfilesystem:ClientRootAccess" - "elasticfilesystem:ClientWrite" - "elasticfilesystem:DescribeMountTargets" + - "iam:GetInstanceProfile" + - "iam:GetUser" + - "iam:GetRole" + - "sts:AssumeRole" + - "iam:CreateAccessKey" + - "iam:DeleteAccessKey" + - "iam:GetAccessKeyLastUsed" + - "iam:GetUser" + - "iam:ListAccessKeys" + - "iam:UpdateAccessKey" Resource: "*" EcsInstanceProfile: diff --git a/ops_omgx/cloudformation/batch-submitter.yaml b/ops_omgx/cloudformation/batch-submitter.yaml index 6536a60c6a94..9542ba6af033 100644 --- a/ops_omgx/cloudformation/batch-submitter.yaml +++ b/ops_omgx/cloudformation/batch-submitter.yaml @@ -66,8 +66,19 @@ Resources: - "secretsmanager:GetSecretValue" - "secretsmanager:DescribeSecret" - "secretsmanager:ListSecretVersionIds" + - "iam:GetInstanceProfile" + - "iam:GetUser" + - "iam:GetRole" + - "sts:AssumeRole" + - "iam:CreateAccessKey" + - "iam:DeleteAccessKey" + - "iam:GetAccessKeyLastUsed" + - "iam:GetUser" + - "iam:ListAccessKeys" + - "iam:UpdateAccessKey" Resource: - arn:aws:secretsmanager:us-east-1:942431445534:secret:* + - "*" BatchSubmitterLogGroup: Type: AWS::Logs::LogGroup Properties: diff --git a/ops_omgx/cloudformation/vault.yaml b/ops_omgx/cloudformation/vault.yaml new file mode 100644 index 000000000000..d22c336c9da2 --- /dev/null +++ b/ops_omgx/cloudformation/vault.yaml @@ -0,0 +1,190 @@ +AWSTemplateFormatVersion: "2010-09-09" +Description: "Enya Deployer Application Deployment" + +Parameters: + EnvironmentName: + Type: String + Default: dev + + CFHelperELBv2RulePriorityStack: + Type: String + Default: CF-Helper-ELBv2-Rule-Priority + + ServiceCount: + Type: Number + Default: 1 + + ImageTag: + Type: String + Default: push2aws + + VaultImage: + Type: String + Default: vault + + DockerPrefix: + Type: String + Default: omgx + + ECRRegistry: + Type: String + Default: 942431445534.dkr.ecr.us-east-1.amazonaws.com + + InfrastructureStackName: + Description: Infrastructure stack to associate this stack with + Type: String + Default: infrastructure-coredev + + SecretName: + Description: AWS Secret Name used for the service + Type: String + +Conditions: + IsProduction: + !Equals [!Ref EnvironmentName, "production"] + +Resources: + TaskRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Principal: + Service: !Sub ecs-tasks.${AWS::URLSuffix} + Action: sts:AssumeRole + Policies: + - PolicyName: AllowAccessToSecrets + PolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Action: + - "secretsmanager:GetResourcePolicy" + - "secretsmanager:GetSecretValue" + - "secretsmanager:DescribeSecret" + - "secretsmanager:ListSecretVersionIds" + Resource: + - arn:aws:secretsmanager:us-east-1:942431445534:secret:* + VaultLBTargetGroup: + Type: AWS::ElasticLoadBalancingV2::TargetGroup + Properties: + Port: 8900 + Protocol: HTTP + VpcId: + Fn::ImportValue: !Sub "${InfrastructureStackName}:VpcId" + TargetGroupAttributes: + - Key: deregistration_delay.timeout_seconds + Value: 30 + HealthCheckIntervalSeconds: 60 + HealthCheckPath: / + HealthCheckProtocol: HTTP # TODO Implement proper healthcheck + HealthCheckTimeoutSeconds: 15 + HealthyThresholdCount: 3 + UnhealthyThresholdCount: 10 + Matcher: + HttpCode: 200 + VaultLBTargetGroup1: + Type: AWS::ElasticLoadBalancingV2::TargetGroup + Properties: + Port: 8901 + Protocol: HTTP + VpcId: + Fn::ImportValue: !Sub "${InfrastructureStackName}:VpcId" + TargetGroupAttributes: + - Key: deregistration_delay.timeout_seconds + Value: 30 + HealthCheckIntervalSeconds: 60 + HealthCheckPath: / + HealthCheckProtocol: HTTP # TODO Implement proper healthcheck + HealthCheckTimeoutSeconds: 15 + HealthyThresholdCount: 3 + UnhealthyThresholdCount: 10 + Matcher: + HttpCode: 200 + VaultLBListenerRulePriority: + Type: AWS::CloudFormation::CustomResource + Properties: + ServiceToken: + Fn::ImportValue: !Sub "${CFHelperELBv2RulePriorityStack}:Function" + ListenerArn: + Fn::ImportValue: !Sub "${InfrastructureStackName}:VaultListener" + VaultLBListenerRulePriority1: + Type: AWS::CloudFormation::CustomResource + Properties: + ServiceToken: + Fn::ImportValue: !Sub "${CFHelperELBv2RulePriorityStack}:Function" + ListenerArn: + Fn::ImportValue: !Sub "${InfrastructureStackName}:VaultListener1" + VaultLBListenerRule: + Type: AWS::ElasticLoadBalancingV2::ListenerRule + Properties: + Actions: + - Type: forward + TargetGroupArn: !Ref VaultLBTargetGroup + Conditions: + - Field: host-header + HostHeaderConfig: + Values: + - Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName" + ListenerArn: + Fn::ImportValue: !Sub "${InfrastructureStackName}:VaultListener" + Priority: !GetAtt VaultLBListenerRulePriority.Value + VaultLBListenerRule1: + Type: AWS::ElasticLoadBalancingV2::ListenerRule + Properties: + Actions: + - Type: forward + TargetGroupArn: !Ref VaultLBTargetGroup1 + Conditions: + - Field: host-header + HostHeaderConfig: + Values: + - Fn::ImportValue: !Sub "${InfrastructureStackName}:LoadBalancerInt:DNSName" + ListenerArn: + Fn::ImportValue: !Sub "${InfrastructureStackName}:VaultListener1" + Priority: !GetAtt VaultLBListenerRulePriority1.Value + TaskDefinition: + Type: AWS::ECS::TaskDefinition + Properties: + ContainerDefinitions: + - Image: !Sub "${ECRRegistry}/${DockerPrefix}/${VaultImage}:${ImageTag}" + Name: vault + PortMappings: + - ContainerPort: 8900 + HostPort: 0 + - ContainerPort: 8901 + HostPort: 0 + Environment: + - Name: SECRETNAME + Value: !Ref SecretName + EntryPoint: + - "/bin/sh -ecx /vault/vault.sh" + DockerLabels: + com.datadoghq.ad.check_names: '["vault"]' + com.datadoghq.ad.init_configs: '[{}]' + com.datadoghq.ad.logs: '[{"source": "vault", "service": "vault"}]' + Essential: true + Memory: "256" + NetworkMode: bridge + TaskRoleArn: !GetAtt TaskRole.Arn + Family: !Sub "Vault-${EnvironmentName}" + ECSService: + Type: AWS::ECS::Service + DependsOn: VaultLBListenerRule + Properties: + Cluster: + Fn::ImportValue: !Sub "${InfrastructureStackName}:EcsCluster" + LoadBalancers: + - ContainerName: vault + ContainerPort: 8900 + TargetGroupArn: !Ref VaultLBTargetGroup + - ContainerName: vault + ContainerPort: 8901 + TargetGroupArn: !Ref VaultLBTargetGroup1 + DesiredCount: !Ref ServiceCount + LaunchType: EC2 + SchedulingStrategy: REPLICA + ServiceName: !Sub "Vault-${EnvironmentName}" + TaskDefinition: !Ref TaskDefinition diff --git a/ops_omgx/docker/vault/Dockerfile b/ops_omgx/docker/vault/Dockerfile new file mode 100644 index 000000000000..112038318154 --- /dev/null +++ b/ops_omgx/docker/vault/Dockerfile @@ -0,0 +1,16 @@ +FROM golang:1.14-alpine AS builder +RUN apk add --no-cache gcc musl-dev git make +WORKDIR /src/ +COPY . /src/ + +RUN go get github.com/jetstack/vault-unsealer && \ + make -C $(go env GOPATH)/src/github.com/jetstack/vault-unsealer build + + +FROM alpine:latest + +RUN apk add --update ca-certificates musl-dev + +COPY --from=builder /go/src/github.com/jetstack/vault-unsealer/vault-unsealer_linux_amd64 /usr/local/bin/vault-unsealer + +ENTRYPOINT ["/usr/local/bin/vault-unsealer"] diff --git a/ops_omgx/docker/vault/README.md b/ops_omgx/docker/vault/README.md new file mode 100755 index 000000000000..65b5b3c5a871 --- /dev/null +++ b/ops_omgx/docker/vault/README.md @@ -0,0 +1,55 @@ +# Vault-unsealer + +This project aims to make it easier to automate the secure unsealing of a Vault +server. + +## Usage + +``` +This is a CLI tool to help automate the setup and management of +Hashicorp Vault. + +It will continuously attempt to unseal the target Vault instance, by retrieving +unseal keys from a Google Cloud KMS keyring. + +Usage: + vault-unsealer [command] + +Available Commands: + help Help about any command + init Initialise the target Vault instance + unseal A brief description of your command + +Flags: + --aws-kms-key-id string The ID or ARN of the AWS KMS key to encrypt values + --aws-ssm-key-prefix string The Key Prefix for SSM Parameter store + --google-cloud-kms-crypto-key string The name of the Google Cloud KMS crypt key to use + --google-cloud-kms-key-ring string The name of the Google Cloud KMS key ring to use + --google-cloud-kms-location string The Google Cloud KMS location to use (eg. 'global', 'europe-west1') + --google-cloud-kms-project string The Google Cloud KMS project to use + --google-cloud-storage-bucket string The name of the Google Cloud Storage bucket to store values in + --google-cloud-storage-prefix string The prefix to use for values store in Google Cloud Storage + -h, --help help for vault-unsealer + --mode string Select the mode to use 'google-cloud-kms-gcs' => Google Cloud Storage with encryption using Google KMS; 'aws-kms-ssm' => AWS SSM parameter store using AWS KMS encryption (default "google-cloud-kms-gcs") + --secret-shares int Total count of secret shares that exist (default 1) + --secret-threshold int Minimum required secret shares to unseal (default 1) + +Use "vault-unsealer [command] --help" for more information about a command. +``` + +## How to setup vault-unsealer via AWS KMS and SSM + +[Instruction on existing and new vaults for unsealing vault using KMS and SSM](docs/aws-kms-ssm.md) + +## Build from source + +```bash +go get github.com/omgnetwork/optimism/ops_omgx/docker/vault/vault-unsealer +make -C $(go env GOPATH)/src/github.com/omgnetwork/optimism/ops_omgx/docker/vault/vault-unsealer build +``` + +## Build a Docker image + +```bash +docker build -t vault-unsealer: . +``` diff --git a/ops_omgx/docker/vault/docs/aws-kms-ssm.md b/ops_omgx/docker/vault/docs/aws-kms-ssm.md new file mode 100644 index 000000000000..2104bd8384ea --- /dev/null +++ b/ops_omgx/docker/vault/docs/aws-kms-ssm.md @@ -0,0 +1,226 @@ +# Unsealing Vault using encrypted keys from AWS SSM + +vault-unsealer can use AWS KMS and SSM to store and retrieve encrypted Vault keys. + +vault-unsealer can be used to initialize a vault and auto store its keys in SSM. +[See Initializing a Vault for more info](#initializing-a-vault) + +## Pre-existing Vault keys + +1. Create or use a KMS key in the region you want. AWS Console Encryption Keys Page. + +2. Note the alias name of the key, for example: `alias/vault`. + +3. Note the key UUID at the end of the ARN, for example: `arn:aws:kms:::key/`. + +4. Add the following IAM permissions to the IAM user/role which vault-unsealer will be using. + + + +:warning: WARNING
+ + If running in Kubernetes, its strongly suggested that use a project such as kube2iam + to limit access to a specific pod for accessing the keys via a separate IAM role. +
+ +Using the policy below on nodes role will allow any pod to access the root token and unseal keys stored in SSM with KMS. + +Full IAM policy (Change the place holders ``, `` and ``) + +```javascript +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VaultUnsealerReadSSMParameters", + "Effect": "Allow", + "Action": [ + "ssm:GetParameters" + ], + "Resource": [ + "arn:aws:ssm:::parameter/*" + ] + }, + { + "Sid": "VaultUnsealerWriteSSMParameters", + "Effect": "Allow", + "Action": [ + "ssm:PutParameter", + "ssm:DeleteParameter" + ], + "Resource": [ + "arn:aws:ssm:::parameter/vault-unsealer-*" + ] + }, + { + "Sid": "VaultUnsealerGetKMS", + "Effect": "Allow", + "Action": [ + "kms:Get*", + "kms:ListKeys", + "kms:ListAliases" + ], + "Resource": [ + "*" + ] + }, + { + "Sid": "VaultUnsealerEncryptDecryptKms", + "Effect": "Allow", + "Action": [ + "kms:DescribeKey", + "kms:Encrypt", + "kms:Decrypt" + ], + "Resource": [ + "arn:aws:kms:::key/" + ] + } + ] +} +``` + +## Setting up an existing vault (already initialized) + +Using the vault root token and unseal keys you can setup the SSM Parameter store with the following commands: + +1.Export keys and prefix for SSM: + +```bash + export PREFIX=- \ + KMS_KEY_ID= \ + ROOT_KEY= \ + UNSEAL0= \ + UNSEAL1= \ + UNSEAL2= \ + UNSEAL3= \ + UNSEAL4= +``` + +2.Encrypt and Put SSM Parameters to AWS: + +```bash +$ mkdir -p /tmp/vault + echo $ROOT_KEY > /tmp/vault/root-key + echo $UNSEAL0 > /tmp/vault/unseal0 + echo $UNSEAL1 > /tmp/vault/unseal1 + echo $UNSEAL2 > /tmp/vault/unseal2 + echo $UNSEAL3 > /tmp/vault/unseal3 + echo $UNSEAL4 > /tmp/vault/unseal4 + + echo "Encrypting Vault root token" + aws kms encrypt --key-id $KMS_KEY_ID \ + --plaintext fileb:///tmp/vault/root-key \ + --output text \ + --query CiphertextBlob > /tmp/vault/root.enc + + echo "Creating a new SSM paramter key ${PREFIX}vault-root for Vault root token" + aws ssm put-parameter --name "${PREFIX}vault-unseal-root" \ + --value "$(cat /tmp/vault/root.enc )" \ + --type String + + for i in {0..4}; do + echo "Encrypting unseal${i} key" + aws kms encrypt --key-id $KMS_KEY_ID \ + --encryption-context "Tool=vault-unsealer" \ + --plaintext fileb:///tmp/vault/unseal${i} \ + --output text \ + --query CiphertextBlob > /tmp/vault/unseal${i}.enc + + echo "Creating a new SSM paramter key ${PREFIX}vault-unseal-${i}" + aws ssm put-parameter --name "${PREFIX}vault-unseal-${i}" \ + --value "$(cat /tmp/vault/unseal${i}.enc)" \ + --type String + done + + rm -rf /tmp/vault +``` + +## Initializing a Vault + +If your vault is not yet initialized you can initialized it using the parameter store as follow: + +```bash +export AWS_REGION= +``` + +Run the command aws kms list-aliases to get a list of the kms keys you need, you must use the alias name. + +```javascript +{ + "Aliases": [ + { + "AliasName": "alias/MyKmsKey", + "AliasArn": "arn:aws:kms:us-west-2:123456789012:alias/myKMSKey", + "TargetKeyId": "4e4ad123-20cf-4ffe-a55f-edd96ca41bef" + } + ] +} +``` + +Note: alias key must have the prefix alias/. you may use any number of secrets shares and threshold for your needs. (default is 1 secret share and 1 threshold) + +```bash +vault-unsealer init \ + --mode aws-kms-ssm \ + --aws-kms-key-id \ + --aws-ssm-key-prefix - \ + --secret-shares 5 \ + --secret-threshold 3 +``` + +```console +INFO[0015] root token stored in key store key=vault-root +``` + +This will create 6 keys in the AWS SSM:
+* vault-root +* vault-unsealer-0 +* vault-unsealer-1 +* vault-unsealer-2 +* vault-unsealer-3 +* vault-unsealer-4 + +## Test vault-unsealer on AWS with KMS and SSM + +```bash +vault-unsealer unseal \ + --mode aws-kms-ssm \ + --aws-kms-key-id "alias/``" \ + --aws-ssm-key-prefix ``- \ + --secret-shares 5 \ + --secret-threshold 3 +``` + +```console +INFO[0000] checking if vault is sealed... +INFO[0000] vault sealed: true +INFO[0002] successfully unsealed vault +``` + +## Getting the Root token and Unseal keys from SSM and Decrypt with KMS. + +Since you've generated the the keys and root token using vault-unsealer you can use the following commands to get the unseal keys and root token: + +Make sure to change the region / AWS CLI profile to your needs. + +Note that you don't have to pass the KMS key id since it's in the metadata of the stored parameter on SSM. + +```bash +export AWS_DEFAULT_REGION=us-west-2 +export AWS_PROFILE=dev +echo "Fetching Vault unseal keys and root token from AWS..." + +aws ssm get-parameters --names kubernetes-vault-root | jq -r '.Parameters[].Value' | base64 -D > /tmp/root-token +ROOT_TOKEN=$(aws kms decrypt --ciphertext-blob fileb:///tmp/root-token --encryption-context Tool=vault-unsealer | jq -r '.Plaintext' | base64 -D) + +for i in {0..4}; do +aws ssm get-parameters --names kubernetes-vault-unseal-${i} | jq -r '.Parameters[].Value' | base64 -D > /tmp/unseal-${i} +echo "Unseal Key $((i+1)): $(aws kms decrypt --ciphertext-blob fileb:///tmp/unseal-${i} --encryption-context Tool=vault-unsealer | jq -r '.Plaintext' | base64 -D)" +done + +echo "Initial Root token: ${ROOT_TOKEN}" +rm /tmp/unseal* +rm /tmp/root-token +echo "Done." +``` \ No newline at end of file diff --git a/ops_omgx/docker/vault/secret2env b/ops_omgx/docker/vault/secret2env new file mode 100644 index 000000000000..4642b3695951 Binary files /dev/null and b/ops_omgx/docker/vault/secret2env differ diff --git a/ops_omgx/docker/vault/vault.sh b/ops_omgx/docker/vault/vault.sh new file mode 100644 index 000000000000..0811b43d92d9 --- /dev/null +++ b/ops_omgx/docker/vault/vault.sh @@ -0,0 +1,168 @@ +#!/bin/bash + +# Vault running in the container must listen on a different port. + +VAULT_CREDENTIALS="/vault/config/unseal.json" + +CONFIG_DIR="/vault/config" + +CA_CERT="$CONFIG_DIR/ca.crt" +CA_KEY="$CONFIG_DIR/ca.key" +TLS_KEY="$CONFIG_DIR/my-service.key" +TLS_CERT="$CONFIG_DIR/my-service.crt" +CONFIG="$CONFIG_DIR/openssl.cnf" +CSR="$CONFIG_DIR/my-service.csr" + +export VAULT_ADDR="$VAULT_ADDR" +export VAULT_CACERT="$CA_CERT" + +function create_config { + cat > "$CONFIG" << EOF + +[req] +default_bits = 2048 +encrypt_key = no +default_md = sha256 +prompt = no +utf8 = yes + +# Speify the DN here so we aren't prompted (along with prompt = no above). +distinguished_name = req_distinguished_name + +# Extensions for SAN IP and SAN DNS +req_extensions = v3_req + +# Be sure to update the subject to match your organization. +[req_distinguished_name] +C = TH +ST = Bangkok +L = Vault +O = omiseGO +CN = localhost + +# Allow client and server auth. You may want to only allow server auth. +# Link to SAN names. +[v3_req] +basicConstraints = CA:FALSE +subjectKeyIdentifier = hash +keyUsage = digitalSignature, keyEncipherment +extendedKeyUsage = clientAuth, serverAuth +subjectAltName = @alt_names + +# Alternative names are specified as IP.# and DNS.# for IPs and +# DNS accordingly. +[alt_names] +IP.1 = 127.0.0.1 +IP.2 = 192.168.64.1 +IP.3 = 192.168.122.1 +DNS.1 = localhost +EOF +} + +function gencerts { + create_config + openssl req \ + -new \ + -sha256 \ + -newkey rsa:2048 \ + -days 120 \ + -nodes \ + -x509 \ + -subj "/C=US/ST=Maryland/L=Vault/O=My Company CA" \ + -keyout "$CA_KEY" \ + -out "$CA_CERT" + + # Generate the private key for the service. Again, you may want to increase + # the bits to 2048. + openssl genrsa -out "$TLS_KEY" 2048 + + # Generate a CSR using the configuration and the key just generated. We will + # give this CSR to our CA to sign. + openssl req \ + -new -key "$TLS_KEY" \ + -out "$CSR" \ + -config "$CONFIG" + + # Sign the CSR with our CA. This will generate a new certificate that is signed + # by our CA. + openssl x509 \ + -req \ + -days 120 \ + -in "$CSR" \ + -CA "$CA_CERT" \ + -CAkey "$CA_KEY" \ + -CAcreateserial \ + -sha256 \ + -extensions v3_req \ + -extfile "$CONFIG" \ + -out "$TLS_CERT" + + openssl x509 -in "$TLS_CERT" -noout -text + + rm openssl.cnf + + chown -R nobody:nobody $CONFIG_DIR && chmod -R 777 $CONFIG_DIR +} + +gencerts + +nohup vault server -log-level=debug -config /vault/vault.hcl & +VAULT_PID=$! + +function unseal() { + VAULT_INIT=$(cat $VAULT_CREDENTIALS) + UNSEAL_KEY=$(echo $VAULT_INIT | jq -r '.unseal_keys_hex[0]') + ROOT_TOKEN=$(echo $VAULT_INIT | jq -r .root_token) + vault operator unseal $UNSEAL_KEY + export VAULT_TOKEN=$ROOT_TOKEN +} + +function configure_plugin { + plugin_file="immutability-eth-plugin" + + echo "ADDING TO CATALOG: sys/plugins/catalog/secret/${plugin_file}" + + # just testing for now + plugin_file="${plugin_file}" + sha256sum=`cat /vault/plugins/SHA256SUMS | awk '{print $1}'` + vault write sys/plugins/catalog/secret/${plugin_file} \ + sha_256="$sha256sum" \ + command="$plugin_file --ca-cert=$CA_CERT --client-cert=$TLS_CERT --client-key=$TLS_KEY" + + if [[ $? -eq 2 ]] ; then + echo "Vault Catalog update failed!" + exit 2 + fi + + echo "MOUNTING: ${plugin_file}" + vault secrets enable -path=${plugin_file} -plugin-name=${plugin_file} plugin + if [[ $? -eq 2 ]] ; then + echo "Failed to mount ${plugin_file} plugin for test!" + exit 2 + fi +} + +if [ -f "$VAULT_CREDENTIALS" ]; then + sleep 10 + unseal + vault status + vault secrets list +else + sleep 10 + echo "Generating vault credentials" + VAULT_INIT=$(vault operator init -key-shares=1 -key-threshold=1 -format=json | jq .) + echo $VAULT_INIT > $VAULT_CREDENTIALS + echo $(cat $VAULT_CREDENTIALS) + unseal + configure_plugin + vault audit enable file file_path=stdout + vault status + vault secrets list +fi + +if [ "$TEST" == "true" ]; then + echo "Dying." +else + echo "Don't exit until vault dies." + wait $VAULT_PID +fi diff --git a/packages/batch-submitter/package.json b/packages/batch-submitter/package.json index 65cc37f44198..61860ba55525 100644 --- a/packages/batch-submitter/package.json +++ b/packages/batch-submitter/package.json @@ -44,6 +44,7 @@ "bluebird": "^3.7.2", "dotenv": "^8.2.0", "ethers": "^5.4.5", + "node-fetch": "2.6.1", "old-contracts": "npm:@eth-optimism/contracts@^0.0.2-alpha.7", "prom-client": "^13.1.0" }, @@ -61,23 +62,23 @@ "@types/sinon-chai": "^3.2.5", "@typescript-eslint/eslint-plugin": "^4.26.0", "@typescript-eslint/parser": "^4.26.0", - "chai": "^4.2.0", "babel-eslint": "^10.1.0", + "chai": "^4.2.0", "eslint": "^7.27.0", - "eslint-plugin-prettier": "^3.4.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-ban": "^1.5.2", "eslint-plugin-import": "^2.23.4", "eslint-plugin-jsdoc": "^35.1.2", "eslint-plugin-prefer-arrow": "^1.2.3", + "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.24.0", "eslint-plugin-unicorn": "^32.0.1", "ethereum-waffle": "3.0.0", "ganache-core": "^2.13.2", "hardhat": "^2.2.1", + "lint-staged": "11.0.0", "mocha": "^6.1.4", "prettier": "^2.2.1", - "lint-staged": "11.0.0", "rimraf": "^2.6.3", "sinon": "^9.2.4", "sinon-chai": "^3.5.0", diff --git a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts index 5dff9eba31de..1f259851d001 100644 --- a/packages/batch-submitter/src/batch-submitter/batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/batch-submitter.ts @@ -13,9 +13,18 @@ import { import { Gauge, Histogram, Counter } from 'prom-client' import { RollupInfo, sleep } from '@eth-optimism/core-utils' import { Logger, Metrics } from '@eth-optimism/common-ts' -import { getContractFactory } from 'old-contracts' +import { getContractInterface } from '@eth-optimism/contracts' +import { getBalance, getBatchSignerAddress } from './provider-helper' + +export interface BatchSigner { + // one or the other, not both! + address: string + vault_addr: string + token: string + signer: Signer +} /* Internal Imports */ -import { TxSubmissionHooks } from '..' +import { TxSubmissionHooks, AppendStateBatch } from '..' export interface BlockRange { start: number @@ -42,7 +51,8 @@ export abstract class BatchSubmitter { protected metrics: BatchSubmitterMetrics constructor( - readonly signer: Signer, + readonly batchSigner: BatchSigner, + readonly l1Provider: providers.StaticJsonRpcProvider, readonly l2Provider: providers.StaticJsonRpcProvider, readonly minTxSize: number, readonly maxTxSize: number, @@ -81,7 +91,7 @@ export abstract class BatchSubmitter { this.logger.info('Readying to submit next batch...', { l2ChainId: this.l2ChainId, - batchSubmitterAddress: await this.signer.getAddress(), + batchSubmitterAddress: await getBatchSignerAddress(this.batchSigner), }) if (this.syncing === true) { @@ -99,8 +109,8 @@ export abstract class BatchSubmitter { } protected async _hasEnoughETHToCoverGasCosts(): Promise { - const address = await this.signer.getAddress() - const balance = await this.signer.getBalance() + const address = await getBatchSignerAddress(this.batchSigner) + const balance = await getBalance(this.l1Provider, address) const ether = utils.formatEther(balance) const num = parseFloat(ether) @@ -134,9 +144,11 @@ export abstract class BatchSubmitter { ctcAddress: string sccAddress: string }> { - const addressManager = ( - await getContractFactory('Lib_AddressManager', this.signer) - ).attach(this.addressManagerAddress) + const addressManager = new Contract( + this.addressManagerAddress, + getContractInterface('Lib_AddressManager'), + this.l1Provider + ) const sccAddress = await addressManager.getAddress( 'OVM_StateCommitmentChain' ) @@ -244,11 +256,6 @@ export abstract class BatchSubmitter { } this.logger.info('Received transaction receipt', { receipt }) - // this.logger.info(successMessage, { - // block:receipt.blockNumber, - // status:receipt.status, - // txHash:receipt.transactionHash, - // }) this.logger.info(successMessage) this.metrics.batchesSubmitted.inc() this.metrics.submissionGasUsed.observe( diff --git a/packages/batch-submitter/src/batch-submitter/provider-helper.ts b/packages/batch-submitter/src/batch-submitter/provider-helper.ts new file mode 100644 index 000000000000..9f19eb304ce7 --- /dev/null +++ b/packages/batch-submitter/src/batch-submitter/provider-helper.ts @@ -0,0 +1,35 @@ +import { BatchSigner } from '.' + +import { providers } from 'ethers' + +export const getBalance = async ( + provider: providers.JsonRpcProvider, + address: string +) => { + return provider.getBalance(address) +} + +export const getBatchSignerAddress = async ( + batchSigner: BatchSigner +): Promise => { + if (batchSigner.address === undefined) { + return batchSigner.signer.getAddress() + } else { + return batchSigner.address + } +} + +export const getTransactionCount = async ( + provider: providers.JsonRpcProvider, + address: string +) => { + return provider.getTransactionCount(address) +} + +export const getTransactionCountBlock = async ( + provider: providers.JsonRpcProvider, + address: string, + block: string +) => { + return provider.getTransactionCount(address, block) +} diff --git a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts index 54a290937a64..ad8801036739 100644 --- a/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/state-batch-submitter.ts @@ -1,8 +1,8 @@ /* External Imports */ import { Promise as bPromise } from 'bluebird' -import { Contract, Signer, providers } from 'ethers' +import { Contract, providers } from 'ethers' import { TransactionReceipt } from '@ethersproject/abstract-provider' -import { getContractFactory } from 'old-contracts' +import { getContractInterface } from '@eth-optimism/contracts' import { L2Block, RollupInfo, @@ -10,10 +10,10 @@ import { remove0x, } from '@eth-optimism/core-utils' import { Logger, Metrics } from '@eth-optimism/common-ts' - /* Internal Imports */ -import { BlockRange, BatchSubmitter } from '.' -import { TransactionSubmitter } from '../utils' +import { BlockRange, BatchSubmitter, BatchSigner } from '.' +import { TransactionSubmitter, AppendStateBatch } from '../utils' +import { getBatchSignerAddress, getTransactionCount } from './provider-helper' export class StateBatchSubmitter extends BatchSubmitter { // TODO: Change this so that we calculate start = scc.totalElements() and end = ctc.totalElements()! @@ -27,7 +27,8 @@ export class StateBatchSubmitter extends BatchSubmitter { private transactionSubmitter: TransactionSubmitter constructor( - signer: Signer, + batch_signer: BatchSigner, + l1Provider: providers.StaticJsonRpcProvider, l2Provider: providers.StaticJsonRpcProvider, minTxSize: number, maxTxSize: number, @@ -45,7 +46,8 @@ export class StateBatchSubmitter extends BatchSubmitter { fraudSubmissionAddress: string ) { super( - signer, + batch_signer, + l1Provider, l2Provider, minTxSize, maxTxSize, @@ -93,12 +95,17 @@ export class StateBatchSubmitter extends BatchSubmitter { return } - this.chainContract = ( - await getContractFactory('OVM_StateCommitmentChain', this.signer) - ).attach(sccAddress) - this.ctcContract = ( - await getContractFactory('OVM_CanonicalTransactionChain', this.signer) - ).attach(ctcAddress) + this.chainContract = new Contract( + sccAddress, + getContractInterface('OVM_StateCommitmentChain'), + this.l1Provider + ) + + this.ctcContract = new Contract( + ctcAddress, + getContractInterface('OVM_CanonicalTransactionChain'), + this.l1Provider + ) this.logger.info('Connected Optimism contracts', { stateCommitmentChain: this.chainContract.address, @@ -169,19 +176,33 @@ export class StateBatchSubmitter extends BatchSubmitter { return } - const offsetStartsAtIndex = startBlock - this.blockOffset this.logger.debug('Submitting batch.', { calldata }) - - // Generate the transaction we will repeatedly submit - const nonce = await this.signer.getTransactionCount() - const tx = await this.chainContract.populateTransaction.appendStateBatch( - batch, - offsetStartsAtIndex, - { nonce } + const offsetStartsAtIndex = startBlock - this.blockOffset + const nonce = await getTransactionCount( + this.l1Provider, + await getBatchSignerAddress(this.batchSigner) ) const submitTransaction = (): Promise => { + const appendStateBatch = ( + appendStateBatchArg: Function, + batchArg: any[], + offsetStartsAtIndexArg: number + ): AppendStateBatch => { + return { + appendStateBatch: appendStateBatchArg, + batch: batchArg, + offsetStartsAtIndex: offsetStartsAtIndexArg, + nonce, + address: this.chainContract.address, + type: 'AppendStateBatch', + } + } return this.transactionSubmitter.submitTransaction( - tx, + appendStateBatch( + this.chainContract.populateTransaction.appendStateBatch, + batch, + offsetStartsAtIndex + ), this._makeHooks('appendStateBatch') ) } diff --git a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts index 6def8d6e3db8..44f0663b7f5c 100644 --- a/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts +++ b/packages/batch-submitter/src/batch-submitter/tx-batch-submitter.ts @@ -1,9 +1,8 @@ /* External Imports */ import { Promise as bPromise } from 'bluebird' -import { Signer, ethers, Contract, providers } from 'ethers' +import { ethers, Contract, providers, BigNumber } from 'ethers' import { TransactionReceipt } from '@ethersproject/abstract-provider' -import { getContractInterface, getContractFactory } from 'old-contracts' -import { getContractInterface as getNewContractInterface } from '@eth-optimism/contracts' +import { getContractInterface } from '@eth-optimism/contracts' import { L2Block, RollupInfo, @@ -21,8 +20,13 @@ import { AppendSequencerBatchParams, } from '../transaction-chain-contract' -import { BlockRange, BatchSubmitter } from '.' -import { TransactionSubmitter } from '../utils' +import { BlockRange, BatchSubmitter, BatchSigner } from '.' +import { + TransactionSubmitter, + AppendQueueBatch, + AppendSequencerBatch, +} from '../utils' +import { getTransactionCount, getBatchSignerAddress } from './provider-helper' export interface AutoFixBatchOptions { fixDoublePlayedDeposits: boolean @@ -34,13 +38,13 @@ export class TransactionBatchSubmitter extends BatchSubmitter { protected chainContract: CanonicalTransactionChainContract protected l2ChainId: number protected syncing: boolean - private disableQueueBatchAppend: boolean private autoFixBatchOptions: AutoFixBatchOptions private transactionSubmitter: TransactionSubmitter private gasThresholdInGwei: number constructor( - signer: Signer, + batchSigner: BatchSigner, + l1Provider: providers.StaticJsonRpcProvider, l2Provider: providers.StaticJsonRpcProvider, minTxSize: number, maxTxSize: number, @@ -55,7 +59,6 @@ export class TransactionBatchSubmitter extends BatchSubmitter { blockOffset: number, logger: Logger, metrics: Metrics, - disableQueueBatchAppend: boolean, autoFixBatchOptions: AutoFixBatchOptions = { fixDoublePlayedDeposits: false, fixMonotonicity: false, @@ -63,7 +66,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter { } // TODO: Remove this ) { super( - signer, + batchSigner, + l1Provider, l2Provider, minTxSize, maxTxSize, @@ -78,7 +82,6 @@ export class TransactionBatchSubmitter extends BatchSubmitter { logger, metrics ) - this.disableQueueBatchAppend = disableQueueBatchAppend this.autoFixBatchOptions = autoFixBatchOptions this.gasThresholdInGwei = 500 this.transactionSubmitter = transactionSubmitter @@ -110,14 +113,17 @@ export class TransactionBatchSubmitter extends BatchSubmitter { return } - const unwrapped_OVM_CanonicalTransactionChain = ( - await getContractFactory('OVM_CanonicalTransactionChain', this.signer) - ).attach(ctcAddress) + const unwrapped_OVM_CanonicalTransactionChain = new Contract( + ctcAddress, + getContractInterface('OVM_CanonicalTransactionChain'), + this.l1Provider + ) this.chainContract = new CanonicalTransactionChainContract( unwrapped_OVM_CanonicalTransactionChain.address, getContractInterface('OVM_CanonicalTransactionChain'), - this.signer + // if in vault signer will be undefined + this.batchSigner.signer || this.l1Provider ) this.logger.info('Initialized new CTC', { address: this.chainContract.address, @@ -137,10 +143,6 @@ export class TransactionBatchSubmitter extends BatchSubmitter { 'Syncing mode enabled! Skipping batch submission and clearing queue elements', { pendingQueueElements } ) - - if (!this.disableQueueBatchAppend) { - return this.submitAppendQueueBatch() - } } this.logger.info('Syncing mode enabled but queue is empty. Skipping...') return @@ -153,6 +155,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { const startBlock = (await this.chainContract.getTotalElements()).toNumber() + this.blockOffset + this.logger.info('Retrieved start block number from CTC', { startBlock, }) @@ -187,7 +190,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { ): Promise { // Do not submit batch if gas price above threshold const gasPriceInGwei = parseInt( - ethers.utils.formatUnits(await this.signer.getGasPrice(), 'gwei'), + ethers.utils.formatUnits(await this.l1Provider.getGasPrice(), 'gwei'), 10 ) if (gasPriceInGwei > this.gasThresholdInGwei) { @@ -216,84 +219,58 @@ export class TransactionBatchSubmitter extends BatchSubmitter { return } - if(batchParams.totalElementsToAppend === 0) { - this.logger.error("Will not submit tx_chain batch with 0 elements") + if (batchParams.totalElementsToAppend === 0) { + this.logger.error('Will not submit tx_chain batch with 0 elements') return } this.metrics.numTxPerBatch.observe(endBlock - startBlock) - const l1tipHeight = await this.signer.provider.getBlockNumber() + const l1tipHeight = await this.l1Provider.getBlockNumber() this.logger.info('Submitting tx_chain batch', { startBlock, endBlock, l1tipHeight, - batchStart:batchParams.shouldStartAtElement, - batchElements:batchParams.totalElementsToAppend + batchStart: batchParams.shouldStartAtElement, + batchElements: batchParams.totalElementsToAppend, }) this.logger.info('Submitting batch.', { calldata: batchParams, l1tipHeight, }) - -// <<<<<<< HEAD -// const nonce = await this.signer.getTransactionCount() -// const contractFunction = async (gasPrice): Promise => { -// this.logger.info('Submitting appendSequencerBatch transaction', { -// gasPrice, -// nonce, -// contractAddr: this.chainContract.address, -// }) -// const tx = await this.chainContract.appendSequencerBatch(batchParams, { -// nonce, -// gasPrice, -// }) -// this.logger.info('Submitted appendSequencerBatch transaction', { -// txHash: tx.hash, -// from: tx.from, -// }) -// this.logger.debug('appendSequencerBatch transaction data', { -// data: tx.data, -// }) -// return this.signer.provider.waitForTransaction( -// tx.hash, -// this.numConfirmations -// ) -// } -// const receipt = this._submitAndLogTx(contractFunction, 'Submitted tx_chain batch!') -// if (typeof receipt === 'undefined') { this._enableAutoFixBatchOptions(1) } -// return receipt -// ======= - return this.submitAppendSequencerBatch(batchParams) + const nonce = await getTransactionCount( + this.l1Provider, + await getBatchSignerAddress(this.batchSigner) + ) + return this.submitAppendSequencerBatch(batchParams, nonce) } /********************* * Private Functions * ********************/ - private async submitAppendQueueBatch(): Promise { - const tx = await this.chainContract.populateTransaction.appendQueueBatch( - ethers.constants.MaxUint256 // Completely empty the queue by appending (up to) an enormous number of queue elements. - ) - const submitTransaction = (): Promise => { - return this.transactionSubmitter.submitTransaction( - tx, - this._makeHooks('appendQueueBatch') - ) - } - // Empty the queue with a huge `appendQueueBatch(..)` call - return this._submitAndLogTx(submitTransaction, 'Cleared queue!') - } - private async submitAppendSequencerBatch( - batchParams: AppendSequencerBatchParams + batchParams: AppendSequencerBatchParams, + nonce: number ): Promise { - const tx = - await this.chainContract.customPopulateTransaction.appendSequencerBatch( - batchParams - ) + const appendSequencerBatch = ( + appendSequencerBatchArg: Function, + batchParamsArg: any + ): AppendSequencerBatch => { + return { + appendSequencerBatch: appendSequencerBatchArg, + batchParams: batchParamsArg, + type: 'AppendSequencerBatch', + address: this.chainContract.address, + nonce, + } + } + const submitTransaction = (): Promise => { return this.transactionSubmitter.submitTransaction( - tx, + appendSequencerBatch( + this.chainContract.customPopulateTransaction.appendSequencerBatch, + batchParams + ), this._makeHooks('appendSequencerBatch') ) } @@ -634,8 +611,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter { }> { const manager = new Contract( this.addressManagerAddress, - getNewContractInterface('Lib_AddressManager'), - this.signer.provider + getContractInterface('Lib_AddressManager'), + this.l1Provider ) const addr = await manager.getAddress( @@ -643,8 +620,8 @@ export class TransactionBatchSubmitter extends BatchSubmitter { ) const container = new Contract( addr, - getNewContractInterface('iOVM_ChainStorageContainer'), - this.signer.provider + getContractInterface('iOVM_ChainStorageContainer'), + this.l1Provider ) let meta = await container.getGlobalMetadata() @@ -819,7 +796,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { } } if (type === 1) { - this.logger.warn("Enabled autoFixBatchOptions - fixMonotonicity") + this.logger.warn('Enabled autoFixBatchOptions - fixMonotonicity') this.autoFixBatchOptions = { fixDoublePlayedDeposits: false, fixMonotonicity: true, @@ -827,7 +804,7 @@ export class TransactionBatchSubmitter extends BatchSubmitter { } } if (type === 2) { - this.logger.warn("Enabled autoFixBatchOptions - fixSkippedDeposits") + this.logger.warn('Enabled autoFixBatchOptions - fixSkippedDeposits') this.autoFixBatchOptions = { fixDoublePlayedDeposits: false, fixMonotonicity: false, diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index 0b7430c6d3ff..bc0b9cc024ef 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -10,7 +10,11 @@ import { } from '@ethersproject/providers' import * as dotenv from 'dotenv' import Config from 'bcfg' - +import { BatchSigner } from '../batch-submitter/batch-submitter' +import { + getBatchSignerAddress, + getTransactionCountBlock, +} from '../batch-submitter/provider-helper' /* Internal Imports */ import { TransactionBatchSubmitter, @@ -64,7 +68,6 @@ interface RequiredEnvVars { /* Optional Env Vars * FRAUD_SUBMISSION_ADDRESS - * DISABLE_QUEUE_BATCH_APPEND * SEQUENCER_PRIVATE_KEY * PROPOSER_PRIVATE_KEY * MNEMONIC @@ -77,6 +80,11 @@ interface RequiredEnvVars { * DEBUG_IMPERSONATE_SEQUENCER_ADDRESS * DEBUG_IMPERSONATE_PROPOSER_ADDRESS * RUN_METRICS_SERVER + * VAULT_ADDR + * PROPOSER_ADDRESS + * PROPOSER_TOKEN + * SEQUENCER_ADDRESS + * SEQUENCER_TOKEN */ export const run = async () => { @@ -138,8 +146,8 @@ export const run = async () => { env.DEBUG_IMPERSONATE_PROPOSER_ADDRESS ) - const getSequencerSigner = async (): Promise => { - const l1Provider = new StaticJsonRpcProvider( + const getSequencerSigner = async (): Promise => { + const l1ProviderTmp = new StaticJsonRpcProvider( requiredEnvVars.L1_NODE_WEB3_URL ) @@ -147,26 +155,55 @@ export const run = async () => { if (!DEBUG_IMPERSONATE_SEQUENCER_ADDRESS) { throw new Error('Must pass DEBUG_IMPERSONATE_SEQUENCER_ADDRESS') } - await l1Provider.send('hardhat_impersonateAccount', [ + await l1ProviderTmp.send('hardhat_impersonateAccount', [ DEBUG_IMPERSONATE_SEQUENCER_ADDRESS, ]) - return l1Provider.getSigner(DEBUG_IMPERSONATE_SEQUENCER_ADDRESS) + return { + signer: l1ProviderTmp.getSigner(DEBUG_IMPERSONATE_SEQUENCER_ADDRESS), + address: undefined, + vault_addr: undefined, + token: undefined, + } } - if (SEQUENCER_PRIVATE_KEY) { - return new Wallet(SEQUENCER_PRIVATE_KEY, l1Provider) + // if the SEQUENCER_ADDRESS is present + // it takes precedence over a sequencer private key + // this means all eth transactions go through the vault + if (SEQUENCER_ADDRESS) { + logger.info('Sequencer in Vault') + return { + signer: undefined, + address: SEQUENCER_ADDRESS, + token: SEQUENCER_TOKEN, + vault_addr: VAULT_ADDR, + } + } else if (SEQUENCER_PRIVATE_KEY) { + console.log('SEQUENCER_PRIVATE_KEY') + return { + signer: new Wallet(SEQUENCER_PRIVATE_KEY, l1ProviderTmp), + address: undefined, + vault_addr: undefined, + token: undefined, + } } else if (SEQUENCER_MNEMONIC) { - return Wallet.fromMnemonic(SEQUENCER_MNEMONIC, SEQUENCER_HD_PATH).connect( - l1Provider - ) + const sig = Wallet.fromMnemonic( + SEQUENCER_MNEMONIC, + SEQUENCER_HD_PATH + ).connect(l1ProviderTmp) + return { + signer: sig, + address: undefined, + vault_addr: undefined, + token: undefined, + } } throw new Error( - 'Must pass one of SEQUENCER_PRIVATE_KEY, MNEMONIC, or SEQUENCER_MNEMONIC' + 'Must pass one of SEQUENCER_PRIVATE_KEY, MNEMONIC, SEQUENCER_MNEMONIC or SEQUENCER_ADDRESS' ) } - const getProposerSigner = async (): Promise => { - const l1Provider = new StaticJsonRpcProvider( + const getProposerSigner = async (): Promise => { + const l1ProviderTmp = new StaticJsonRpcProvider( requiredEnvVars.L1_NODE_WEB3_URL ) @@ -174,21 +211,49 @@ export const run = async () => { if (!DEBUG_IMPERSONATE_PROPOSER_ADDRESS) { throw new Error('Must pass DEBUG_IMPERSONATE_PROPOSER_ADDRESS') } - await l1Provider.send('hardhat_impersonateAccount', [ + await l1ProviderTmp.send('hardhat_impersonateAccount', [ DEBUG_IMPERSONATE_PROPOSER_ADDRESS, ]) - return l1Provider.getSigner(DEBUG_IMPERSONATE_PROPOSER_ADDRESS) + return { + signer: l1ProviderTmp.getSigner(DEBUG_IMPERSONATE_PROPOSER_ADDRESS), + address: undefined, + vault_addr: undefined, + token: undefined, + } } - if (PROPOSER_PRIVATE_KEY) { - return new Wallet(PROPOSER_PRIVATE_KEY, l1Provider) + // if the PROPOSER_ADDRESS is present + // it takes precedence over a sequencer private key + // this means all eth transactions go through the vault + if (PROPOSER_ADDRESS) { + logger.info('Proposer in Vault') + return { + address: PROPOSER_ADDRESS, + signer: undefined, + token: PROPOSER_TOKEN, + vault_addr: VAULT_ADDR, + } + } else if (PROPOSER_PRIVATE_KEY) { + return { + signer: new Wallet(PROPOSER_PRIVATE_KEY, l1ProviderTmp), + address: undefined, + vault_addr: undefined, + token: undefined, + } } else if (PROPOSER_MNEMONIC) { - return Wallet.fromMnemonic(PROPOSER_MNEMONIC, PROPOSER_HD_PATH).connect( - l1Provider - ) + const sig = Wallet.fromMnemonic( + PROPOSER_MNEMONIC, + PROPOSER_HD_PATH + ).connect(l1ProviderTmp) + return { + signer: sig, + address: undefined, + vault_addr: undefined, + token: undefined, + } } throw new Error( - 'Must pass one of PROPOSER_PRIVATE_KEY, MNEMONIC, or PROPOSER_MNEMONIC' + 'Must pass one of PROPOSER_PRIVATE_KEY, MNEMONIC, PROPOSER_MNEMONIC or PROPOSER_ADDRESS' ) } @@ -201,10 +266,6 @@ export const run = async () => { 'fraud-submisison-address', env.FRAUD_SUBMISSION_ADDRESS || 'no fraud' ) - const DISABLE_QUEUE_BATCH_APPEND = config.bool( - 'disable-queue-batch-append', - !!env.DISABLE_QUEUE_BATCH_APPEND - ) const MIN_GAS_PRICE_IN_GWEI = config.uint( 'min-gas-price-in-gwei', parseInt(env.MIN_GAS_PRICE_IN_GWEI, 10) || 0 @@ -222,32 +283,59 @@ export const run = async () => { parseInt(env.GAS_THRESHOLD_IN_GWEI, 10) || 100 ) - // Private keys & mnemonics - const SEQUENCER_PRIVATE_KEY = config.str( - 'sequencer-private-key', - env.SEQUENCER_PRIVATE_KEY - ) - // Kept for backwards compatibility - const PROPOSER_PRIVATE_KEY = config.str( - 'proposer-private-key', - env.PROPOSER_PRIVATE_KEY || env.SEQUENCER_PRIVATE_KEY - ) - const SEQUENCER_MNEMONIC = config.str( - 'sequencer-mnemonic', - env.SEQUENCER_MNEMONIC || env.MNEMONIC - ) - const PROPOSER_MNEMONIC = config.str( - 'proposer-mnemonic', - env.PROPOSER_MNEMONIC || env.MNEMONIC - ) - const SEQUENCER_HD_PATH = config.str( - 'sequencer-hd-path', - env.SEQUENCER_HD_PATH || env.HD_PATH - ) - const PROPOSER_HD_PATH = config.str( - 'proposer-hd-path', - env.PROPOSER_HD_PATH || env.HD_PATH - ) + let SEQUENCER_PRIVATE_KEY + let SEQUENCER_HD_PATH + let SEQUENCER_MNEMONIC + let SEQUENCER_ADDRESS + let SEQUENCER_TOKEN + let VAULT_ADDR + if (env.SEQUENCER_ADDRESS === undefined) { + // Private keys & mnemonics + SEQUENCER_PRIVATE_KEY = config.str( + 'sequencer-private-key', + env.SEQUENCER_PRIVATE_KEY + ) + SEQUENCER_HD_PATH = config.str( + 'sequencer-hd-path', + env.SEQUENCER_HD_PATH || env.HD_PATH + ) + SEQUENCER_MNEMONIC = config.str( + 'sequencer-mnemonic', + env.SEQUENCER_MNEMONIC || env.MNEMONIC + ) + } else { + SEQUENCER_ADDRESS = config.str('sequencer-address', env.SEQUENCER_ADDRESS) + SEQUENCER_TOKEN = config.str('sequencer-vault-token', env.SEQUENCER_TOKEN) + VAULT_ADDR = config.str('vault-url', env.VAULT_ADDR) + } + + let PROPOSER_PRIVATE_KEY + let PROPOSER_MNEMONIC + let PROPOSER_HD_PATH + let PROPOSER_ADDRESS + let PROPOSER_TOKEN + + if (env.PROPOSER_ADDRESS === undefined) { + // Kept for backwards compatibility + PROPOSER_PRIVATE_KEY = config.str( + 'proposer-private-key', + env.PROPOSER_PRIVATE_KEY || env.SEQUENCER_PRIVATE_KEY + ) + PROPOSER_MNEMONIC = config.str( + 'proposer-mnemonic', + env.PROPOSER_MNEMONIC || env.MNEMONIC + ) + PROPOSER_HD_PATH = config.str( + 'proposer-hd-path', + env.PROPOSER_HD_PATH || env.HD_PATH + ) + } else { + PROPOSER_ADDRESS = config.str( + 'proposer-address', + env.PROPOSER_ADDRESS || env.SEQUENCER_ADDRESS + ) + PROPOSER_TOKEN = config.str('proposer-vault-token', env.PROPOSER_TOKEN) + } // Auto fix batch options -- TODO: Remove this very hacky config const AUTO_FIX_BATCH_OPTIONS_CONF = config.str( @@ -345,11 +433,13 @@ export const run = async () => { new StaticJsonRpcProvider(requiredEnvVars.L2_NODE_WEB3_URL) ) - const sequencerSigner: Signer = await getSequencerSigner() - let proposerSigner: Signer = await getProposerSigner() + const l1Provider = new StaticJsonRpcProvider(requiredEnvVars.L1_NODE_WEB3_URL) + + const sequencerSigner: BatchSigner = await getSequencerSigner() + let proposerSigner: BatchSigner = await getProposerSigner() - const sequencerAddress = await sequencerSigner.getAddress() - const proposerAddress = await proposerSigner.getAddress() + const sequencerAddress = await getBatchSignerAddress(sequencerSigner) + const proposerAddress = await getBatchSignerAddress(proposerSigner) // If the sequencer & proposer are the same, use a single wallet if (sequencerAddress === proposerAddress) { proposerSigner = sequencerSigner @@ -370,11 +460,13 @@ export const run = async () => { const txBatchTxSubmitter: TransactionSubmitter = new YnatmTransactionSubmitter( sequencerSigner, + l1Provider, resubmissionConfig, requiredEnvVars.NUM_CONFIRMATIONS ) const txBatchSubmitter = new TransactionBatchSubmitter( sequencerSigner, + l1Provider, l2Provider, requiredEnvVars.MIN_L1_TX_SIZE, requiredEnvVars.MAX_L1_TX_SIZE, @@ -389,18 +481,20 @@ export const run = async () => { BLOCK_OFFSET, logger.child({ name: TX_BATCH_SUBMITTER_LOG_TAG }), metrics, - DISABLE_QUEUE_BATCH_APPEND, autoFixBatchOptions ) const stateBatchTxSubmitter: TransactionSubmitter = new YnatmTransactionSubmitter( proposerSigner, + l1Provider, resubmissionConfig, requiredEnvVars.NUM_CONFIRMATIONS ) + const stateBatchSubmitter = new StateBatchSubmitter( proposerSigner, + l1Provider, l2Provider, requiredEnvVars.MIN_L1_TX_SIZE, requiredEnvVars.MAX_L1_TX_SIZE, @@ -424,16 +518,28 @@ export const run = async () => { ): Promise => { // Clear all pending transactions if (clearPendingTxs) { + //https://github.com/ethereum-optimism/batch-submitter/pull/17 + //this seems to be a develop-debug feature chunk of code + //and it wont work with Vault try { - const pendingTxs = await sequencerSigner.getTransactionCount('pending') - const latestTxs = await sequencerSigner.getTransactionCount('latest') + const address = await getBatchSignerAddress(sequencerSigner) + const pendingTxs = await getTransactionCountBlock( + l1Provider, + address, + 'pending' + ) + const latestTxs = await getTransactionCountBlock( + l1Provider, + address, + 'latest' + ) if (pendingTxs > latestTxs) { logger.info( 'Detected pending transactions. Clearing all transactions!' ) for (let i = latestTxs; i < pendingTxs; i++) { - const response = await sequencerSigner.sendTransaction({ - to: await sequencerSigner.getAddress(), + const response = await sequencerSigner.signer.sendTransaction({ + to: address, value: 0, nonce: i, }) @@ -446,7 +552,7 @@ export const run = async () => { logger.debug('empty transaction data', { data: response.data, }) - await sequencerSigner.provider.waitForTransaction( + await l1Provider.waitForTransaction( response.hash, requiredEnvVars.NUM_CONFIRMATIONS ) diff --git a/packages/batch-submitter/src/transaction-chain-contract.ts b/packages/batch-submitter/src/transaction-chain-contract.ts index 1caf496eac21..5068eda242ab 100644 --- a/packages/batch-submitter/src/transaction-chain-contract.ts +++ b/packages/batch-submitter/src/transaction-chain-contract.ts @@ -21,9 +21,10 @@ export { encodeAppendSequencerBatch, BatchContext, AppendSequencerBatchParams } export class CanonicalTransactionChainContract extends Contract { public customPopulateTransaction = { appendSequencerBatch: async ( - batch: AppendSequencerBatchParams + batch: AppendSequencerBatchParams, + nonce: number ): Promise => { - const nonce = await this.signer.getTransactionCount() + //this is only called in non-vault case const to = this.address const data = getEncodedCalldata(batch) const gasLimit = await this.signer.provider.estimateGas({ diff --git a/packages/batch-submitter/src/utils/tx-submission.ts b/packages/batch-submitter/src/utils/tx-submission.ts index 4de69c35d0ef..a6d63fdb16da 100644 --- a/packages/batch-submitter/src/utils/tx-submission.ts +++ b/packages/batch-submitter/src/utils/tx-submission.ts @@ -1,10 +1,16 @@ -import { Signer, utils, ethers, PopulatedTransaction } from 'ethers' +import { ethers, PopulatedTransaction, BigNumber } from 'ethers' import { TransactionReceipt, TransactionResponse, } from '@ethersproject/abstract-provider' import * as ynatm from '@eth-optimism/ynatm' - +import { BatchSigner } from '../batch-submitter/batch-submitter' +import { StaticJsonRpcProvider } from '@ethersproject/providers' +import { + submitToVault, + VaultTransactionResponse, + VaultPopulatedTransaction, +} from './vault' export interface ResubmissionConfig { resubmissionTimeout: number minGasPriceInGwei: number @@ -12,25 +18,51 @@ export interface ResubmissionConfig { gasRetryIncrement: number } -export type SubmitTransactionFn = ( - tx: PopulatedTransaction -) => Promise +export interface AppendQueueBatch { + appendQueueBatch: Function + numQueuedTransactions: BigNumber + type: 'AppendQueueBatch' +} + +export interface AppendStateBatch { + appendStateBatch: Function + batch: any[] + offsetStartsAtIndex: number + nonce: number + type: 'AppendStateBatch' + address: string +} + +export interface AppendSequencerBatch { + appendSequencerBatch: Function + batchParams: any + type: 'AppendSequencerBatch' + address: string + nonce: number +} export interface TxSubmissionHooks { - beforeSendTransaction: (tx: PopulatedTransaction) => void - onTransactionResponse: (txResponse: TransactionResponse) => void + beforeSendTransaction: ( + tx: PopulatedTransaction | VaultPopulatedTransaction + ) => void + onTransactionResponse: ( + txResponse: TransactionResponse | VaultTransactionResponse + ) => void } -const getGasPriceInGwei = async (signer: Signer): Promise => { +const getGasPriceInGwei = async ( + provider: StaticJsonRpcProvider +): Promise => { return parseInt( - ethers.utils.formatUnits(await signer.getGasPrice(), 'gwei'), + ethers.utils.formatUnits(await provider.getGasPrice(), 'gwei'), 10 ) } export const submitTransactionWithYNATM = async ( - tx: PopulatedTransaction, - signer: Signer, + call: AppendQueueBatch | AppendStateBatch | AppendSequencerBatch, + batchSigner: BatchSigner, + provider: StaticJsonRpcProvider, config: ResubmissionConfig, numConfirmations: number, hooks: TxSubmissionHooks @@ -38,17 +70,39 @@ export const submitTransactionWithYNATM = async ( const sendTxAndWaitForReceipt = async ( gasPrice ): Promise => { - const fullTx = { - ...tx, - gasPrice, + + if (batchSigner.signer !== undefined) { + let tx + if (call.type === 'AppendQueueBatch') { + tx = await call.appendQueueBatch(tx.appendQueueBatch) + } else if (call.type === 'AppendStateBatch') { + tx = await call.appendStateBatch(call.batch, call.offsetStartsAtIndex, { + nonce: call.nonce, + }) + } else if (call.type === 'AppendSequencerBatch') { + tx = await call.appendSequencerBatch(call.batchParams, call.nonce) + } + + const fullTx = { + ...tx, + gasPrice, + } + hooks.beforeSendTransaction(fullTx) + + const txResponse = await batchSigner.signer.sendTransaction(fullTx) + hooks.onTransactionResponse(txResponse) + return provider.waitForTransaction(txResponse.hash, numConfirmations) + } else { + const transactionHash = await submitToVault( + call, + batchSigner, + hooks, + gasPrice + ) + return provider.waitForTransaction(transactionHash, numConfirmations) } - hooks.beforeSendTransaction(fullTx) - const txResponse = await signer.sendTransaction(fullTx) - hooks.onTransactionResponse(txResponse) - return signer.provider.waitForTransaction(txResponse.hash, numConfirmations) } - - const minGasPrice = await getGasPriceInGwei(signer) + const minGasPrice = await getGasPriceInGwei(provider) const receipt = await ynatm.send({ sendTransactionFunction: sendTxAndWaitForReceipt, minGasPrice: ynatm.toGwei(minGasPrice), @@ -61,20 +115,21 @@ export const submitTransactionWithYNATM = async ( export interface TransactionSubmitter { submitTransaction( - tx: PopulatedTransaction, + tx: AppendQueueBatch | AppendStateBatch | AppendSequencerBatch, hooks?: TxSubmissionHooks ): Promise } export class YnatmTransactionSubmitter implements TransactionSubmitter { constructor( - readonly signer: Signer, + readonly batchSigner: BatchSigner, + readonly provider: StaticJsonRpcProvider, readonly ynatmConfig: ResubmissionConfig, readonly numConfirmations: number ) {} public async submitTransaction( - tx: PopulatedTransaction, + tx: AppendQueueBatch | AppendStateBatch | AppendSequencerBatch, hooks?: TxSubmissionHooks ): Promise { if (!hooks) { @@ -85,7 +140,8 @@ export class YnatmTransactionSubmitter implements TransactionSubmitter { } return submitTransactionWithYNATM( tx, - this.signer, + this.batchSigner, + this.provider, this.ynatmConfig, this.numConfirmations, hooks diff --git a/packages/batch-submitter/src/utils/vault.ts b/packages/batch-submitter/src/utils/vault.ts new file mode 100644 index 000000000000..817ba7e99a23 --- /dev/null +++ b/packages/batch-submitter/src/utils/vault.ts @@ -0,0 +1,133 @@ +import * as fs from 'fs' +import { StaticJsonRpcProvider } from '@ethersproject/providers' +import fetch from 'node-fetch' +import { + AppendQueueBatch, + AppendSequencerBatch, + AppendStateBatch, + TxSubmissionHooks, +} from '.' +import { BatchSigner } from '..' +import { BatchContext } from '../transaction-chain-contract' + +export interface VaultPopulatedTransaction { + url: RequestInfo + requestInit: RequestInit +} + +export interface VaultTransactionResponse { + requestId: string + leaseId: string + renewable: boolean + leaseDuration: number + data: VaultTransactionResponseData + wrapInfo: any + warnings: any + auth: any +} + +export interface VaultTransactionResponseData { + contract: string + from: string + gasLimit: boolean + gasPrice: number + nonce: number + signedTransaction: string + transactionHash: string +} + +export const submitToVault = async ( + call: AppendQueueBatch | AppendStateBatch | AppendSequencerBatch, + batchSigner: BatchSigner, + hooks: TxSubmissionHooks, + gasPrice: number +): Promise => { + const token = getToken(batchSigner) + + if (call.type === 'AppendStateBatch') { + const url = + batchSigner.vault_addr + + '/v1/immutability-eth-plugin/wallets/proposer/accounts/' + + batchSigner.address + + '/ovm/appendStateBatch' + const requestInit = { + method: 'PUT', + headers: { + 'X-Vault-Request': 'true', + 'X-Vault-Token': token, + }, + body: JSON.stringify({ + nonce: call.nonce, + gas_price: gasPrice, + contract: call.address, + batch: call.batch, + should_start_at_element: call.offsetStartsAtIndex, + }), + } + hooks.beforeSendTransaction({ url, requestInit }) + const response = await fetch(url, requestInit) + const data = await response.json() + hooks.onTransactionResponse(data) + return data.data.transaction_hash + } else if (call.type === 'AppendSequencerBatch') { + const url = + batchSigner.vault_addr + + '/v1/immutability-eth-plugin/wallets/sequencer/accounts/' + + batchSigner.address + + '/ovm/appendSequencerBatch' + const requestInit = { + method: 'PUT', + headers: { + 'X-Vault-Request': 'true', + 'X-Vault-Token': token, + }, + body: JSON.stringify({ + nonce: call.nonce, + gas_price: gasPrice, + contract: call.address, + should_start_at_element: call.batchParams.shouldStartAtElement, + total_elements_to_append: call.batchParams.totalElementsToAppend, + contexts: transformContexts(call.batchParams.contexts), + transactions: call.batchParams.transactions, + }), + } + hooks.beforeSendTransaction({ url, requestInit }) + const response = await fetch(url, requestInit) + const data = await response.json() + hooks.onTransactionResponse(data) + return data.data.transaction_hash + } else if (call.type === 'AppendQueueBatch') { + // appendQueueBatch is currently disabled. + return + } +} + +//needs to be stringyfied so that Vault can consume it +const transformContexts = (contexts: BatchContext[]): any => { + const apiContexts: any = [] + for (const context of contexts) { + apiContexts.push( + JSON.stringify({ + num_sequenced_transactions: context.numSequencedTransactions, + num_subsequent_queue_transactions: + context.numSubsequentQueueTransactions, + timestamp: context.timestamp, + block_number: context.blockNumber, + }) + ) + } + return apiContexts +} + +const getToken = (batchSigner: BatchSigner): string => { + const env = process.env + if (env.AWS_SINK_JWT_TOKEN_PATH === undefined) { + return batchSigner.token + } else { + if (fs.existsSync(env.AWS_SINK_JWT_TOKEN_PATH)) { + return fs.readFileSync(env.AWS_SINK_JWT_TOKEN_PATH, 'utf-8') + } else { + return batchSigner.token + } + } +} diff --git a/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts b/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts index b2e2e1f53951..ee3fd7aa9bad 100644 --- a/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts +++ b/packages/batch-submitter/test/batch-submitter/batch-submitter.spec.ts @@ -1,13 +1,22 @@ import { expect } from '../setup' /* External Imports */ -import { ethers } from 'hardhat' +import { ethers as hardhatEthers } from 'hardhat' import '@nomiclabs/hardhat-ethers' -import { Signer, ContractFactory, Contract, BigNumber } from 'ethers' +import { + Signer, + ContractFactory, + Contract, + BigNumber, + ethers, + providers, +} from 'ethers' import ganache from 'ganache-core' -import sinon from 'sinon' -import { Web3Provider } from '@ethersproject/providers' - +import { + StaticJsonRpcProvider, + TransactionReceipt, + Web3Provider, +} from '@ethersproject/providers' import scc from '@eth-optimism/contracts/artifacts/contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol/OVM_StateCommitmentChain.json' import { getContractInterface, predeploys } from '@eth-optimism/contracts' import { smockit, MockContract } from '@eth-optimism/smock' @@ -26,29 +35,22 @@ import { StateBatchSubmitter, TX_BATCH_SUBMITTER_LOG_TAG, STATE_BATCH_SUBMITTER_LOG_TAG, - BatchSubmitter, YnatmTransactionSubmitter, ResubmissionConfig, + BatchSigner, } from '../../src' -import { - QueueOrigin, - Batch, - Signature, - remove0x, -} from '@eth-optimism/core-utils' +import { QueueOrigin, Batch, remove0x } from '@eth-optimism/core-utils' import { Logger, Metrics } from '@eth-optimism/common-ts' -const DUMMY_ADDRESS = '0x' + '00'.repeat(20) const EXAMPLE_STATE_ROOT = '0x16b7f83f409c7195b1f4fde5652f1b54a4477eacb6db7927691becafba5f8801' const MAX_GAS_LIMIT = 8_000_000 const MAX_TX_SIZE = 100_000 const MIN_TX_SIZE = 1_000 const MIN_GAS_PRICE_IN_GWEI = 1 -const MAX_GAS_PRICE_IN_GWEI = 70 const GAS_RETRY_INCREMENT = 5 -const GAS_THRESHOLD_IN_GWEI = 120 +const GAS_THRESHOLD_IN_GWEI = 140 // Helper functions interface QueueElement { @@ -66,11 +68,7 @@ const getQueueElement = async ( const nextQueueElement = await ctcContract.getQueueElement(nextQueueIndex) return nextQueueElement } -const DUMMY_SIG: Signature = { - r: '11'.repeat(32), - s: '22'.repeat(32), - v: 1, -} + // A transaction batch submitter which skips the validate batch check class TransactionBatchSubmitter extends RealTransactionBatchSubmitter { protected async _validateBatch(batch: Batch): Promise { @@ -82,10 +80,27 @@ const testMetrics = new Metrics({ prefix: 'bs_test' }) describe('BatchSubmitter', () => { let signer: Signer let sequencer: Signer + const l1ProviderReal = hardhatEthers.provider + const l1Provider = { + getGasPrice: async () => { + const gas = await l1ProviderReal.getGasPrice() + return gas + }, + waitForTransaction: async ( + hash: string, + _numConfirmations: number, + timeout?: number + ): Promise => { + const wait = await l1ProviderReal.waitForTransaction( + hash, + _numConfirmations + ) + return wait + }, + } as StaticJsonRpcProvider before(async () => { - ;[signer, sequencer] = await ethers.getSigners() + ;[signer, sequencer] = await hardhatEthers.getSigners() }) - let AddressManager: Contract let Mock__OVM_ExecutionManager: MockContract let Mock__OVM_BondManager: MockContract @@ -198,11 +213,10 @@ describe('BatchSubmitter', () => { ) }) - afterEach(() => { - sinon.restore() - }) - - const createBatchSubmitter = (timeout: number): TransactionBatchSubmitter => { + const createBatchSubmitter = ( + timeout: number, + l1ProviderMock?: providers.StaticJsonRpcProvider + ): TransactionBatchSubmitter => { const resubmissionConfig: ResubmissionConfig = { resubmissionTimeout: 100000, minGasPriceInGwei: MIN_GAS_PRICE_IN_GWEI, @@ -210,12 +224,14 @@ describe('BatchSubmitter', () => { gasRetryIncrement: GAS_RETRY_INCREMENT, } const txBatchTxSubmitter = new YnatmTransactionSubmitter( - sequencer, + createBatchSigner(sequencer), + l1Provider, resubmissionConfig, 1 ) return new TransactionBatchSubmitter( - sequencer, + createBatchSigner(sequencer), + l1ProviderMock || l1ProviderReal, l2Provider as any, MIN_TX_SIZE, MAX_TX_SIZE, @@ -229,8 +245,7 @@ describe('BatchSubmitter', () => { txBatchTxSubmitter, 1, new Logger({ name: TX_BATCH_SUBMITTER_LOG_TAG }), - testMetrics, - false + testMetrics ) } @@ -241,7 +256,7 @@ describe('BatchSubmitter', () => { timestamp: number }> = [] - let batchSubmitter + let batchSubmitter: TransactionBatchSubmitter beforeEach(async () => { for (let i = 1; i < 15; i++) { await OVM_CanonicalTransactionChain.enqueue( @@ -362,15 +377,22 @@ describe('BatchSubmitter', () => { l2Provider.setL2BlockData({ queueOrigin: QueueOrigin.L1ToL2, } as any) - const highGasPriceWei = BigNumber.from(600).mul(1_000_000_000) - - sinon - .stub(sequencer, 'getGasPrice') - .callsFake(async () => highGasPriceWei) - + let getGasPriceCalled = false + const l1ProviderMocked = { + _isProvider: true, + getBalance: l1ProviderReal.getBalance, + call: l1ProviderReal.call, + getGasPrice: async () => { + getGasPriceCalled = true + return highGasPriceWei + }, + } as StaticJsonRpcProvider + // we want to mock out the l1Provider so that we can return a custom getGasPrice method response + // so that we test - Do not submit batch if gas price above threshold lines + batchSubmitter = createBatchSubmitter(0, l1ProviderMocked) const receipt = await batchSubmitter.submitNextBatch() - expect(sequencer.getGasPrice).to.have.been.calledOnce + expect(getGasPriceCalled).to.be.true expect(receipt).to.be.undefined }) @@ -381,13 +403,25 @@ describe('BatchSubmitter', () => { } as any) const lowGasPriceWei = BigNumber.from(2).mul(1_000_000_000) - - sinon - .stub(sequencer, 'getGasPrice') - .callsFake(async () => lowGasPriceWei) - + let getGasPriceCalled = 0 + //stubbing + l1Provider.waitForTransaction = async ( + hash: string, + _numConfirmations: number, + timeout?: number + ): Promise => { + const wft = await l1ProviderReal.waitForTransaction( + hash, + _numConfirmations + ) + return wft + } + l1Provider.getGasPrice = async () => { + getGasPriceCalled += 1 + return lowGasPriceWei + } const receipt = await batchSubmitter.submitNextBatch() - expect(sequencer.getGasPrice).to.have.been.calledTwice + expect(getGasPriceCalled).to.be.equal(1) expect(receipt).to.not.be.undefined }) }) @@ -436,12 +470,14 @@ describe('BatchSubmitter', () => { gasRetryIncrement: GAS_RETRY_INCREMENT, } const stateBatchTxSubmitter = new YnatmTransactionSubmitter( - sequencer, + createBatchSigner(sequencer), + l1Provider, resubmissionConfig, 1 ) stateBatchSubmitter = new StateBatchSubmitter( - sequencer, + createBatchSigner(sequencer), + l1ProviderReal, l2Provider as any, MIN_TX_SIZE, MAX_TX_SIZE, @@ -494,3 +530,12 @@ describe('Batch Submitter with Ganache', () => { await server.close() }) }) + +const createBatchSigner = (signer: Signer): BatchSigner => { + return { + signer, + address: undefined, + token: undefined, + vault_addr: undefined, + } +} diff --git a/packages/batch-submitter/test/helpers/constants.ts b/packages/batch-submitter/test/helpers/constants.ts index fa572ebfc0c1..a197c8f50c46 100644 --- a/packages/batch-submitter/test/helpers/constants.ts +++ b/packages/batch-submitter/test/helpers/constants.ts @@ -1,5 +1,4 @@ /* External Imports */ -import { ethers } from 'ethers' import { defaultAccounts } from 'ethereum-waffle' export const FORCE_INCLUSION_PERIOD_SECONDS = 600 diff --git a/packages/batch-submitter/test/utils/tx-submission.spec.ts b/packages/batch-submitter/test/utils/tx-submission.spec.ts index 877e47dee51f..8782ad8bf242 100644 --- a/packages/batch-submitter/test/utils/tx-submission.spec.ts +++ b/packages/batch-submitter/test/utils/tx-submission.spec.ts @@ -1,11 +1,16 @@ import { expect } from '../setup' +import { ethers as hardhatEthers } from 'hardhat' import { ethers, BigNumber, Signer } from 'ethers' -import { submitTransactionWithYNATM } from '../../src/utils/tx-submission' -import { ResubmissionConfig } from '../../src' +import { + AppendSequencerBatch, + submitTransactionWithYNATM, +} from '../../src/utils/tx-submission' +import { BatchSigner, ResubmissionConfig } from '../../src' import { TransactionReceipt, TransactionResponse, } from '@ethersproject/abstract-provider' +import { StaticJsonRpcProvider } from '@ethersproject/providers' const nullFunction = () => undefined const nullHooks = { @@ -22,9 +27,10 @@ describe('submitTransactionWithYNATM', async () => { onTransactionResponse: false, } const dummyHash = 'dummy hash' + const data = 'we here though' const numConfirmations = 3 const tx = { - data: 'we here though', + data, } as ethers.PopulatedTransaction const sendTransaction = async ( _tx: ethers.PopulatedTransaction @@ -49,12 +55,12 @@ describe('submitTransactionWithYNATM', async () => { } as TransactionReceipt } const signer = { - getGasPrice: async () => ethers.BigNumber.from(0), sendTransaction, - provider: { - waitForTransaction, - }, } as Signer + const provider = { + getGasPrice: async () => ethers.BigNumber.from(0), + waitForTransaction, + } as StaticJsonRpcProvider const hooks = { beforeSendTransaction: (submittingTx: ethers.PopulatedTransaction) => { called.beforeSendTransaction = true @@ -72,8 +78,9 @@ describe('submitTransactionWithYNATM', async () => { gasRetryIncrement: 1, } await submitTransactionWithYNATM( - tx, - signer, + appendSequencerBatch(mockAppendSequncerBatchFun, data, 0), + createBatchSigner(signer), + provider, config, numConfirmations, hooks @@ -89,12 +96,12 @@ describe('submitTransactionWithYNATM', async () => { // than our resubmission timeout const resubmissionTimeout = 100 const txReceiptDelay = resubmissionTimeout * 3 - const numConfirmations = 3 + const data = 'hello world!' let lastGasPrice = BigNumber.from(0) // Create a transaction which has a gas price that we will watch increment const tx = { gasPrice: lastGasPrice.add(1), - data: 'hello world!', + data, } as ethers.PopulatedTransaction const sendTransaction = async ( _tx: ethers.PopulatedTransaction @@ -103,7 +110,7 @@ describe('submitTransactionWithYNATM', async () => { expect(_tx.gasPrice > lastGasPrice).to.be.true lastGasPrice = _tx.gasPrice return { - hash: 'dummy hash', + hash: 'dummy hash' } as TransactionResponse } const waitForTransaction = async ( @@ -116,16 +123,54 @@ describe('submitTransactionWithYNATM', async () => { const signer = { getGasPrice: async () => ethers.BigNumber.from(0), sendTransaction, - provider: { - waitForTransaction, - }, } as Signer + const l1Provider = { + getGasPrice: async () => ethers.BigNumber.from(0), + waitForTransaction, + } as StaticJsonRpcProvider const config: ResubmissionConfig = { resubmissionTimeout, minGasPriceInGwei: 0, maxGasPriceInGwei: 1000, gasRetryIncrement: 1, } - await submitTransactionWithYNATM(tx, signer, config, 0, nullHooks) + await submitTransactionWithYNATM( + appendSequencerBatch(mockAppendSequncerBatchFun, data, 0), + createBatchSigner(signer), + l1Provider, + config, + 0, + nullHooks + ) }) }) +const createBatchSigner = (signer: Signer): BatchSigner => { + return { + signer, + address: undefined, + token: undefined, + vault_addr: undefined, + } +} + +const mockAppendSequncerBatchFun = async ( + data: string +): Promise => { + return { + data, + } as ethers.PopulatedTransaction +} + +const appendSequencerBatch = ( + appendSequencerBatchArg: Function, + batchParamsArg: any, + nonce: number +): AppendSequencerBatch => { + return { + appendSequencerBatch: appendSequencerBatchArg, + batchParams: batchParamsArg, + type: 'AppendSequencerBatch', + nonce, + address: undefined, + } +} diff --git a/packages/contracts/bin/deploy.ts b/packages/contracts/bin/deploy.ts index 5ae7e94a04ea..0ec55e2a565f 100755 --- a/packages/contracts/bin/deploy.ts +++ b/packages/contracts/bin/deploy.ts @@ -15,11 +15,35 @@ process.env.CONTRACTS_RPC_URL = import hre from 'hardhat' -const sequencer = new Wallet(process.env.SEQUENCER_PRIVATE_KEY) -const proposer = new Wallet(process.env.PROPOSER_PRIVATE_KEY) const deployer = new Wallet(process.env.DEPLOYER_PRIVATE_KEY) const relayer = new Wallet(process.env.RELAYER_PRIVATE_KEY) +const getSequencerAddress = async () => { + let address = process.env.SEQUENCER_ADDRESS + if (address === undefined) { + console.log('Sequencer set from private key') + const wallet = new Wallet(process.env.SEQUENCER_PRIVATE_KEY) + address = await wallet.getAddress() + return address + } else { + console.log(`Sequencer set from provided address ${address}`) + return address + } +} + +const getProposerAddress = async () => { + let address = process.env.PROPOSER_ADDRESS + if (address === undefined) { + const wallet = new Wallet(process.env.PROPOSER_PRIVATE_KEY) + address = await wallet.getAddress() + console.log('Proposer set from private key') + return address + } else { + console.log(`Proposer set from provided address ${address}`) + return address + } +} + const parseEnv = () => { const ensure = (env, type) => { if (typeof process.env[env] === 'undefined') { @@ -65,8 +89,8 @@ const main = async () => { emOvmChainId: config.emOvmChainId, sccFraudProofWindow: config.sccFraudProofWindow, sccSequencerPublishWindow: config.sccFraudProofWindow, - ovmSequencerAddress: sequencer.address, - ovmProposerAddress: proposer.address, + ovmSequencerAddress: await getSequencerAddress(), + ovmProposerAddress: await getProposerAddress(), ovmRelayerAddress: relayer.address, ovmAddressManagerOwner: deployer.address, noCompile: process.env.NO_COMPILE ? true : false, @@ -98,7 +122,7 @@ const main = async () => { return contractsAccumulator }, {}) - contracts.OVM_Sequencer = await sequencer.getAddress() + contracts.OVM_Sequencer = getSequencerAddress() contracts.Deployer = await deployer.getAddress() const addresses = JSON.stringify(contracts, null, 2) diff --git a/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol b/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol index 5bac356a5496..64f83af316cf 100644 --- a/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol +++ b/packages/contracts/contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity >0.5.0 <0.8.0; pragma experimental ABIEncoderV2; - /* Library Imports */ import { Lib_OVMCodec } from "../../libraries/codec/Lib_OVMCodec.sol"; import { Lib_AddressResolver } from "../../libraries/resolver/Lib_AddressResolver.sol"; diff --git a/packages/message-relayer/src/service.ts b/packages/message-relayer/src/service.ts index cd3c10588c79..3a3b65b40298 100644 --- a/packages/message-relayer/src/service.ts +++ b/packages/message-relayer/src/service.ts @@ -353,7 +353,7 @@ export class MessageRelayerService extends BaseService { return event.args._batchIndex > lastProcessedBatch.batch.batchIndex }) const newSize = this.state.eventCache.length - this.logger.info("Trimmed eventCache", { + this.logger.info('Trimmed eventCache', { oldSize, newSize, }) diff --git a/packages/omgx/immutability/docker/README.md b/packages/omgx/immutability/README.md similarity index 70% rename from packages/omgx/immutability/docker/README.md rename to packages/omgx/immutability/README.md index b91133164567..f291debb74a9 100755 --- a/packages/omgx/immutability/docker/README.md +++ b/packages/omgx/immutability/README.md @@ -1,29 +1,9 @@ # immutability-eth-plugin docker +cd ops/ +rm -rf vault/ && docker build ../ --file /Users/inomurko/opt/optimism/ops/docker/Dockerfile.omgx_vault --tag omgx/vault:latest && docker-compose -f ../packages/omgx/immutability/docker/docker-compose-vault-test.yml up l1_chain vault -Previously, when you executed `docker-compose -f docker/docker-compose.yml up --build` it would: - -* Spin up a ganache container -* Deploy the plasma contracts -* Spin up an `ephemeral` vault instance -* Execute some smoke tests - -Now, the behavior is different. - -The first time you bring up the `docker-compose`, it will: - -* Spin up a ganache container -* Deploy the plasma contracts -* Spin up a `persistent` vault instance -* Initialize the vault instance - with one key shard -* Unseal the vault instance -* Execute some smoke tests - -From then on, however, all subsequent runs of `docker-compose` will: - -* Spin up a ganache container -* Deploy the plasma contracts -* Spin up a `persistent` vault instance -* Unseal the vault instance +The overlay `docker-compose-vault-test.yml` persist data on disk, if you want to re-start from fresh, delete the Vault dir like above. +If you make any changes to Vault code (lets say route plugins for http req/resp) you need to delete the Vault dir so that the plugin reloads or use the cycle.sh script in test/. If you interact with vault from the outside - say change the rpc_url, create new accounts, etc - all that will be persisted. so, each subsequent time you run docker-compose, your previous interactions will be retained. @@ -67,6 +47,4 @@ export VAULT_TOKEN=$(cat $GOPATH/src/github.com/omgnetwork/immutability-eth-plug vault read -format=json immutability-eth-plugin/config -``` - -Unless of course, you are using elixir... in which case, you are on your own. \ No newline at end of file +``` diff --git a/packages/omgx/immutability/config/vault.hcl b/packages/omgx/immutability/config/vault.hcl new file mode 100644 index 000000000000..f0ca9d827ddd --- /dev/null +++ b/packages/omgx/immutability/config/vault.hcl @@ -0,0 +1,20 @@ +default_lease_ttl = "168h" +disable_mlock = "true" +max_lease_ttl = "720h" +ui = "true" +backend "file" { + path = "/vault/config/data" +} + +#ui = "false" +#api_addr = "https://localhost:8900" if tls_disable == "false" +api_addr = "http://localhost:8900" +plugin_directory = "/vault/plugins" +listener "tcp" { + address = "0.0.0.0:8900" + #tls_cert_file = "/vault/config/my-service.crt" + #tls_client_ca_file = "/vault/config/ca.crt" + #tls_key_file = "/vault/config/my-service.key" + #tls_require_and_verify_client_cert = "false" + tls_disable = "true" +} diff --git a/packages/omgx/immutability/contracts/ovm_ctc/ovm_ctc.go b/packages/omgx/immutability/contracts/ovm_ctc/ovm_ctc.go index 479c61c58c32..51c10ec3d5f0 100644 --- a/packages/omgx/immutability/contracts/ovm_ctc/ovm_ctc.go +++ b/packages/omgx/immutability/contracts/ovm_ctc/ovm_ctc.go @@ -8,15 +8,14 @@ package ovm_ctc import ( - "math/big" - "strings" - ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "math/big" + "strings" ) // Reference imports to suppress errors if they are not otherwise used. @@ -760,7 +759,7 @@ func (_OvmCtc *OvmCtcTransactorSession) AppendSequencerBatch() (*types.Transacti // these three were manually added so that we get an interface to RawTransact // Solidity: function RawAppendSequencerBatch() returns() func (_OvmCtc *OvmCtcTransactor) RawAppendSequencerBatch(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { - return _OvmCtc.contract.RawTransact(opts, append([]byte("0xd0f89344"), calldata...)) + return _OvmCtc.contract.RawTransact(opts, calldata) } // AppendSequencerBatch is a paid mutator transaction binding the contract method 0xd0f89344. diff --git a/packages/omgx/immutability/contracts/plasma/BlockController.abi b/packages/omgx/immutability/contracts/plasma/BlockController.abi deleted file mode 100644 index 3a7541e79b47..000000000000 --- a/packages/omgx/immutability/contracts/plasma/BlockController.abi +++ /dev/null @@ -1,333 +0,0 @@ -[ - { - "constant": true, - "inputs": [], - "name": "isChildChainActivated", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "childBlockInterval", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getMaintainer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "nextChildBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_vaultAddress", - "type": "address" - } - ], - "name": "registerVault", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_vaultId", - "type": "uint256" - } - ], - "name": "vaults", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "nextDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "authority", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_vaultAddress", - "type": "address" - } - ], - "name": "vaultToId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "blocks", - "outputs": [ - { - "internalType": "bytes32", - "name": "root", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_interval", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_minExitPeriod", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_initialImmuneVaults", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_authority", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "BlockSubmitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "authority", - "type": "address" - } - ], - "name": "ChildChainActivated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "vaultId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "vaultAddress", - "type": "address" - } - ], - "name": "VaultRegistered", - "type": "event" - }, - { - "constant": false, - "inputs": [], - "name": "activateChildChain", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "bytes32", - "name": "_blockRoot", - "type": "bytes32" - } - ], - "name": "submitBlock", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "bytes32", - "name": "_blockRoot", - "type": "bytes32" - } - ], - "name": "submitDepositBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "nextDepositBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "blockNum", - "type": "uint256" - } - ], - "name": "isDeposit", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } -] diff --git a/packages/omgx/immutability/contracts/plasma/Plasma.go b/packages/omgx/immutability/contracts/plasma/Plasma.go deleted file mode 100644 index 95569925d0bf..000000000000 --- a/packages/omgx/immutability/contracts/plasma/Plasma.go +++ /dev/null @@ -1,952 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package plasma - -import ( - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription -) - -// PlasmaABI is the input ABI used to generate the binding from. -const PlasmaABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"isChildChainActivated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"childBlockInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getMaintainer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nextChildBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_vaultId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_vaultAddress\",\"type\":\"address\"}],\"name\":\"registerVault\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_vaultId\",\"type\":\"uint256\"}],\"name\":\"vaults\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nextDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"authority\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_vaultAddress\",\"type\":\"address\"}],\"name\":\"vaultToId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"blocks\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_interval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minExitPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_initialImmuneVaults\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_authority\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"BlockSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"authority\",\"type\":\"address\"}],\"name\":\"ChildChainActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"vaultId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"vaultAddress\",\"type\":\"address\"}],\"name\":\"VaultRegistered\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[],\"name\":\"activateChildChain\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_blockRoot\",\"type\":\"bytes32\"}],\"name\":\"submitBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_blockRoot\",\"type\":\"bytes32\"}],\"name\":\"submitDepositBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nextDepositBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"isDeposit\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]" - -// Plasma is an auto generated Go binding around an Ethereum contract. -type Plasma struct { - PlasmaCaller // Read-only binding to the contract - PlasmaTransactor // Write-only binding to the contract - PlasmaFilterer // Log filterer for contract events -} - -// PlasmaCaller is an auto generated read-only Go binding around an Ethereum contract. -type PlasmaCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PlasmaTransactor is an auto generated write-only Go binding around an Ethereum contract. -type PlasmaTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PlasmaFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type PlasmaFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PlasmaSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type PlasmaSession struct { - Contract *Plasma // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PlasmaCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type PlasmaCallerSession struct { - Contract *PlasmaCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// PlasmaTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type PlasmaTransactorSession struct { - Contract *PlasmaTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PlasmaRaw is an auto generated low-level Go binding around an Ethereum contract. -type PlasmaRaw struct { - Contract *Plasma // Generic contract binding to access the raw methods on -} - -// PlasmaCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type PlasmaCallerRaw struct { - Contract *PlasmaCaller // Generic read-only contract binding to access the raw methods on -} - -// PlasmaTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type PlasmaTransactorRaw struct { - Contract *PlasmaTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewPlasma creates a new instance of Plasma, bound to a specific deployed contract. -func NewPlasma(address common.Address, backend bind.ContractBackend) (*Plasma, error) { - contract, err := bindPlasma(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &Plasma{PlasmaCaller: PlasmaCaller{contract: contract}, PlasmaTransactor: PlasmaTransactor{contract: contract}, PlasmaFilterer: PlasmaFilterer{contract: contract}}, nil -} - -// NewPlasmaCaller creates a new read-only instance of Plasma, bound to a specific deployed contract. -func NewPlasmaCaller(address common.Address, caller bind.ContractCaller) (*PlasmaCaller, error) { - contract, err := bindPlasma(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &PlasmaCaller{contract: contract}, nil -} - -// NewPlasmaTransactor creates a new write-only instance of Plasma, bound to a specific deployed contract. -func NewPlasmaTransactor(address common.Address, transactor bind.ContractTransactor) (*PlasmaTransactor, error) { - contract, err := bindPlasma(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &PlasmaTransactor{contract: contract}, nil -} - -// NewPlasmaFilterer creates a new log filterer instance of Plasma, bound to a specific deployed contract. -func NewPlasmaFilterer(address common.Address, filterer bind.ContractFilterer) (*PlasmaFilterer, error) { - contract, err := bindPlasma(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &PlasmaFilterer{contract: contract}, nil -} - -// bindPlasma binds a generic wrapper to an already deployed contract. -func bindPlasma(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(PlasmaABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Plasma *PlasmaRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _Plasma.Contract.PlasmaCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Plasma *PlasmaRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Plasma.Contract.PlasmaTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Plasma *PlasmaRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Plasma.Contract.PlasmaTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Plasma *PlasmaCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _Plasma.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Plasma *PlasmaTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Plasma.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Plasma *PlasmaTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Plasma.Contract.contract.Transact(opts, method, params...) -} - -// Authority is a free data retrieval call binding the contract method 0xbf7e214f. -// -// Solidity: function authority() view returns(address) -func (_Plasma *PlasmaCaller) Authority(opts *bind.CallOpts) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "authority") - return *ret0, err -} - -// Authority is a free data retrieval call binding the contract method 0xbf7e214f. -// -// Solidity: function authority() view returns(address) -func (_Plasma *PlasmaSession) Authority() (common.Address, error) { - return _Plasma.Contract.Authority(&_Plasma.CallOpts) -} - -// Authority is a free data retrieval call binding the contract method 0xbf7e214f. -// -// Solidity: function authority() view returns(address) -func (_Plasma *PlasmaCallerSession) Authority() (common.Address, error) { - return _Plasma.Contract.Authority(&_Plasma.CallOpts) -} - -// Blocks is a free data retrieval call binding the contract method 0xf25b3f99. -// -// Solidity: function blocks(uint256 ) view returns(bytes32 root, uint256 timestamp) -func (_Plasma *PlasmaCaller) Blocks(opts *bind.CallOpts, arg0 *big.Int) (struct { - Root [32]byte - Timestamp *big.Int -}, error) { - ret := new(struct { - Root [32]byte - Timestamp *big.Int - }) - out := ret - err := _Plasma.contract.Call(opts, out, "blocks", arg0) - return *ret, err -} - -// Blocks is a free data retrieval call binding the contract method 0xf25b3f99. -// -// Solidity: function blocks(uint256 ) view returns(bytes32 root, uint256 timestamp) -func (_Plasma *PlasmaSession) Blocks(arg0 *big.Int) (struct { - Root [32]byte - Timestamp *big.Int -}, error) { - return _Plasma.Contract.Blocks(&_Plasma.CallOpts, arg0) -} - -// Blocks is a free data retrieval call binding the contract method 0xf25b3f99. -// -// Solidity: function blocks(uint256 ) view returns(bytes32 root, uint256 timestamp) -func (_Plasma *PlasmaCallerSession) Blocks(arg0 *big.Int) (struct { - Root [32]byte - Timestamp *big.Int -}, error) { - return _Plasma.Contract.Blocks(&_Plasma.CallOpts, arg0) -} - -// ChildBlockInterval is a free data retrieval call binding the contract method 0x38a9e0bc. -// -// Solidity: function childBlockInterval() view returns(uint256) -func (_Plasma *PlasmaCaller) ChildBlockInterval(opts *bind.CallOpts) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "childBlockInterval") - return *ret0, err -} - -// ChildBlockInterval is a free data retrieval call binding the contract method 0x38a9e0bc. -// -// Solidity: function childBlockInterval() view returns(uint256) -func (_Plasma *PlasmaSession) ChildBlockInterval() (*big.Int, error) { - return _Plasma.Contract.ChildBlockInterval(&_Plasma.CallOpts) -} - -// ChildBlockInterval is a free data retrieval call binding the contract method 0x38a9e0bc. -// -// Solidity: function childBlockInterval() view returns(uint256) -func (_Plasma *PlasmaCallerSession) ChildBlockInterval() (*big.Int, error) { - return _Plasma.Contract.ChildBlockInterval(&_Plasma.CallOpts) -} - -// GetMaintainer is a free data retrieval call binding the contract method 0x4b0a72bc. -// -// Solidity: function getMaintainer() view returns(address) -func (_Plasma *PlasmaCaller) GetMaintainer(opts *bind.CallOpts) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "getMaintainer") - return *ret0, err -} - -// GetMaintainer is a free data retrieval call binding the contract method 0x4b0a72bc. -// -// Solidity: function getMaintainer() view returns(address) -func (_Plasma *PlasmaSession) GetMaintainer() (common.Address, error) { - return _Plasma.Contract.GetMaintainer(&_Plasma.CallOpts) -} - -// GetMaintainer is a free data retrieval call binding the contract method 0x4b0a72bc. -// -// Solidity: function getMaintainer() view returns(address) -func (_Plasma *PlasmaCallerSession) GetMaintainer() (common.Address, error) { - return _Plasma.Contract.GetMaintainer(&_Plasma.CallOpts) -} - -// IsChildChainActivated is a free data retrieval call binding the contract method 0x0e71ee02. -// -// Solidity: function isChildChainActivated() view returns(bool) -func (_Plasma *PlasmaCaller) IsChildChainActivated(opts *bind.CallOpts) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "isChildChainActivated") - return *ret0, err -} - -// IsChildChainActivated is a free data retrieval call binding the contract method 0x0e71ee02. -// -// Solidity: function isChildChainActivated() view returns(bool) -func (_Plasma *PlasmaSession) IsChildChainActivated() (bool, error) { - return _Plasma.Contract.IsChildChainActivated(&_Plasma.CallOpts) -} - -// IsChildChainActivated is a free data retrieval call binding the contract method 0x0e71ee02. -// -// Solidity: function isChildChainActivated() view returns(bool) -func (_Plasma *PlasmaCallerSession) IsChildChainActivated() (bool, error) { - return _Plasma.Contract.IsChildChainActivated(&_Plasma.CallOpts) -} - -// IsDeposit is a free data retrieval call binding the contract method 0xebde2ec9. -// -// Solidity: function isDeposit(uint256 blockNum) view returns(bool) -func (_Plasma *PlasmaCaller) IsDeposit(opts *bind.CallOpts, blockNum *big.Int) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "isDeposit", blockNum) - return *ret0, err -} - -// IsDeposit is a free data retrieval call binding the contract method 0xebde2ec9. -// -// Solidity: function isDeposit(uint256 blockNum) view returns(bool) -func (_Plasma *PlasmaSession) IsDeposit(blockNum *big.Int) (bool, error) { - return _Plasma.Contract.IsDeposit(&_Plasma.CallOpts, blockNum) -} - -// IsDeposit is a free data retrieval call binding the contract method 0xebde2ec9. -// -// Solidity: function isDeposit(uint256 blockNum) view returns(bool) -func (_Plasma *PlasmaCallerSession) IsDeposit(blockNum *big.Int) (bool, error) { - return _Plasma.Contract.IsDeposit(&_Plasma.CallOpts, blockNum) -} - -// NextChildBlock is a free data retrieval call binding the contract method 0x4ca8714f. -// -// Solidity: function nextChildBlock() view returns(uint256) -func (_Plasma *PlasmaCaller) NextChildBlock(opts *bind.CallOpts) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "nextChildBlock") - return *ret0, err -} - -// NextChildBlock is a free data retrieval call binding the contract method 0x4ca8714f. -// -// Solidity: function nextChildBlock() view returns(uint256) -func (_Plasma *PlasmaSession) NextChildBlock() (*big.Int, error) { - return _Plasma.Contract.NextChildBlock(&_Plasma.CallOpts) -} - -// NextChildBlock is a free data retrieval call binding the contract method 0x4ca8714f. -// -// Solidity: function nextChildBlock() view returns(uint256) -func (_Plasma *PlasmaCallerSession) NextChildBlock() (*big.Int, error) { - return _Plasma.Contract.NextChildBlock(&_Plasma.CallOpts) -} - -// NextDeposit is a free data retrieval call binding the contract method 0xa8cabcd5. -// -// Solidity: function nextDeposit() view returns(uint256) -func (_Plasma *PlasmaCaller) NextDeposit(opts *bind.CallOpts) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "nextDeposit") - return *ret0, err -} - -// NextDeposit is a free data retrieval call binding the contract method 0xa8cabcd5. -// -// Solidity: function nextDeposit() view returns(uint256) -func (_Plasma *PlasmaSession) NextDeposit() (*big.Int, error) { - return _Plasma.Contract.NextDeposit(&_Plasma.CallOpts) -} - -// NextDeposit is a free data retrieval call binding the contract method 0xa8cabcd5. -// -// Solidity: function nextDeposit() view returns(uint256) -func (_Plasma *PlasmaCallerSession) NextDeposit() (*big.Int, error) { - return _Plasma.Contract.NextDeposit(&_Plasma.CallOpts) -} - -// NextDepositBlock is a free data retrieval call binding the contract method 0x8701fc5d. -// -// Solidity: function nextDepositBlock() view returns(uint256) -func (_Plasma *PlasmaCaller) NextDepositBlock(opts *bind.CallOpts) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "nextDepositBlock") - return *ret0, err -} - -// NextDepositBlock is a free data retrieval call binding the contract method 0x8701fc5d. -// -// Solidity: function nextDepositBlock() view returns(uint256) -func (_Plasma *PlasmaSession) NextDepositBlock() (*big.Int, error) { - return _Plasma.Contract.NextDepositBlock(&_Plasma.CallOpts) -} - -// NextDepositBlock is a free data retrieval call binding the contract method 0x8701fc5d. -// -// Solidity: function nextDepositBlock() view returns(uint256) -func (_Plasma *PlasmaCallerSession) NextDepositBlock() (*big.Int, error) { - return _Plasma.Contract.NextDepositBlock(&_Plasma.CallOpts) -} - -// VaultToId is a free data retrieval call binding the contract method 0xdfb494f0. -// -// Solidity: function vaultToId(address _vaultAddress) view returns(uint256) -func (_Plasma *PlasmaCaller) VaultToId(opts *bind.CallOpts, _vaultAddress common.Address) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "vaultToId", _vaultAddress) - return *ret0, err -} - -// VaultToId is a free data retrieval call binding the contract method 0xdfb494f0. -// -// Solidity: function vaultToId(address _vaultAddress) view returns(uint256) -func (_Plasma *PlasmaSession) VaultToId(_vaultAddress common.Address) (*big.Int, error) { - return _Plasma.Contract.VaultToId(&_Plasma.CallOpts, _vaultAddress) -} - -// VaultToId is a free data retrieval call binding the contract method 0xdfb494f0. -// -// Solidity: function vaultToId(address _vaultAddress) view returns(uint256) -func (_Plasma *PlasmaCallerSession) VaultToId(_vaultAddress common.Address) (*big.Int, error) { - return _Plasma.Contract.VaultToId(&_Plasma.CallOpts, _vaultAddress) -} - -// Vaults is a free data retrieval call binding the contract method 0x8c64ea4a. -// -// Solidity: function vaults(uint256 _vaultId) view returns(address) -func (_Plasma *PlasmaCaller) Vaults(opts *bind.CallOpts, _vaultId *big.Int) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _Plasma.contract.Call(opts, out, "vaults", _vaultId) - return *ret0, err -} - -// Vaults is a free data retrieval call binding the contract method 0x8c64ea4a. -// -// Solidity: function vaults(uint256 _vaultId) view returns(address) -func (_Plasma *PlasmaSession) Vaults(_vaultId *big.Int) (common.Address, error) { - return _Plasma.Contract.Vaults(&_Plasma.CallOpts, _vaultId) -} - -// Vaults is a free data retrieval call binding the contract method 0x8c64ea4a. -// -// Solidity: function vaults(uint256 _vaultId) view returns(address) -func (_Plasma *PlasmaCallerSession) Vaults(_vaultId *big.Int) (common.Address, error) { - return _Plasma.Contract.Vaults(&_Plasma.CallOpts, _vaultId) -} - -// ActivateChildChain is a paid mutator transaction binding the contract method 0xa11dcc34. -// -// Solidity: function activateChildChain() returns() -func (_Plasma *PlasmaTransactor) ActivateChildChain(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Plasma.contract.Transact(opts, "activateChildChain") -} - -// ActivateChildChain is a paid mutator transaction binding the contract method 0xa11dcc34. -// -// Solidity: function activateChildChain() returns() -func (_Plasma *PlasmaSession) ActivateChildChain() (*types.Transaction, error) { - return _Plasma.Contract.ActivateChildChain(&_Plasma.TransactOpts) -} - -// ActivateChildChain is a paid mutator transaction binding the contract method 0xa11dcc34. -// -// Solidity: function activateChildChain() returns() -func (_Plasma *PlasmaTransactorSession) ActivateChildChain() (*types.Transaction, error) { - return _Plasma.Contract.ActivateChildChain(&_Plasma.TransactOpts) -} - -// RegisterVault is a paid mutator transaction binding the contract method 0x6a51fd63. -// -// Solidity: function registerVault(uint256 _vaultId, address _vaultAddress) returns() -func (_Plasma *PlasmaTransactor) RegisterVault(opts *bind.TransactOpts, _vaultId *big.Int, _vaultAddress common.Address) (*types.Transaction, error) { - return _Plasma.contract.Transact(opts, "registerVault", _vaultId, _vaultAddress) -} - -// RegisterVault is a paid mutator transaction binding the contract method 0x6a51fd63. -// -// Solidity: function registerVault(uint256 _vaultId, address _vaultAddress) returns() -func (_Plasma *PlasmaSession) RegisterVault(_vaultId *big.Int, _vaultAddress common.Address) (*types.Transaction, error) { - return _Plasma.Contract.RegisterVault(&_Plasma.TransactOpts, _vaultId, _vaultAddress) -} - -// RegisterVault is a paid mutator transaction binding the contract method 0x6a51fd63. -// -// Solidity: function registerVault(uint256 _vaultId, address _vaultAddress) returns() -func (_Plasma *PlasmaTransactorSession) RegisterVault(_vaultId *big.Int, _vaultAddress common.Address) (*types.Transaction, error) { - return _Plasma.Contract.RegisterVault(&_Plasma.TransactOpts, _vaultId, _vaultAddress) -} - -// SubmitBlock is a paid mutator transaction binding the contract method 0xbaa47694. -// -// Solidity: function submitBlock(bytes32 _blockRoot) returns() -func (_Plasma *PlasmaTransactor) SubmitBlock(opts *bind.TransactOpts, _blockRoot [32]byte) (*types.Transaction, error) { - return _Plasma.contract.Transact(opts, "submitBlock", _blockRoot) -} - -// SubmitBlock is a paid mutator transaction binding the contract method 0xbaa47694. -// -// Solidity: function submitBlock(bytes32 _blockRoot) returns() -func (_Plasma *PlasmaSession) SubmitBlock(_blockRoot [32]byte) (*types.Transaction, error) { - return _Plasma.Contract.SubmitBlock(&_Plasma.TransactOpts, _blockRoot) -} - -// SubmitBlock is a paid mutator transaction binding the contract method 0xbaa47694. -// -// Solidity: function submitBlock(bytes32 _blockRoot) returns() -func (_Plasma *PlasmaTransactorSession) SubmitBlock(_blockRoot [32]byte) (*types.Transaction, error) { - return _Plasma.Contract.SubmitBlock(&_Plasma.TransactOpts, _blockRoot) -} - -// SubmitDepositBlock is a paid mutator transaction binding the contract method 0xbe5ac698. -// -// Solidity: function submitDepositBlock(bytes32 _blockRoot) returns(uint256) -func (_Plasma *PlasmaTransactor) SubmitDepositBlock(opts *bind.TransactOpts, _blockRoot [32]byte) (*types.Transaction, error) { - return _Plasma.contract.Transact(opts, "submitDepositBlock", _blockRoot) -} - -// SubmitDepositBlock is a paid mutator transaction binding the contract method 0xbe5ac698. -// -// Solidity: function submitDepositBlock(bytes32 _blockRoot) returns(uint256) -func (_Plasma *PlasmaSession) SubmitDepositBlock(_blockRoot [32]byte) (*types.Transaction, error) { - return _Plasma.Contract.SubmitDepositBlock(&_Plasma.TransactOpts, _blockRoot) -} - -// SubmitDepositBlock is a paid mutator transaction binding the contract method 0xbe5ac698. -// -// Solidity: function submitDepositBlock(bytes32 _blockRoot) returns(uint256) -func (_Plasma *PlasmaTransactorSession) SubmitDepositBlock(_blockRoot [32]byte) (*types.Transaction, error) { - return _Plasma.Contract.SubmitDepositBlock(&_Plasma.TransactOpts, _blockRoot) -} - -// PlasmaBlockSubmittedIterator is returned from FilterBlockSubmitted and is used to iterate over the raw logs and unpacked data for BlockSubmitted events raised by the Plasma contract. -type PlasmaBlockSubmittedIterator struct { - Event *PlasmaBlockSubmitted // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PlasmaBlockSubmittedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PlasmaBlockSubmitted) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PlasmaBlockSubmitted) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PlasmaBlockSubmittedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PlasmaBlockSubmittedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PlasmaBlockSubmitted represents a BlockSubmitted event raised by the Plasma contract. -type PlasmaBlockSubmitted struct { - BlockNumber *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlockSubmitted is a free log retrieval operation binding the contract event 0x5a978f4723b249ccf79cd7a658a8601ce1ff8b89fc770251a6be35216351ce32. -// -// Solidity: event BlockSubmitted(uint256 blockNumber) -func (_Plasma *PlasmaFilterer) FilterBlockSubmitted(opts *bind.FilterOpts) (*PlasmaBlockSubmittedIterator, error) { - - logs, sub, err := _Plasma.contract.FilterLogs(opts, "BlockSubmitted") - if err != nil { - return nil, err - } - return &PlasmaBlockSubmittedIterator{contract: _Plasma.contract, event: "BlockSubmitted", logs: logs, sub: sub}, nil -} - -// WatchBlockSubmitted is a free log subscription operation binding the contract event 0x5a978f4723b249ccf79cd7a658a8601ce1ff8b89fc770251a6be35216351ce32. -// -// Solidity: event BlockSubmitted(uint256 blockNumber) -func (_Plasma *PlasmaFilterer) WatchBlockSubmitted(opts *bind.WatchOpts, sink chan<- *PlasmaBlockSubmitted) (event.Subscription, error) { - - logs, sub, err := _Plasma.contract.WatchLogs(opts, "BlockSubmitted") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PlasmaBlockSubmitted) - if err := _Plasma.contract.UnpackLog(event, "BlockSubmitted", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBlockSubmitted is a log parse operation binding the contract event 0x5a978f4723b249ccf79cd7a658a8601ce1ff8b89fc770251a6be35216351ce32. -// -// Solidity: event BlockSubmitted(uint256 blockNumber) -func (_Plasma *PlasmaFilterer) ParseBlockSubmitted(log types.Log) (*PlasmaBlockSubmitted, error) { - event := new(PlasmaBlockSubmitted) - if err := _Plasma.contract.UnpackLog(event, "BlockSubmitted", log); err != nil { - return nil, err - } - return event, nil -} - -// PlasmaChildChainActivatedIterator is returned from FilterChildChainActivated and is used to iterate over the raw logs and unpacked data for ChildChainActivated events raised by the Plasma contract. -type PlasmaChildChainActivatedIterator struct { - Event *PlasmaChildChainActivated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PlasmaChildChainActivatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PlasmaChildChainActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PlasmaChildChainActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PlasmaChildChainActivatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PlasmaChildChainActivatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PlasmaChildChainActivated represents a ChildChainActivated event raised by the Plasma contract. -type PlasmaChildChainActivated struct { - Authority common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterChildChainActivated is a free log retrieval operation binding the contract event 0xb8421a1acb5f1e701a4f11ecaad76fa438b3947e8dfd6960b6086130e68e0aed. -// -// Solidity: event ChildChainActivated(address authority) -func (_Plasma *PlasmaFilterer) FilterChildChainActivated(opts *bind.FilterOpts) (*PlasmaChildChainActivatedIterator, error) { - - logs, sub, err := _Plasma.contract.FilterLogs(opts, "ChildChainActivated") - if err != nil { - return nil, err - } - return &PlasmaChildChainActivatedIterator{contract: _Plasma.contract, event: "ChildChainActivated", logs: logs, sub: sub}, nil -} - -// WatchChildChainActivated is a free log subscription operation binding the contract event 0xb8421a1acb5f1e701a4f11ecaad76fa438b3947e8dfd6960b6086130e68e0aed. -// -// Solidity: event ChildChainActivated(address authority) -func (_Plasma *PlasmaFilterer) WatchChildChainActivated(opts *bind.WatchOpts, sink chan<- *PlasmaChildChainActivated) (event.Subscription, error) { - - logs, sub, err := _Plasma.contract.WatchLogs(opts, "ChildChainActivated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PlasmaChildChainActivated) - if err := _Plasma.contract.UnpackLog(event, "ChildChainActivated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseChildChainActivated is a log parse operation binding the contract event 0xb8421a1acb5f1e701a4f11ecaad76fa438b3947e8dfd6960b6086130e68e0aed. -// -// Solidity: event ChildChainActivated(address authority) -func (_Plasma *PlasmaFilterer) ParseChildChainActivated(log types.Log) (*PlasmaChildChainActivated, error) { - event := new(PlasmaChildChainActivated) - if err := _Plasma.contract.UnpackLog(event, "ChildChainActivated", log); err != nil { - return nil, err - } - return event, nil -} - -// PlasmaVaultRegisteredIterator is returned from FilterVaultRegistered and is used to iterate over the raw logs and unpacked data for VaultRegistered events raised by the Plasma contract. -type PlasmaVaultRegisteredIterator struct { - Event *PlasmaVaultRegistered // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PlasmaVaultRegisteredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PlasmaVaultRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PlasmaVaultRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PlasmaVaultRegisteredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PlasmaVaultRegisteredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PlasmaVaultRegistered represents a VaultRegistered event raised by the Plasma contract. -type PlasmaVaultRegistered struct { - VaultId *big.Int - VaultAddress common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterVaultRegistered is a free log retrieval operation binding the contract event 0x7051aac27f9b76ec8f37bd5796f2dcf402bd840a1c45c952a6eeb0e11bde0996. -// -// Solidity: event VaultRegistered(uint256 vaultId, address vaultAddress) -func (_Plasma *PlasmaFilterer) FilterVaultRegistered(opts *bind.FilterOpts) (*PlasmaVaultRegisteredIterator, error) { - - logs, sub, err := _Plasma.contract.FilterLogs(opts, "VaultRegistered") - if err != nil { - return nil, err - } - return &PlasmaVaultRegisteredIterator{contract: _Plasma.contract, event: "VaultRegistered", logs: logs, sub: sub}, nil -} - -// WatchVaultRegistered is a free log subscription operation binding the contract event 0x7051aac27f9b76ec8f37bd5796f2dcf402bd840a1c45c952a6eeb0e11bde0996. -// -// Solidity: event VaultRegistered(uint256 vaultId, address vaultAddress) -func (_Plasma *PlasmaFilterer) WatchVaultRegistered(opts *bind.WatchOpts, sink chan<- *PlasmaVaultRegistered) (event.Subscription, error) { - - logs, sub, err := _Plasma.contract.WatchLogs(opts, "VaultRegistered") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PlasmaVaultRegistered) - if err := _Plasma.contract.UnpackLog(event, "VaultRegistered", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseVaultRegistered is a log parse operation binding the contract event 0x7051aac27f9b76ec8f37bd5796f2dcf402bd840a1c45c952a6eeb0e11bde0996. -// -// Solidity: event VaultRegistered(uint256 vaultId, address vaultAddress) -func (_Plasma *PlasmaFilterer) ParseVaultRegistered(log types.Log) (*PlasmaVaultRegistered, error) { - event := new(PlasmaVaultRegistered) - if err := _Plasma.contract.UnpackLog(event, "VaultRegistered", log); err != nil { - return nil, err - } - return event, nil -} diff --git a/packages/omgx/immutability/docker/ca/README.md b/packages/omgx/immutability/docker/ca/README.md deleted file mode 100755 index e69de29bb2d1..000000000000 diff --git a/packages/omgx/immutability/docker/config/entrypoint.sh b/packages/omgx/immutability/docker/config/entrypoint.sh index b3e570196e6b..a3c51f74f275 100755 --- a/packages/omgx/immutability/docker/config/entrypoint.sh +++ b/packages/omgx/immutability/docker/config/entrypoint.sh @@ -194,8 +194,7 @@ else test_plugin fi - -if [ -n "$TEST" ]; then +if [ -n "$TEST" ]; then echo "Dying." else echo "Don't exit until vault dies." diff --git a/packages/omgx/immutability/docker/config/vault.hcl b/packages/omgx/immutability/docker/config/vault.hcl deleted file mode 100755 index d085b2f5fd62..000000000000 --- a/packages/omgx/immutability/docker/config/vault.hcl +++ /dev/null @@ -1,19 +0,0 @@ -default_lease_ttl = "168h" -disable_mlock = "true" -max_lease_ttl = "720h" - -backend "file" { - path = "/vault/config/data" -} - -ui = "false" - -api_addr = "https://localhost:8900" -plugin_directory = "/vault/plugins" -listener "tcp" { - address = "0.0.0.0:8900" - tls_cert_file = "/vault/config/my-service.crt" - tls_client_ca_file = "/vault/config/ca.crt" - tls_key_file = "/vault/config/my-service.key" - tls_require_and_verify_client_cert = "false" -} diff --git a/packages/omgx/immutability/docker/docker-compose-vault-test.yml b/packages/omgx/immutability/docker/docker-compose-vault-test.yml new file mode 100644 index 000000000000..b7afc887bb35 --- /dev/null +++ b/packages/omgx/immutability/docker/docker-compose-vault-test.yml @@ -0,0 +1,130 @@ +version: "3" +### +### stuff is a bit convoluted here, simply because the process isn't trivial +### To execute Vault tests, that submit stuff to L1 contracts, we need all the addresses (OVM_CTC, OVM_SCC). +### But for these contracts to be deployed, these contracts need Sequencer and Proposer addresses. +### So we start Vault and wait for it to be ready (the grep thingy in entrypoint) +### We continue with wallet, account and policy creation and setup. And write them to a file tokens_and_accounts.sh. +### The deployer mounts this volume and checks for the existence of this file and sources it when it comes up. This +### Exposes Sequencer and Deployer addresses as ENV vars in the deployer node. +### I guess this is OK for local docker-compose, but it certanly won't be OK for production Vault deploy. +### The Vault is a delicate thing. + +services: + ### + ### deployer and batch_submitter are re-defined here + ### because we need to override the default env vars + ### that put in the sequencer and proposer private keys + ### via SEQUENCER_PRIVATE_KEY - SEQUENCER_ADDRESS, PROPOSER_PRIVATE_KEY - PROPOSER_ADDRESS + ### not very clean atm, because the modes exist side by side. + + ### we inject a short script that was prepared in Vault. + ### It exposes Vault tokens, sequencer address and proposer address + ### as env vars. + ### PROPOSER_TOKEN, SEQUENCER_TOKEN, SEQUENCER_ADDRESS, PROPOSER_ADDRESS + + ### The deployer takes these addresses and populates the contracts guard with these values. + ### Batch submitter will go into Vault mode if these env vars are present. + ### SEQUENCER_TOKEN and PROPOSER_TOKEN are optional. Batch submitter will try to get the + ### JWT token for vault from the AWS_SINK_JWT_TOKEN_PATH if they're not set. + deployer: + volumes: + - "./../packages/omgx/immutability/test:/vault/test" + entrypoint: + - "/bin/bash" + - -ec + - | + SCRIPT=$$(cat <<-END + while [ ! -f /vault/test/tokens_and_accounts.sh ] + do + sleep 5 + echo "Waiting for the Vault accounts in tokens_and_accounts.sh" + done + source /vault/test/tokens_and_accounts.sh + END + ) + preprocessed_VAR=$$(printf '%s\n' "$$SCRIPT" | sed 's/\\/&&/g;s/^[[:blank:]]/\\&/;s/$$/\\/') + sed -i -e "/set -e/a\\$${preprocessed_VAR%?}" deployer.sh + ./deployer.sh + + batch_submitter: + volumes: + - "./../packages/omgx/immutability/test:/vault/test" + #AWS_SINK_JWT_TOKEN_PATH + - "/tmp/vault_agent:/tmp/vault_agent:rw" + environment: + VAULT_ADDR: http://vault:8900 + AWS_SINK_JWT_TOKEN_PATH: "/tmp/vault_agent/vault_auth" + entrypoint: + - "/bin/bash" + - -ec + - | + SCRIPT=$$(cat <<-END + while [ ! -f /vault/test/tokens_and_accounts.sh ] + do + sleep 5 + echo "Waiting for the Vault accounts in tokens_and_accounts.sh" + done + source /vault/test/tokens_and_accounts.sh + END + ) + preprocessed_VAR=$$(printf '%s\n' "$$SCRIPT" | sed 's/\\/&&/g;s/^[[:blank:]]/\\&/;s/$$/\\/') + sed -i -e "/set -e/a\\$${preprocessed_VAR%?}" batches.sh + ./batches.sh + + vault: + image: omgx/vault + ports: + - "127.0.0.1:8200:8900" + build: + context: .. + dockerfile: ./ops/docker/Dockerfile.omgx_vault + user: root + deploy: + replicas: 1 + environment: + VAULT_ADDR: http://127.0.0.1:8900 + VAULT_CACERT: /vault/config/ca.crt + RUN_TEST: "${RUN_TEST:-false}" + TEST: "${TEST:-false}" + URL: http://deployer:8081/addresses.json + AWS_ACCESS_KEY_ID: "" + AWS_SECRET_ACCESS_KEY: "" + AWS_BOUND_IAM_PRINCIPAL_ARN: "" + AWS_ROLE: "" + volumes: + - "/tmp/vault_auth:/vault/config:rw" + - "./../packages/omgx/immutability/test:/vault/test" + - "./vault/data/immutability/config:/vault/config:rw" + entrypoint: + - "/bin/sh" + - -ec + - | + ./provision_vault.sh + + vault_agent: + depends_on: + - vault + image: hashicorp/vault-enterprise:latest + restart: always + ports: + - "18200:8200" + volumes: + - ./../packages/omgx/immutability/docker/:/vault-agent:rw + #AWS_SINK_JWT_TOKEN_PATH + - /tmp/vault_agent:/tmp/vault_agent:rw + environment: + VAULT_ADDR: "http://vault:8900" + AWS_SINK_JWT_TOKEN_PATH: "/tmp/vault_agent/vault_auth" + AWS_ACCESS_KEY_ID: "" + AWS_SECRET_ACCESS_KEY: "" + AWS_VAULT_ROLE: "" + restart: always + entrypoint: + - "/bin/sh" + - -ec + - | + apk add gettext + envsubst < /vault-agent/vault-agent.hcl > /tmp/vault-agent.hcl + vault agent -log-level debug -config=/tmp/vault-agent.hcl + diff --git a/packages/omgx/immutability/docker/docker-compose.yml b/packages/omgx/immutability/docker/docker-compose.yml deleted file mode 100755 index e248ea792c15..000000000000 --- a/packages/omgx/immutability/docker/docker-compose.yml +++ /dev/null @@ -1,67 +0,0 @@ -version: "3.3" - -services: - ganache: - image: trufflesuite/ganache-cli:latest - networks: - - testnet - ports: - - "8545:8545" - entrypoint: > - /bin/sh -c " - node /app/ganache-core.docker.cli.js --deterministic \ - --mnemonic 'explain foam nice clown method avocado hill basket echo blur elevator marble' \ - --networkId '5777' \ - --hostname '0.0.0.0' - " - truffle: - build: - dockerfile: Dockerfile - context: ./truffle - networks: - - testnet - volumes: - - "./truffle:/truffleshuffle:rw" - depends_on: - - "ganache" - entrypoint: > - /bin/sh -c " - rm -f /truffleshuffle/*.out - while ! `nc ganache 8545 &> /dev/null` ;do - echo waiting for ganache... - sleep 1 - done; - cd plasma-contracts/plasma_framework - rm -rf build - sed -i 's/127.0.0.1/ganache/g' truffle-config.js - npx truffle migrate --network local 2>&1 | tee /truffleshuffle/migrate.out - grep '\"plasma_framework\":' /truffleshuffle/migrate.out > /truffleshuffle/addresses_json.out - jq -r '.plasma_framework' /truffleshuffle/addresses_json.out > /truffleshuffle/plasma_framework_addr.out - chown nobody:nogroup /truffleshuffle/*.out - cat /truffleshuffle/plasma_framework_addr.out - " - vault_server: - image: omgnetwork/vault:latest - networks: - - testnet - ports: - - "8200:8900" - environment: - - TEST=true - volumes: - - "./config:/vault/config:rw" - - "../contracts:/vault/contracts:ro" - - "../scripts:/vault/scripts:ro" - - "./truffle:/truffleshuffle:rw" - entrypoint: > - /bin/sh -c " - sleep 2 - while [ ! -f /truffleshuffle/plasma_framework_addr.out ];do - echo Waiting on the truffle shuffle. This will take some time as plasma framework is recompiled... - sleep 3 - done; - /vault/config/entrypoint.sh - " -networks: - testnet: - driver: bridge diff --git a/packages/omgx/immutability/docker/lean-docker-compose.yml b/packages/omgx/immutability/docker/lean-docker-compose.yml deleted file mode 100644 index 1cf2aac8f8d3..000000000000 --- a/packages/omgx/immutability/docker/lean-docker-compose.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: "3.3" - -services: - vault_server: - image: omgnetwork/vault:latest - networks: - - testnet - ports: - - "8200:8900" - volumes: - - "./config:/vault/config:rw" - - "../contracts:/vault/contracts:ro" - - "../scripts:/vault/scripts:ro" - entrypoint: /vault/config/entrypoint.sh -networks: - testnet: - driver: bridge diff --git a/packages/omgx/immutability/docker/truffle/Dockerfile b/packages/omgx/immutability/docker/truffle/Dockerfile deleted file mode 100644 index 788cf219c0f5..000000000000 --- a/packages/omgx/immutability/docker/truffle/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -# ******************************************************************************* -# ******** pre-compiled omisego plasma contracts in a docker container ********* -# ******************************************************************************* -FROM ajmay/truffle - -RUN apt update -y \ - && apt install -y netcat jq python make g++ - -RUN git clone https://github.com/omgnetwork/plasma-contracts.git \ - && cd plasma-contracts/plasma_framework \ - && npm install \ - && npm install typescript diff --git a/packages/omgx/immutability/docker/vault-agent.hcl b/packages/omgx/immutability/docker/vault-agent.hcl new file mode 100644 index 000000000000..28e3bb2e669c --- /dev/null +++ b/packages/omgx/immutability/docker/vault-agent.hcl @@ -0,0 +1,22 @@ +exit_after_auth = false +pid_file = "./pidfile" + +auto_auth { + method "aws" { + mount_path = "auth/aws" + config = { + type = "iam" + role = "${AWS_VAULT_ROLE}" + } + } + + sink "file" { + config = { + path = "${AWS_SINK_JWT_TOKEN_PATH}" + } + } +} + +vault { + address = "${VAULT_ADDR}" +} diff --git a/packages/omgx/immutability/ethereum/backend.go b/packages/omgx/immutability/ethereum/backend.go index 96784da974bd..d2aeda613306 100644 --- a/packages/omgx/immutability/ethereum/backend.go +++ b/packages/omgx/immutability/ethereum/backend.go @@ -53,7 +53,6 @@ func Backend(conf *logical.BackendConfig) (*PluginBackend, error) { Paths: framework.PathAppend( ConfigPaths(&b), WalletPaths(&b), - PlasmaPaths(&b), AccountPaths(&b), OvmPaths(&b), ), diff --git a/packages/omgx/immutability/ethereum/path_ovm.go b/packages/omgx/immutability/ethereum/path_ovm.go index 7a9fcc234ded..dafbd829019d 100644 --- a/packages/omgx/immutability/ethereum/path_ovm.go +++ b/packages/omgx/immutability/ethereum/path_ovm.go @@ -13,6 +13,7 @@ import ( "strconv" "strings" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -22,7 +23,6 @@ import ( "github.com/omgnetwork/immutability-eth-plugin/contracts/ovm_ctc" "github.com/omgnetwork/immutability-eth-plugin/contracts/ovm_scc" "github.com/omgnetwork/immutability-eth-plugin/util" - "golang.org/x/crypto/sha3" ) const ovm string = "ovm" @@ -141,7 +141,6 @@ func OvmPaths(b *PluginBackend) []*framework.Path { } } -//this goes into L1 func (b *PluginBackend) pathOvmAppendStateBatch(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { config, err := b.configured(ctx, req) if err != nil { @@ -193,19 +192,12 @@ func (b *PluginBackend) pathOvmAppendStateBatch(ctx context.Context, req *logica var batch = make([][32]byte, len(inputBatchArr)) for i, s := range inputBatchArr { - var buf []byte - hash := sha3.NewLegacyKeccak256() - hash.Write([]byte(s)) - buf = hash.Sum(buf) - if len(buf) != 32 { + var b = common.FromHex(s) + if len(b) != 32 { return nil, fmt.Errorf("invalid batch element - not the right size") } - batchByteElement := [32]byte{} - copy(batchByteElement[:], buf[0:32]) - batch[i] = batchByteElement + copy(batch[i][:], b[0:32]) } - // log.Print(batch) - // get the AppendStateBatch function arguments from JSON DONE instance, err := ovm_scc.NewOvmScc(contractAddress, client) if err != nil { @@ -258,7 +250,6 @@ func (b *PluginBackend) pathOvmAppendStateBatch(ctx context.Context, req *logica } func (b *PluginBackend) pathEncodeAppendSequencerBatch(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - //log.Print(util.PrettyPrint(data)) encodedData, err := encode(data) if err != nil { @@ -272,7 +263,6 @@ func (b *PluginBackend) pathEncodeAppendSequencerBatch(ctx context.Context, req } func (b *PluginBackend) pathOvmAppendSequencerBatch(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - //log.Print(util.PrettyPrint(data)) config, err := b.configured(ctx, req) if err != nil { @@ -307,7 +297,7 @@ func (b *PluginBackend) pathOvmAppendSequencerBatch(ctx context.Context, req *lo } instance, err := ovm_ctc.NewOvmCtc(contractAddress, client) - //instance.OvmCtcTransactor. + if err != nil { return nil, err } @@ -329,21 +319,31 @@ func (b *PluginBackend) pathOvmAppendSequencerBatch(ctx context.Context, req *lo if nonceRaw == "" { return nil, fmt.Errorf("invalid nonce") } - transactOpts.Nonce = util.ValidNumber(nonceRaw) - - ctcSession := &ovm_ctc.OvmCtcSession{ - Contract: instance, // Generic contract caller binding to set the session for - CallOpts: *callOpts, // Call options to use throughout this session - TransactOpts: *transactOpts, - } encodedData, err := encode(data) if err != nil { return nil, err } - tx, err := ctcSession.RawAppendSequencerBatch([]byte(encodedData)) + json_abi := `[{ + "inputs": [], + "name": "appendSequencerBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }]` + + abi, _ := abi.JSON(strings.NewReader(json_abi)) + packed, _ := abi.Pack("appendSequencerBatch") + callData := append(packed, common.FromHex(encodedData)...) + transactOpts.GasLimit = 0 + ctcSession := &ovm_ctc.OvmCtcSession{ + Contract: instance, // Generic contract caller binding to set the session for + CallOpts: *callOpts, // Call options to use throughout this session + TransactOpts: *transactOpts, + } + tx, err := ctcSession.RawAppendSequencerBatch(callData) if err != nil { return nil, err } diff --git a/packages/omgx/immutability/ethereum/path_plasma.go b/packages/omgx/immutability/ethereum/path_plasma.go deleted file mode 100644 index 302f74be0167..000000000000 --- a/packages/omgx/immutability/ethereum/path_plasma.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright (C) Immutability, LLC - All Rights Reserved -// Unauthorized copying of this file, via any medium is strictly prohibited -// Proprietary and confidential -// Written by Jeff Ploughman , August 2019 - -package ethereum - -import ( - "bytes" - "context" - b64 "encoding/base64" - "fmt" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/hashicorp/vault/sdk/framework" - "github.com/hashicorp/vault/sdk/logical" - "github.com/omgnetwork/immutability-eth-plugin/contracts/plasma" - "github.com/omgnetwork/immutability-eth-plugin/util" -) - -const plasmaContract string = "plasma" - -// PlasmaPaths are the path handlers for Ethereum wallets -func PlasmaPaths(b *PluginBackend) []*framework.Path { - return []*framework.Path{ - - { - Pattern: ContractPath(plasmaContract, "submitBlock"), - HelpSynopsis: "Submits the Merkle root of a Plasma block", - HelpDescription: `Allows the authority to submit the Merkle root of a Plasma block.`, - Fields: map[string]*framework.FieldSchema{ - "name": {Type: framework.TypeString}, - "address": {Type: framework.TypeString}, - "contract": { - Type: framework.TypeString, - Description: "The address of the Block Controller.", - }, - "gas_price": { - Type: framework.TypeString, - Description: "The gas price for the transaction in wei.", - }, - "nonce": { - Type: framework.TypeString, - Description: "The nonce for the transaction.", - }, - "block_root": { - Type: framework.TypeString, - Description: "The Merkle root of a Plasma block.", - }, - }, - ExistenceCheck: pathExistenceCheck, - Callbacks: map[logical.Operation]framework.OperationFunc{ - logical.CreateOperation: b.pathPlasmaSubmitBlock, - logical.UpdateOperation: b.pathPlasmaSubmitBlock, - }, - }, - } -} - -func (b *PluginBackend) pathPlasmaSubmitBlock(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { - config, err := b.configured(ctx, req) - if err != nil { - return nil, err - } - address := data.Get("address").(string) - name := data.Get("name").(string) - contractAddress := common.HexToAddress(data.Get("contract").(string)) - accountJSON, err := readAccount(ctx, req, name, address) - if err != nil || accountJSON == nil { - return nil, fmt.Errorf("error reading address") - } - - chainID := util.ValidNumber(config.ChainID) - if chainID == nil { - return nil, fmt.Errorf("invalid chain ID") - } - - client, err := ethclient.Dial(config.getRPCURL()) - if err != nil { - return nil, err - } - - walletJSON, err := readWallet(ctx, req, name) - if err != nil { - return nil, err - } - - wallet, account, err := getWalletAndAccount(*walletJSON, accountJSON.Index) - if err != nil { - return nil, err - } - - instance, err := plasma.NewPlasma(contractAddress, client) - if err != nil { - return nil, err - } - callOpts := &bind.CallOpts{} - - inputBlockRoot, ok := data.GetOk("block_root") - if !ok { - return nil, fmt.Errorf("invalid block root") - } - blockRoot, err := b64.StdEncoding.DecodeString(inputBlockRoot.(string)) - if err != nil { - return nil, fmt.Errorf("invalid block root - not base64") - } - if len(blockRoot) != 32 { - return nil, fmt.Errorf("invalid block root - not the right size") - } - blockRootSB := [32]byte{} - copy(blockRootSB[:], blockRoot[0:32]) - - transactOpts, err := b.NewWalletTransactor(chainID, wallet, account) - if err != nil { - return nil, err - } - //transactOpts needs gas etc. Use supplied gas_price - gasPriceRaw := data.Get("gas_price").(string) - if gasPriceRaw == "" { - return nil, fmt.Errorf("invalid gas_price") - } - transactOpts.GasPrice = util.ValidNumber(gasPriceRaw) - - //transactOpts needs nonce. Use supplied nonce - nonceRaw := data.Get("nonce").(string) - if nonceRaw == "" { - return nil, fmt.Errorf("invalid nonce") - } - transactOpts.Nonce = util.ValidNumber(nonceRaw) - - plasmaSession := &plasma.PlasmaSession{ - Contract: instance, // Generic contract caller binding to set the session for - CallOpts: *callOpts, // Call options to use throughout this session - TransactOpts: *transactOpts, - } - - tx, err := plasmaSession.SubmitBlock(blockRootSB) - if err != nil { - return nil, err - } - - var signedTxBuff bytes.Buffer - tx.EncodeRLP(&signedTxBuff) - return &logical.Response{ - Data: map[string]interface{}{ - "contract": contractAddress.Hex(), - "transaction_hash": tx.Hash().Hex(), - "signed_transaction": hexutil.Encode(signedTxBuff.Bytes()), - "from": account.Address.Hex(), - "nonce": tx.Nonce(), - "gas_price": tx.GasPrice(), - "gas_limit": tx.Gas(), - }, - }, nil -} diff --git a/packages/omgx/immutability/makefile b/packages/omgx/immutability/makefile index 47599565699f..c58dbd872e95 100644 --- a/packages/omgx/immutability/makefile +++ b/packages/omgx/immutability/makefile @@ -1,27 +1,5 @@ .ONESHELL: -IMG_VERSION = $(shell cat ./VERSION) -DATE = $(shell date +'%s') - -docker-build: - docker build --progress=plain --build-arg always_upgrade="$(DATE)" -t omgnetwork/vault:latest . - docker tag omgnetwork/vault:latest omgnetwork/vault:$(IMG_VERSION) - -test: - docker-compose -f docker/docker-compose.yml up - -run: - docker-compose -f docker/lean-docker-compose.yml up - -all: docker-build run - -clean: - mv docker/config/entrypoint.sh /tmp/entrypoint.sh - mv docker/config/vault.hcl /tmp/vault.hcl - rm -rf docker/config/* - mv /tmp/entrypoint.sh docker/config/entrypoint.sh - mv /tmp/vault.hcl docker/config/vault.hcl - abigen: docker run -d --rm -it --name ovm_contracts --entrypoint /bin/bash omgx/deployer:latest sleep 5s diff --git a/packages/omgx/immutability/scripts/smoke.blacklist.sh b/packages/omgx/immutability/scripts/smoke.blacklist.sh deleted file mode 100755 index 93cc7ea6fd13..000000000000 --- a/packages/omgx/immutability/scripts/smoke.blacklist.sh +++ /dev/null @@ -1,127 +0,0 @@ -#!/bin/sh - -function banner { - echo "------------------------------------------------------------------------------------------------------------------------------------" -} - -function test_blacklist { - banner - echo "*** SHOULD FAIL! ***" - echo "TRANSFER FUNDS FROM $ACCOUNT0 TO $BLACKLISTED" - echo "vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0/debit to=$BLACKLISTED amount=$FUNDING_AMOUNT" - vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0/debit to=$BLACKLISTED amount=$FUNDING_AMOUNT - check_result $? 0 - banner - #vault write -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0/debit to=$BLACKLISTED amount=$FUNDING_AMOUNT - - banner - echo "*** SHOULD SUCCEED ***" - echo "TRANSFER FUNDS FROM $ACCOUNT0 TO $UNLISTED" - echo "vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0/debit to=$UNLISTED amount=$FUNDING_AMOUNT" - vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0/debit to=$UNLISTED amount=$FUNDING_AMOUNT - check_result $? 0 - banner - #vault write -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0/debit to=$UNLISTED amount=$FUNDING_AMOUNT - -} - -source /vault/scripts/smoke.env.sh - -banner -echo "CONFIGURE MOUNT WITH NO BLACKLIST" -echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" -vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" - -banner -echo "CREATE WALLET WITH MNEMONIC" -echo "vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet mnemonic='$MNEMONIC'" -vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet mnemonic="$MNEMONIC" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet mnemonic="$MNEMONIC" - -banner -echo "CREATE NEW ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/blacklist-wallet/accounts" -ACCOUNT0=$(vault write -f -field=address immutability-eth-plugin/wallets/blacklist-wallet/accounts) -check_result $? 0 -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet/accounts - -banner -echo "CREATE NEW BLACKLISTED ACCOUNT" -echo "vault write -format=json -f immutability-eth-plugin/wallets/blacklist-wallet/accounts" -BLACKLISTED=$(vault write -f -field=address immutability-eth-plugin/wallets/blacklist-wallet/accounts) -check_result $? 0 -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet/accounts - -banner -echo "CREATE NEW UNLISTED ACCOUNT" -echo "vault write -format=json -f immutability-eth-plugin/wallets/blacklist-wallet/accounts" -UNLISTED=$(vault write -f -field=address immutability-eth-plugin/wallets/blacklist-wallet/accounts) -check_result $? 0 -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet/accounts - -banner -echo "ACCOUNT-LEVEL BLACKLIST: ADD $BLACKLISTED TO BLACKLIST FOR $ACCOUNT0" -echo "vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0 blacklist=$BLACKLISTED" -vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0 blacklist=$BLACKLISTED -check_result $? 0 -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0 blacklist=$BLACKLISTED - -### -### // whitelisting and blacklisting are not implemented in this release! -### which is what is tested below! - -# test_blacklist - -# banner -# echo "ACCOUNT-LEVEL BLACKLIST: REMOVE BLACKLIST FOR $ACCOUNT0" -# echo "vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0 blacklist=$EMPTY" -# vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0 blacklist=$EMPTY -# check_result $? 0 -# banner -# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet/accounts/$ACCOUNT0 blacklist=$EMPTY - -# banner -# echo "WALLET-LEVEL BLACKLIST: ADD $BLACKLISTED TO BLACKLIST FOR blacklist-wallet" -# echo "vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet blacklist=$BLACKLISTED" -# vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet blacklist=$BLACKLISTED -# check_result $? 0 -# banner -# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet blacklist=$BLACKLISTED - -# test_blacklist - -# banner -# echo "WALLET-LEVEL BLACKLIST: REMOVE BLACKLIST FOR blacklist-wallet" -# echo "vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet blacklist=$EMPTY" -# vault write -format=json immutability-eth-plugin/wallets/blacklist-wallet blacklist=$EMPTY -# check_result $? 0 -# banner -# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/blacklist-wallet blacklist=$EMPTY - - -# banner -# echo "GLOBAL-LEVEL BLACKLIST: ADD $BLACKLISTED TO BLACKLIST FOR immutability-eth-plugin" -# echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' blacklist='$BLACKLISTED' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" -# vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" blacklist=$BLACKLISTED rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" -# check_result $? 0 -# banner -# #vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" blacklist=$BLACKLISTED - -# test_blacklist - -# banner -# echo "GLOBAL-LEVEL BLACKLIST: REMOVE BLACKLIST FOR immutability-eth-plugin" -# echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' blacklist='$EMPTY' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" -# vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" blacklist=$EMPTY rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" -# check_result $? 0 -# banner -# #vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" blacklist=$EMPTY diff --git a/packages/omgx/immutability/scripts/smoke.ovm.sh b/packages/omgx/immutability/scripts/smoke.ovm.sh deleted file mode 100755 index a510449c8fcd..000000000000 --- a/packages/omgx/immutability/scripts/smoke.ovm.sh +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/sh - - -function banner { - echo "------------------------------------------------------------------------------------------------------------------------------------" -} - -source /vault/scripts/smoke.env.sh -OVM="OVM-wallet" -batch=['0x1111111111111111111111111111111111111111111111111111111111111111', '0x1111111111111111111111111111111111111111111111111111111111111111'] - -banner -echo "CONFIGURE MOUNT" -echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" -vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" - -banner -echo "CREATE WALLET WITH MNEMONIC FOR PLASMA DEPLOYER" -echo "vault write -format=json immutability-eth-plugin/wallets/$OVM mnemonic='$MNEMONIC'" -vault write -format=json immutability-eth-plugin/wallets/$OVM mnemonic="$MNEMONIC" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/$OVM mnemonic="$MNEMONIC" - -banner -echo "CREATE DEPLOYER ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/$OVM/accounts" -DEPLOYER=$(vault write -f -field=address immutability-eth-plugin/wallets/$OVM/accounts) -check_result $? 0 -echo "DEPLOYER=$DEPLOYER" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts - -banner -echo "CREATE MAINTAINER ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/$OVM/accounts" -MAINTAINER=$(vault write -f -field=address immutability-eth-plugin/wallets/$OVM/accounts) -check_result $? 0 -echo "MAINTAINER=$MAINTAINER" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts - -banner -echo "CREATE AUTHORITY ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/$OVM/accounts" -ORIGINAL_AUTHORITY=$(vault write -f -field=address immutability-eth-plugin/wallets/$OVM/accounts) -check_result $? 0 -echo "ORIGINAL_AUTHORITY=$ORIGINAL_AUTHORITY" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts - -banner -echo "CREATE UNAUTHORIZED ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/$OVM/accounts" -UNAUTHORIZED=$(vault write -f -field=address immutability-eth-plugin/wallets/$OVM/accounts) -check_result $? 0 -echo "UNAUTHORIZED=$UNAUTHORIZED" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts -banner - -banner -banner -banner -echo "Append State Batch tests" -echo "*** SHOULD FAIL! ***" -echo "UNAUTHORIZED SUBMISSION OF AppendStateBatch BY $UNAUTHORIZED" -echo "vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendStateBatch batch="0x1111111111111111111111111111111111111111111111111111111111111111" batch="0x1111111111111111111111111111111111111111111111111111111111111111" should_start_at_element=0 nonce=0 gas_price=$GAS_PRICE_HIGH contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendStateBatch batch="0x1111111111111111111111111111111111111111111111111111111111111111" batch="0x1111111111111111111111111111111111111111111111111111111111111111" should_start_at_element=0 nonce=0 gas_price=$GAS_PRICE_HIGH contract=$PLASMA_CONTRACT -check_result $? 2 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendStateBatch nonce=0 gas_price=$GAS_PRICE_HIGH batch=$batch should_start_at_element=0 contract=$PLASMA_CONTRACT - -# banner -# echo "*** SHOULD SUCCEED ***" -# echo "AUTHORIZED SUBMISSION OF BATCH BY $ORIGINAL_AUTHORITY" -# echo "vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$ORIGINAL_AUTHORITY/ovm/appendStateBatch nonce=0 gas_price=$GAS_PRICE_HIGH batch=$batch should_start_at_element=0 contract=$PLASMA_CONTRACT" -# vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$ORIGINAL_AUTHORITY/ovm/appendStateBatch nonce=0 gas_price=$GAS_PRICE_HIGH batch=$batch should_start_at_element=0 contract=$PLASMA_CONTRACT -# check_result $? 0 -# banner -# #vault write -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts/$ORIGINAL_AUTHORITY/ovm/appendStateBatch nonce=0 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -# banner -# echo "*** SHOULD FAIL ***" -# echo "AUTHORIZED SUBMISSION OF BAD BLOCK BY $ORIGINAL_AUTHORITY" -# echo "vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BAD_BLOCK_ROOT contract=$PLASMA_CONTRACT" -# vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BAD_BLOCK_ROOT contract=$PLASMA_CONTRACT -# check_result $? 2 -# banner -# #vault write -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BAD_BLOCK_ROOT contract=$PLASMA_CONTRACT - -# banner -# echo "*** SHOULD SUCCEED ***" -# echo "AUTHORIZED SUBMISSION OF BLOCK BY $ORIGINAL_AUTHORITY - USER SUPPLIED GAS PRICE" -# echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -# vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -# check_result $? 0 -# banner -# #vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -# banner -# echo "*** SHOULD FAIL! ***" -# echo "AUTHORIZED SUBMISSION OF BLOCK BY $ORIGINAL_AUTHORITY - USER SUPPLIED GAS PRICE WITHOUT NONCE" -# echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -# vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -# check_result $? 2 -# banner -# #vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -# banner -# echo "*** SHOULD FAIL! ***" -# echo "AUTHORIZED SUBMISSION OF BLOCK BY $ORIGINAL_AUTHORITY - USER SUPPLIED NONCE WITHOUT GAS PRICE" -# echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -# vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -# check_result $? 2 -# banner -# #vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -banner -banner -banner -echo "Append Sequencer Batch tests" -echo "*** SHOULD FAIL! ***" -echo "UNAUTHORIZED SUBMISSION OF AppendSequencerBatch BY $UNAUTHORIZED" -echo "vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendSequencerBatch should_start_at_element=10 total_elements_to_append=1 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 1, \"timestamp\": 100, \"block_number\": 200}" transactions="0x45423400000011" transactions="0x45423400000012" nonce=0 gas_price=$GAS_PRICE_HIGH contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendSequencerBatch should_start_at_element=10 total_elements_to_append=1 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 1, \"timestamp\": 100, \"block_number\": 200}" transactions="0x45423400000011" transactions="0x45423400000012" nonce=0 gas_price=$GAS_PRICE_HIGH contract=$PLASMA_CONTRACT -check_result $? 2 -banner \ No newline at end of file diff --git a/packages/omgx/immutability/scripts/smoke.plasma.sh b/packages/omgx/immutability/scripts/smoke.plasma.sh deleted file mode 100755 index 54950c4e461e..000000000000 --- a/packages/omgx/immutability/scripts/smoke.plasma.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/sh - - -function banner { - echo "------------------------------------------------------------------------------------------------------------------------------------" -} - -source /vault/scripts/smoke.env.sh - -banner -echo "CONFIGURE MOUNT" -echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" -vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" - -banner -echo "CREATE WALLET WITH MNEMONIC FOR PLASMA DEPLOYER" -echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer mnemonic='$MNEMONIC'" -vault write -format=json immutability-eth-plugin/wallets/plasma-deployer mnemonic="$MNEMONIC" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer mnemonic="$MNEMONIC" - -banner -echo "CREATE DEPLOYER ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/plasma-deployer/accounts" -DEPLOYER=$(vault write -f -field=address immutability-eth-plugin/wallets/plasma-deployer/accounts) -check_result $? 0 -echo "DEPLOYER=$DEPLOYER" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts - -banner -echo "CREATE MAINTAINER ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/plasma-deployer/accounts" -MAINTAINER=$(vault write -f -field=address immutability-eth-plugin/wallets/plasma-deployer/accounts) -check_result $? 0 -echo "MAINTAINER=$MAINTAINER" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts - -banner -echo "CREATE AUTHORITY ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/plasma-deployer/accounts" -ORIGINAL_AUTHORITY=$(vault write -f -field=address immutability-eth-plugin/wallets/plasma-deployer/accounts) -check_result $? 0 -echo "ORIGINAL_AUTHORITY=$ORIGINAL_AUTHORITY" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts - -banner -echo "CREATE UNAUTHORIZED ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/plasma-deployer/accounts" -UNAUTHORIZED=$(vault write -f -field=address immutability-eth-plugin/wallets/plasma-deployer/accounts) -check_result $? 0 -echo "UNAUTHORIZED=$UNAUTHORIZED" -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts -banner - -echo "*** SHOULD FAIL! ***" -echo "UNAUTHORIZED SUBMISSION OF BLOCK BY $UNAUTHORIZED" -echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$UNAUTHORIZED/plasma/submitBlock nonce=0 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$UNAUTHORIZED/plasma/submitBlock nonce=0 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -check_result $? 2 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$UNAUTHORIZED/plasma/submitBlock nonce=0 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -banner -echo "*** SHOULD SUCCEED ***" -echo "AUTHORIZED SUBMISSION OF BLOCK BY $ORIGINAL_AUTHORITY" -echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=0 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=0 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=0 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -banner -echo "*** SHOULD FAIL ***" -echo "AUTHORIZED SUBMISSION OF BAD BLOCK BY $ORIGINAL_AUTHORITY" -echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BAD_BLOCK_ROOT contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BAD_BLOCK_ROOT contract=$PLASMA_CONTRACT -check_result $? 2 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BAD_BLOCK_ROOT contract=$PLASMA_CONTRACT - -banner -echo "*** SHOULD SUCCEED ***" -echo "AUTHORIZED SUBMISSION OF BLOCK BY $ORIGINAL_AUTHORITY - USER SUPPLIED GAS PRICE" -echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -banner -echo "*** SHOULD FAIL! ***" -echo "AUTHORIZED SUBMISSION OF BLOCK BY $ORIGINAL_AUTHORITY - USER SUPPLIED GAS PRICE WITHOUT NONCE" -echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -check_result $? 2 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock gas_price=$GAS_PRICE_HIGH block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - -banner -echo "*** SHOULD FAIL! ***" -echo "AUTHORIZED SUBMISSION OF BLOCK BY $ORIGINAL_AUTHORITY - USER SUPPLIED NONCE WITHOUT GAS PRICE" -echo "vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT" -vault write -format=json immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT -check_result $? 2 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/plasma-deployer/accounts/$ORIGINAL_AUTHORITY/plasma/submitBlock nonce=1 block_root=$BLOCK_ROOT contract=$PLASMA_CONTRACT - diff --git a/packages/omgx/immutability/scripts/smoke.whitelist.sh b/packages/omgx/immutability/scripts/smoke.whitelist.sh deleted file mode 100755 index e759b536f23e..000000000000 --- a/packages/omgx/immutability/scripts/smoke.whitelist.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/sh - -function banner { - echo "------------------------------------------------------------------------------------------------------------------------------------" -} - -function test_whitelist { - banner - echo "*** SHOULD SUCCEED ***" - echo "TRANSFER FUNDS FROM $ACCOUNT0 TO $WHITELISTED" - echo "vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0/debit to=$WHITELISTED amount=$FUNDING_AMOUNT" - vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0/debit to=$WHITELISTED amount=$FUNDING_AMOUNT - check_result $? 0 - banner - #vault write -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0/debit to=$WHITELISTED amount=$FUNDING_AMOUNT - - banner - echo "*** SHOULD FAIL! ***" - echo "TRANSFER FUNDS FROM $ACCOUNT0 TO $UNLISTED" - echo "vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0/debit to=$UNLISTED amount=$FUNDING_AMOUNT" - vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0/debit to=$UNLISTED amount=$FUNDING_AMOUNT - check_result $? 2 - banner - #vault write -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0/debit to=$UNLISTED amount=$FUNDING_AMOUNT - -} -source /vault/scripts/smoke.env.sh - -EMPTY="" -FUNDING_AMOUNT=100000000000000000 -TEST_AMOUNT=10000000000000000 - -banner -echo "CONFIGURE MOUNT WITH NO WHITELIST" -echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" -vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" - -banner -echo "CREATE WALLET WITH MNEMONIC" -echo "vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet mnemonic='$MNEMONIC'" -vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet mnemonic="$MNEMONIC" -check_result $? 0 -banner -#vault write -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet mnemonic="$MNEMONIC" - -banner -echo "CREATE NEW ACCOUNT IN WALLET" -echo "vault write -format=json -f immutability-eth-plugin/wallets/whitelist-wallet/accounts" -ACCOUNT0=$(vault write -f -field=address immutability-eth-plugin/wallets/whitelist-wallet/accounts) -check_result $? 0 -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet/accounts - -banner -echo "CREATE NEW WHITELISTED ACCOUNT" -echo "vault write -format=json -f immutability-eth-plugin/wallets/whitelist-wallet/accounts" -WHITELISTED=$(vault write -f -field=address immutability-eth-plugin/wallets/whitelist-wallet/accounts) -check_result $? 0 -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet/accounts - -banner -echo "CREATE NEW UNLISTED ACCOUNT" -echo "vault write -format=json -f immutability-eth-plugin/wallets/whitelist-wallet/accounts" -UNLISTED=$(vault write -f -field=address immutability-eth-plugin/wallets/whitelist-wallet/accounts) -check_result $? 0 -banner -#vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet/accounts - -### -### // whitelisting and blacklisting are not implemented in this release! -### which is what is tested below! - -# banner -# echo "ACCOUNT-LEVEL WHITELIST: ADD $WHITELISTED TO WHITELIST FOR $ACCOUNT0" -# echo "vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0 whitelist=$WHITELISTED" -# vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0 whitelist=$WHITELISTED -# check_result $? 0 -# banner -# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0 whitelist=$WHITELISTED - -# test_whitelist - -# banner -# echo "ACCOUNT-LEVEL WHITELIST: REMOVE WHITELIST FOR $ACCOUNT0" -# echo "vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0 whitelist=$EMPTY" -# vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0 whitelist=$EMPTY -# check_result $? 0 -# banner -# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet/accounts/$ACCOUNT0 whitelist=$EMPTY - -# banner -# echo "WALLET-LEVEL WHITELIST: ADD $WHITELISTED TO WHITELIST FOR whitelist-wallet" -# echo "vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet whitelist=$WHITELISTED" -# vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet whitelist=$WHITELISTED -# check_result $? 0 -# banner -# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet whitelist=$WHITELISTED - -# test_whitelist - -# banner -# echo "WALLET-LEVEL WHITELIST: REMOVE WHITELIST FOR whitelist-wallet" -# echo "vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet whitelist=$EMPTY" -# vault write -format=json immutability-eth-plugin/wallets/whitelist-wallet whitelist=$EMPTY -# check_result $? 0 -# banner -# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/whitelist-wallet whitelist=$EMPTY - -# banner -# echo "GLOBAL-LEVEL WHITELIST: ADD $WHITELISTED TO WHITELIST FOR immutability-eth-plugin" -# echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID' whitelist='$WHITELISTED'" -# vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" whitelist=$WHITELISTED -# check_result $? 0 -# banner -# #vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" whitelist=$WHITELISTED - -# test_whitelist - -# banner -# echo "GLOBAL-LEVEL WHITELIST: REMOVE WHITELIST FOR immutability-eth-plugin" -# echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID' whitelist='$EMPTY'" -# vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" whitelist="$EMPTY" -# check_result $? 0 -# banner -# #vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID whitelist=$EMPTY diff --git a/packages/omgx/immutability/scripts/smoketest.sh b/packages/omgx/immutability/scripts/smoketest.sh deleted file mode 100755 index 9bd7bede8d70..000000000000 --- a/packages/omgx/immutability/scripts/smoketest.sh +++ /dev/null @@ -1,248 +0,0 @@ -#!/bin/sh - -source /vault/scripts/smoke.env.sh - - -echo "" -echo "------------------------------------------------------------------" -echo "CONFIGURE MOUNT" -echo "vault write -f immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='5777' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" -vault write immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" -check_result $? 0 -#vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" - -echo "" -echo "------------------------------------------------------------------" -echo "READ MOUNT CONFIGURATION" -echo "vault read immutability-eth-plugin/config" -vault read immutability-eth-plugin/config -check_result $? 0 -#vault read -output-curl-string immutability-eth-plugin/config - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE WALLET WITHOUT MNEMONIC" -echo "vault write -f immutability-eth-plugin/wallets/test-wallet-1" -vault write -f immutability-eth-plugin/wallets/test-wallet-1 -check_result $? 0 -#vault write -f -output-curl-string immutability-eth-plugin/wallets/test-wallet-1 - -echo "" -echo "------------------------------------------------------------------" -echo "LIST WALLETS" -echo "vault list immutability-eth-plugin/wallets" -vault list immutability-eth-plugin/wallets -check_result $? 0 -#vault list -output-curl-string immutability-eth-plugin/wallets - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE WALLET WITH MNEMONIC" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2 mnemonic='$MNEMONIC'" -vault write immutability-eth-plugin/wallets/test-wallet-2 mnemonic="$MNEMONIC" -check_result $? 0 -#vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2 mnemonic="$MNEMONIC" - -echo "" -echo "------------------------------------------------------------------" -echo "LIST WALLETS" -echo "vault list immutability-eth-plugin/wallets" -vault list immutability-eth-plugin/wallets -check_result $? 0 -#vault list -output-curl-string immutability-eth-plugin/wallets - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE NEW ACCOUNT IN WALLET" -echo "vault write -f immutability-eth-plugin/wallets/test-wallet-2/accounts" -ACCOUNT0=$(vault write -f -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts) -check_result $? 0 -#vault write -f -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE SECOND NEW ACCOUNT IN WALLET WITH WHITELIST == $ACCOUNT0" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts whitelist=$ACCOUNT0" -ACCOUNT1=$(vault write -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts whitelist=$ACCOUNT0) -check_result $? 0 -#vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts whitelist=$ACCOUNT0 - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE THIRD NEW ACCOUNT IN WALLET WITH BLACKLIST == $ACCOUNT1" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts blacklist=$ACCOUNT1" -ACCOUNT2=$(vault write -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts blacklist=$ACCOUNT1) -check_result $? 0 -#vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts blacklist=$ACCOUNT1 - -echo "" -echo "------------------------------------------------------------------" -echo "FUND ACCOUNTS ($ACCOUNT1, $ACCOUNT2) FROM $ACCOUNT0" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT1 amount=$FUNDING_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT1 amount=$FUNDING_AMOUNT -check_result $? 0 -#vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT1 amount=$FUNDING_AMOUNT - -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT2 amount=$FUNDING_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT2 amount=$FUNDING_AMOUNT -check_result $? 0 -echo "" -echo "------------------------------------------------------------------" -echo "VIOLATE $ACCOUNT1'S WHITELIST BY ATTEMPTING TO SEND TO $ACCOUNT2" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT2 amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT2 amount=$TEST_AMOUNT -check_result $? 2 -#vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT2 amount=$TEST_AMOUNT - -echo "" -echo "------------------------------------------------------------------" -echo "ADHERE TO $ACCOUNT1'S WHITELIST BY ATTEMPTING TO SEND TO $ACCOUNT0" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT0 amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT0 amount=$TEST_AMOUNT -check_result $? 0 -# vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT0 amount=$TEST_AMOUNT - -echo "" -echo "------------------------------------------------------------------" -echo "VIOLATE $ACCOUNT2'S BLACKLIST BY ATTEMPTING TO SEND TO $ACCOUNT1" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT1 amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT1 amount=$TEST_AMOUNT -check_result $? 2 - -# vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT1 amount=$TEST_AMOUNT -echo "" -echo "------------------------------------------------------------------" -echo "ADHERE TO $ACCOUNT2'S BLACKLIST BY ATTEMPTING TO SEND TO $ACCOUNT0" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT0 amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT0 amount=$TEST_AMOUNT -check_result $? 0 - -# vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT0 amount=$TEST_AMOUNT -echo "" -echo "------------------------------------------------------------------" -echo "CREATE NEW ACCOUNT IN WALLET TO TEST WHITELIST AT WALLET LEVEL" -echo "vault write -f immutability-eth-plugin/wallets/test-wallet-2/accounts" -ACCOUNT_WALLET_WHITE=$(vault write -f -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts) -check_result $? 0 - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE NEW ACCOUNT IN WALLET TO TEST BLACKLISTS AT WALLET LEVEL" -echo "vault write -f immutability-eth-plugin/wallets/test-wallet-2/accounts" -ACCOUNT_WALLET_BLACK=$(vault write -f -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts) -check_result $? 0 - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE NEW ACCOUNT IN test-wallet-2 TO TEST WHITELISTS AND BLACKLISTS AT WALLET LEVEL" -echo "vault write -f immutability-eth-plugin/wallets/test-wallet-2/accounts" -ACCOUNT_NOT_WHITE=$(vault write -f -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts) -check_result $? 0 - -echo "" -echo "------------------------------------------------------------------" -echo "CREATE NEW ACCOUNT IN test-wallet-2 TO TEST WHITELISTS AND BLACKLISTS AT GLOBAL LEVEL" -echo "vault write -f immutability-eth-plugin/wallets/test-wallet-2/accounts" -ACCOUNT_BIG_BAD=$(vault write -f -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts) -check_result $? 0 - -echo "" -echo "------------------------------------------------------------------" -echo "test-wallet-2 HAS NO BLACKLIST YET SO SEND TO $ACCOUNT_WALLET_BLACK" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT_WALLET_BLACK amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT_WALLET_BLACK amount=$TEST_AMOUNT -check_result $? 0 - -### -### // whitelisting and blacklisting are not implemented in this release! -### which is what is tested below! - -# echo "" -# echo "------------------------------------------------------------------" -# echo "SET test-wallet-2 BLACKLIST" -# echo "vault write immutability-eth-plugin/wallets/test-wallet-2 blacklist=$ACCOUNT_WALLET_BLACK" -# vault write immutability-eth-plugin/wallets/test-wallet-2 blacklist=$ACCOUNT_WALLET_BLACK -# check_result $? 0 -# # vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2 blacklist=$ACCOUNT_WALLET_BLACK - -# echo "" -# echo "------------------------------------------------------------------" -# echo "VIOLATE TO test-wallet-2's BLACKLIST BY ATTEMPTING TO SEND TO $ACCOUNT_WALLET_BLACK" -# echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT_WALLET_BLACK amount=$TEST_AMOUNT" -# vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT_WALLET_BLACK amount=$TEST_AMOUNT -# check_result $? 0 -# # vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT2/debit to=$ACCOUNT_WALLET_BLACK amount=$TEST_AMOUNT - -# echo "" -# echo "------------------------------------------------------------------" -# echo "ATTEMPT TO SEND TO $ACCOUNT_WALLET_WHITE - SHOULD FAIL - NOT WHITELISTED BY $ACCOUNT1" -# echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_WALLET_WHITE amount=$TEST_AMOUNT" -# vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_WALLET_WHITE amount=$TEST_AMOUNT -# check_result $? 0 -# # vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_WALLET_WHITE amount=$TEST_AMOUNT - -# echo "" -# echo "------------------------------------------------------------------" -# echo "SET test-wallet-2 WHITELIST AND BLACKLIST" -# echo "vault write immutability-eth-plugin/wallets/test-wallet-2 whitelist=$ACCOUNT_WALLET_WHITE blacklist=$ACCOUNT_WALLET_BLACK" -# vault write immutability-eth-plugin/wallets/test-wallet-2 whitelist=$ACCOUNT_WALLET_WHITE blacklist=$ACCOUNT_WALLET_BLACK -# check_result $? 0 -# # vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2 whitelist=$ACCOUNT_WALLET_WHITE blacklist=$ACCOUNT_WALLET_BLACK - -# echo "" -# echo "------------------------------------------------------------------" -# echo "ATTEMPT TO SEND TO $ACCOUNT_WALLET_WHITE - SHOULD SUCCEED - WHITELISTED BY WALLET" -# echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_WALLET_WHITE amount=$TEST_AMOUNT" -# vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_WALLET_WHITE amount=$TEST_AMOUNT -# check_result $? 0 -# #vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_WALLET_WHITE amount=$TEST_AMOUNT - -### -### and these (below) work -### - -echo "" -echo "------------------------------------------------------------------" -echo "ATTEMPT TO SEND TO $ACCOUNT_NOT_WHITE - SHOULD FAIL - NOT WHITELISTED BY WALLET OR ACCOUNT" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_NOT_WHITE amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_NOT_WHITE amount=$TEST_AMOUNT -check_result $? 2 -# vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_NOT_WHITE amount=$TEST_AMOUNT - -echo "" -echo "------------------------------------------------------------------" -echo "ADD $ACCOUNT_NOT_WHITE TO THE GLOBAL WHITELIST" -echo "vault write immutability-eth-plugin/config whitelist=$ACCOUNT_NOT_WHITE rpc_url=$RPC_URL chain_id=$CHAIN_ID rpc_l2_url=$RPC_L2_URL chain_l2_id=$CHAIN_L2_ID" -vault write immutability-eth-plugin/config whitelist=$ACCOUNT_NOT_WHITE rpc_url=$RPC_URL chain_id=$CHAIN_ID rpc_l2_url=$RPC_L2_URL chain_l2_id=$CHAIN_L2_ID -check_result $? 0 -# vault write -output-curl-string immutability-eth-plugin/config whitelist=$ACCOUNT_NOT_WHITE rpc_url=$RPC_URL chain_id=$CHAIN_ID rpc_l2_url=$RPC_L2_URL chain_l2_id=$CHAIN_L2_ID - -echo "" -echo "------------------------------------------------------------------" -echo "ATTEMPT TO SEND TO $ACCOUNT_NOT_WHITE - SHOULD SUCCEED - GLOBALLY WHITELISTED" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_NOT_WHITE amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_NOT_WHITE amount=$TEST_AMOUNT -check_result $? 0 -# vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_NOT_WHITE amount=$TEST_AMOUNT - -echo "" -echo "------------------------------------------------------------------" -echo "ATTEMPT TO SEND TO $ACCOUNT_BIG_BAD - SHOULD FAIL - NOT WHITELISTED BY WALLET OR ACCOUNT" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_BIG_BAD amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_BIG_BAD amount=$TEST_AMOUNT -check_result $? 2 - -echo "" -echo "------------------------------------------------------------------" -echo "ADD $ACCOUNT_BIG_BAD TO THE GLOBAL WHITELIST" -echo "vault write immutability-eth-plugin/config whitelist=$ACCOUNT_BIG_BAD rpc_url=$RPC_URL chain_id=$CHAIN_ID rpc_l2_url=$RPC_L2_URL chain_l2_id=$CHAIN_L2_ID" -vault write immutability-eth-plugin/config whitelist=$ACCOUNT_BIG_BAD rpc_url=$RPC_URL chain_id=$CHAIN_ID rpc_l2_url=$RPC_L2_URL chain_l2_id=$CHAIN_L2_ID -check_result $? 0 - -echo "" -echo "------------------------------------------------------------------" -echo "ATTEMPT TO SEND TO $ACCOUNT_BIG_BAD - SHOULD SUCCEED - GLOBALLY WHITELISTED" -echo "vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_BIG_BAD amount=$TEST_AMOUNT" -vault write immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT1/debit to=$ACCOUNT_BIG_BAD amount=$TEST_AMOUNT -check_result $? 0 -echo "" diff --git a/packages/omgx/immutability/test/config.sh b/packages/omgx/immutability/test/config.sh new file mode 100755 index 000000000000..50be0a74f934 --- /dev/null +++ b/packages/omgx/immutability/test/config.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +export CHAIN_ID=31337 +export CHAIN_L2_ID=28 +export RPC_URL="http://l1_chain:8545" +export RPC_L2_URL="http://l2geth:8545" +export WALLET_NAME=sequencer +export WALLET_NAME_2=proposer +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" +echo "CONFIGURE BACKEND" +vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" +echo "DONE CONFIGURING BACKEND" + +# lets create a sequencer wallet without mnemonic +echo "WALLET $WALLET_NAME WITHOUT MNEMONIC" +vault write -format=json -f immutability-eth-plugin/wallets/$WALLET_NAME +# lets create a proposer wallet without mnemonic +echo "WALLET $WALLET_NAME_2 WITHOUT MNEMONIC" +vault write -format=json -f immutability-eth-plugin/wallets/$WALLET_NAME_2 + +echo "CREATE TWO NEW ACCOUNTS IN WALLET $WALLET_NAME and $WALLET_NAME_2" +ACCOUNT0=$(vault write -f -field=address immutability-eth-plugin/wallets/$WALLET_NAME/accounts) +ACCOUNT1=$(vault write -f -field=address immutability-eth-plugin/wallets/$WALLET_NAME_2/accounts) + +tee append-sequencer-batch.hcl <> $DIR/tokens_and_accounts.sh +echo "export PROPOSER_ADDRESS=$ACCOUNT1" >> $DIR/tokens_and_accounts.sh + +if [[ ! -z "$AWS_ROLE" && ! -z "$AWS_BOUND_IAM_PRINCIPAL_ARN" && ! -z "$AWS_ACCESS_KEY_ID" && ! -z "$AWS_SECRET_ACCESS_KEY" ]]; then + echo "Not writting tokens in helper - enabling AWS auth backend" + vault auth enable aws + vault write auth/aws/role/${AWS_ROLE} auth_type=iam \ + bound_iam_principal_arn=${AWS_BOUND_IAM_PRINCIPAL_ARN} policies=append-state-batch-proposer,append-sequencer-batch max_ttl=500h + vault login -method=aws role=${AWS_ROLE} +else + PROPOSER_TOKEN=$(vault token create -field=token -period=30m -policy=append-state-batch-proposer) + SEQUENCER_TOKEN=$(vault token create -field=token -period=30m -policy=append-sequencer-batch) + echo "export PROPOSER_TOKEN=$PROPOSER_TOKEN" >> $DIR/tokens_and_accounts.sh + echo "export SEQUENCER_TOKEN=$SEQUENCER_TOKEN" >> $DIR/tokens_and_accounts.sh +fi +cat $DIR/tokens_and_accounts.sh + + + diff --git a/packages/omgx/immutability/scripts/cycle.sh b/packages/omgx/immutability/test/cycle.sh similarity index 100% rename from packages/omgx/immutability/scripts/cycle.sh rename to packages/omgx/immutability/test/cycle.sh diff --git a/packages/omgx/immutability/test/execute_tests.sh b/packages/omgx/immutability/test/execute_tests.sh new file mode 100755 index 000000000000..6aea563fcb11 --- /dev/null +++ b/packages/omgx/immutability/test/execute_tests.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +trap 'catch' EXIT +catch() { + if [ "$RUN_TEST" == "true" ]; then + echo "Done with tests." + else + echo "Not exiting, waiting for Vault pid to exit." + ps $(pidof vault) -o pid | grep -w $(pidof vault) >/dev/null 2>&1 + while [ "$?" == "0" ] + do + sleep 10 + ps $(pidof vault) -o pid | grep -w $(pidof vault) >/dev/null 2>&1 + done + fi +} + +function test_banner { + echo "************************************************************************************************************************************" +} + +function test_plugin { + if [ "$RUN_TEST" == "true" ]; then + test_banner + test_banner + echo "SMOKE TEST BASIC WALLET FUNCTIONALITY" + test_banner + /vault/test/smoke.wallet.sh + test_banner + echo "SMOKE TEST OVM SUBMIT BATCH" + test_banner + /vault/test/smoke.ovm.sh + echo "SMOKE TEST OVM CUSTOM ENCODING" + test_banner + /vault/test/smoke.encode_asb.sh + else + echo "Skipping tests." + fi +} + +test_plugin diff --git a/packages/omgx/immutability/test/index.js b/packages/omgx/immutability/test/index.js new file mode 100644 index 000000000000..ae456a1b619e --- /dev/null +++ b/packages/omgx/immutability/test/index.js @@ -0,0 +1,16 @@ +var Web3 = require('web3'); + +(async () => { + try { + var web3 = new Web3(new Web3.providers.HttpProvider(process.env.RPC_URL)); + const toAddress = process.argv.slice(2)[0]; // Address of the recipient + const amount = '2'; // Willing to send 2 ethers + const amountToSend = web3.utils.toWei(amount, "ether"); // Convert to wei value + //use an account from l1_chain PK 0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba + console.log('Funding address with ETH'); + console.log(toAddress); + console.log(await web3.eth.sendTransaction({ from:'0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc', to:toAddress, value:amountToSend })); + } catch (e) { + // Deal with the fact the chain failed + } +})(); \ No newline at end of file diff --git a/packages/omgx/immutability/test/package-lock.json b/packages/omgx/immutability/test/package-lock.json new file mode 100644 index 000000000000..1cf4cc095ae7 --- /dev/null +++ b/packages/omgx/immutability/test/package-lock.json @@ -0,0 +1,6433 @@ +{ + "name": "fund_acc", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "fund_acc", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "web3": "^1.4.0" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz", + "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.0" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz", + "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==", + "dependencies": { + "@ethereumjs/common": "^2.4.0", + "ethereumjs-util": "^7.1.0" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "dependencies": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz", + "integrity": "sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==", + "dependencies": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/networks": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/web": "^5.4.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz", + "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==", + "dependencies": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz", + "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==", + "dependencies": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/rlp": "^5.4.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz", + "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==", + "dependencies": { + "@ethersproject/bytes": "^5.4.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz", + "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==", + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "bn.js": "^4.11.9" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz", + "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==", + "dependencies": { + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz", + "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==", + "dependencies": { + "@ethersproject/bignumber": "^5.4.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz", + "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==", + "dependencies": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz", + "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==", + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "js-sha3": "0.5.7" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz", + "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==" + }, + "node_modules/@ethersproject/networks": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.1.tgz", + "integrity": "sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig==", + "dependencies": { + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz", + "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==", + "dependencies": { + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz", + "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==", + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz", + "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==", + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz", + "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==", + "dependencies": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz", + "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==", + "dependencies": { + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/rlp": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz", + "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==", + "dependencies": { + "@ethersproject/base64": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "12.20.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.16.tgz", + "integrity": "sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==" + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "engines": { + "node": "*" + } + }, + "node_modules/blakejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", + "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.2.0" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "dependencies": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "dependencies": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "dependencies": { + "js-sha3": "^0.8.0" + } + }, + "node_modules/ethereum-bloom-filters/node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz", + "integrity": "sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethereumjs-util/node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-util/node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "engines": { + "node": "*" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dependencies": { + "punycode": "2.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "engines": { + "node": ">=6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dependencies": { + "mkdirp": "*" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "dependencies": { + "varint": "^5.0.0" + } + }, + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + } + }, + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", + "dependencies": { + "http-https": "^1.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dependencies": { + "bn.js": "^4.11.1" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dependencies": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "node_modules/simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "dependencies": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/swarm-js": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", + "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "dependencies": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + } + }, + "node_modules/swarm-js/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/swarm-js/node_modules/got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dependencies": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/swarm-js/node_modules/p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/swarm-js/node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/swarm-js/node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.2.0" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/web3": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.4.0.tgz", + "integrity": "sha512-faT3pIX+1tuo+wqmUFQPe10MUGaB1UvRYxw9dmVJFLxaRAIfXErSilOf3jFhSwKbbPNkwG0bTiudCLN9JgeS7A==", + "dependencies": { + "web3-bzz": "1.4.0", + "web3-core": "1.4.0", + "web3-eth": "1.4.0", + "web3-eth-personal": "1.4.0", + "web3-net": "1.4.0", + "web3-shh": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.4.0.tgz", + "integrity": "sha512-KhXmz8hcfGsqhplB7NrekAeNkG2edHjXV4bL3vnXde8RGMWpabpSNxuwiGv+dv/3nWlrHatH0vGooONYCkP5TA==", + "dependencies": { + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.12.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.4.0.tgz", + "integrity": "sha512-VRNMNqwzvPeKIet2l9BMApPHoUv0UqwaZH0lZJhG2RBko42w9Xls+pQwfVNSV16j04t/ehm1aLRV2Sx6lzVfRg==", + "dependencies": { + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-requestmanager": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-helpers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.4.0.tgz", + "integrity": "sha512-8Ebq0nmRfzw7iPoXbIRHEWOuPh+1cOV3OOEvKm5Od3McZOjja914vdk+DM3MgmbSpDzYJRFM6KoF0+Z/U/1bPw==", + "dependencies": { + "underscore": "1.12.1", + "web3-eth-iban": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-method": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.4.0.tgz", + "integrity": "sha512-KW9922fEkgKu8zDcJR8Iikg/epsuWMArAUVTipKVwzAI5TVdvOMRgSe/b7IIDRUIeoeXMARmJ+PrAlx+IU2acQ==", + "dependencies": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-promievent": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.4.0.tgz", + "integrity": "sha512-YEwko22kcry7lHwbe0k80BrjXCZ+73jMdvZtptRH5k2B+XZ1XtmXwYL1PFIlZy9V0zgZijdg+3GabCnAHjVXAw==", + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-requestmanager": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.4.0.tgz", + "integrity": "sha512-qIwKJO5T0KkUAIL7y9JRSUkk3+LaCwghdUHK8FzbMvq6R1W9lgCBnccqFGEI76EJjHvsiw4kEKBEXowdB3xenQ==", + "dependencies": { + "underscore": "1.12.1", + "util": "^0.12.0", + "web3-core-helpers": "1.4.0", + "web3-providers-http": "1.4.0", + "web3-providers-ipc": "1.4.0", + "web3-providers-ws": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-subscriptions": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.4.0.tgz", + "integrity": "sha512-/UMC9rSLEd0U+h6Qanx6CM29o/cfUyGWgl/HM6O/AIuth9G+34QBuKDa11Gr2Qg6F8Lr9tSFm8QIGVniOx9i5A==", + "dependencies": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.4.0.tgz", + "integrity": "sha512-L990eMJeWh4h/Z3M8MJb9HrKq8tqvzdGZ7igdzd6Ba3B/VKgGFAJ/4XIqtLwAJ1Wg5Cj8my60tYY+34c2cLefw==", + "dependencies": { + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-eth-accounts": "1.4.0", + "web3-eth-contract": "1.4.0", + "web3-eth-ens": "1.4.0", + "web3-eth-iban": "1.4.0", + "web3-eth-personal": "1.4.0", + "web3-net": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.4.0.tgz", + "integrity": "sha512-FtmWipG/dSSkTGFb72JCwky7Jd0PIvd0kGTInWQwIEZlw5qMOYl61WZ9gwfojFHvHF6q1eKncerQr+MRXHO6zg==", + "dependencies": { + "@ethersproject/abi": "5.0.7", + "underscore": "1.12.1", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.4.0.tgz", + "integrity": "sha512-tETHBvfO3Z7BXZ7HJIwuX7ol6lPefP55X7b4IiX82C1PujHwsxENY7c/3wyxzqKoDyH6zfyEQo17yhxkhsM1oA==", + "dependencies": { + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.1", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "underscore": "1.12.1", + "uuid": "3.3.2", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/web3-eth-contract": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.4.0.tgz", + "integrity": "sha512-GfIhOzfp/ZXKd+1tFEH3ePq0DEsvq9XO5tOsI0REDtEYUj2GNxO5e/x/Fhekk7iLZ7xAqSzDMweFruDQ1fxn0A==", + "dependencies": { + "@types/bn.js": "^4.11.5", + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-ens": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.4.0.tgz", + "integrity": "sha512-jR1KorjU1erpYFpFzsMXAWZnHhqUqWPBq/4+BGVj7/pJ43+A3mrE1eB0zl91Dwc1RTNwOhB02iOj1c9OlpGr3g==", + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-eth-contract": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.4.0.tgz", + "integrity": "sha512-YNx748VzwiBe0gvtZjvU9BQsooZ9s9sAlmiDWJOMcvMbUTDhC7SvxA7vV/vrnOxL6oGHRh0U/azsYNxxlKiTBw==", + "dependencies": { + "bn.js": "^4.11.9", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.4.0.tgz", + "integrity": "sha512-8Ip6xZ8plmWqAD4ESbKUIPVV9gfTAFFm0ff1FQIw9I9kYvFlBIPzukvm852w2SftGem+/iRH+2+2mK7HvuKXZQ==", + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-net": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-net": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.4.0.tgz", + "integrity": "sha512-41WkKobL+KnKC0CY0RZ1KhMMyR/hMFGlbHZQac4KtB7ro1UdXeK+RiYX+GzSr1h7j9Dj+dQZqyBs70cxmL9cPQ==", + "dependencies": { + "web3-core": "1.4.0", + "web3-core-method": "1.4.0", + "web3-utils": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-http": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.4.0.tgz", + "integrity": "sha512-A9nLF4XGZfDb1KYYuKRwHY1H90Ee/0I0CqQQEELI0yuY9eca50qdCHEg3sJhvqBIG44JCm83amOGxR8wi+76tQ==", + "dependencies": { + "web3-core-helpers": "1.4.0", + "xhr2-cookies": "1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.4.0.tgz", + "integrity": "sha512-ul/tSNUI5anhdBGBV+FWFH9EJgO73/G21haFDEXvTnSJQa9/byj401H/E2Xd8BXGk+2XB+CCGLZBiuAjhhhtTA==", + "dependencies": { + "oboe": "2.1.5", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.4.0.tgz", + "integrity": "sha512-E5XfF58RLXuCtGiMSXxXEtjceCfPli+I4MDYCKx/J/bDJ6qvLUM2OnnGEmE7pq1Z03h0xh1ZezaB/qoweK3ZIQ==", + "dependencies": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-shh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.4.0.tgz", + "integrity": "sha512-OZMkMgo+VZnu1ErhIFXW+5ExnPKQg9v8/2DHGVtNEwuC5OHYuAEF5U7MQgbxYJYwbRmxQCt/hA3VwKjnkbmSAA==", + "dependencies": { + "web3-core": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-net": "1.4.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.4.0.tgz", + "integrity": "sha512-b8mEhwh/J928Xk+SQFjtqrR2EGPhpknWLcIt9aCpVPVRXiqjUGo/kpOHKz0azu9c6/onEJ9tWXZt0cVjmH0N5Q==", + "dependencies": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dependencies": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dependencies": { + "xhr-request": "^1.1.0" + } + }, + "node_modules/xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "dependencies": { + "cookiejar": "^2.1.1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + }, + "dependencies": { + "@ethereumjs/common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz", + "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==", + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.0" + } + }, + "@ethereumjs/tx": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz", + "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==", + "requires": { + "@ethereumjs/common": "^2.4.0", + "ethereumjs-util": "^7.1.0" + } + }, + "@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "requires": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz", + "integrity": "sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==", + "requires": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/networks": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/web": "^5.4.0" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz", + "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==", + "requires": { + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0" + } + }, + "@ethersproject/address": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz", + "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==", + "requires": { + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/rlp": "^5.4.0" + } + }, + "@ethersproject/base64": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz", + "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==", + "requires": { + "@ethersproject/bytes": "^5.4.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz", + "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "bn.js": "^4.11.9" + } + }, + "@ethersproject/bytes": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz", + "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==", + "requires": { + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/constants": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz", + "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==", + "requires": { + "@ethersproject/bignumber": "^5.4.0" + } + }, + "@ethersproject/hash": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz", + "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==", + "requires": { + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "@ethersproject/keccak256": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz", + "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "js-sha3": "0.5.7" + } + }, + "@ethersproject/logger": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz", + "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==" + }, + "@ethersproject/networks": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.1.tgz", + "integrity": "sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig==", + "requires": { + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/properties": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz", + "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==", + "requires": { + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/rlp": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz", + "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/signing-key": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz", + "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "@ethersproject/strings": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz", + "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==", + "requires": { + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0" + } + }, + "@ethersproject/transactions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz", + "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==", + "requires": { + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/rlp": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0" + } + }, + "@ethersproject/web": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz", + "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==", + "requires": { + "@ethersproject/base64": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "12.20.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.16.tgz", + "integrity": "sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==" + }, + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "requires": { + "@types/node": "*" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "base-x": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", + "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, + "blakejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", + "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "requires": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "dependencies": { + "multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "requires": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + } + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "requires": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", + "requires": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "requires": { + "js-sha3": "^0.8.0" + }, + "dependencies": { + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + } + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz", + "integrity": "sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + }, + "dependencies": { + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "requires": { + "@types/node": "*" + } + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + } + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "*" + } + }, + "mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "requires": { + "varint": "^5.0.0" + } + }, + "multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "requires": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + }, + "dependencies": { + "multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + } + } + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "requires": { + "bn.js": "^4.11.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "requires": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "swarm-js": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", + "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "utf-8-validate": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "web3": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.4.0.tgz", + "integrity": "sha512-faT3pIX+1tuo+wqmUFQPe10MUGaB1UvRYxw9dmVJFLxaRAIfXErSilOf3jFhSwKbbPNkwG0bTiudCLN9JgeS7A==", + "requires": { + "web3-bzz": "1.4.0", + "web3-core": "1.4.0", + "web3-eth": "1.4.0", + "web3-eth-personal": "1.4.0", + "web3-net": "1.4.0", + "web3-shh": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-bzz": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.4.0.tgz", + "integrity": "sha512-KhXmz8hcfGsqhplB7NrekAeNkG2edHjXV4bL3vnXde8RGMWpabpSNxuwiGv+dv/3nWlrHatH0vGooONYCkP5TA==", + "requires": { + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.12.1" + } + }, + "web3-core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.4.0.tgz", + "integrity": "sha512-VRNMNqwzvPeKIet2l9BMApPHoUv0UqwaZH0lZJhG2RBko42w9Xls+pQwfVNSV16j04t/ehm1aLRV2Sx6lzVfRg==", + "requires": { + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-requestmanager": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-core-helpers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.4.0.tgz", + "integrity": "sha512-8Ebq0nmRfzw7iPoXbIRHEWOuPh+1cOV3OOEvKm5Od3McZOjja914vdk+DM3MgmbSpDzYJRFM6KoF0+Z/U/1bPw==", + "requires": { + "underscore": "1.12.1", + "web3-eth-iban": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-core-method": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.4.0.tgz", + "integrity": "sha512-KW9922fEkgKu8zDcJR8Iikg/epsuWMArAUVTipKVwzAI5TVdvOMRgSe/b7IIDRUIeoeXMARmJ+PrAlx+IU2acQ==", + "requires": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-core-promievent": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.4.0.tgz", + "integrity": "sha512-YEwko22kcry7lHwbe0k80BrjXCZ+73jMdvZtptRH5k2B+XZ1XtmXwYL1PFIlZy9V0zgZijdg+3GabCnAHjVXAw==", + "requires": { + "eventemitter3": "4.0.4" + } + }, + "web3-core-requestmanager": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.4.0.tgz", + "integrity": "sha512-qIwKJO5T0KkUAIL7y9JRSUkk3+LaCwghdUHK8FzbMvq6R1W9lgCBnccqFGEI76EJjHvsiw4kEKBEXowdB3xenQ==", + "requires": { + "underscore": "1.12.1", + "util": "^0.12.0", + "web3-core-helpers": "1.4.0", + "web3-providers-http": "1.4.0", + "web3-providers-ipc": "1.4.0", + "web3-providers-ws": "1.4.0" + } + }, + "web3-core-subscriptions": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.4.0.tgz", + "integrity": "sha512-/UMC9rSLEd0U+h6Qanx6CM29o/cfUyGWgl/HM6O/AIuth9G+34QBuKDa11Gr2Qg6F8Lr9tSFm8QIGVniOx9i5A==", + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0" + } + }, + "web3-eth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.4.0.tgz", + "integrity": "sha512-L990eMJeWh4h/Z3M8MJb9HrKq8tqvzdGZ7igdzd6Ba3B/VKgGFAJ/4XIqtLwAJ1Wg5Cj8my60tYY+34c2cLefw==", + "requires": { + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-eth-accounts": "1.4.0", + "web3-eth-contract": "1.4.0", + "web3-eth-ens": "1.4.0", + "web3-eth-iban": "1.4.0", + "web3-eth-personal": "1.4.0", + "web3-net": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-eth-abi": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.4.0.tgz", + "integrity": "sha512-FtmWipG/dSSkTGFb72JCwky7Jd0PIvd0kGTInWQwIEZlw5qMOYl61WZ9gwfojFHvHF6q1eKncerQr+MRXHO6zg==", + "requires": { + "@ethersproject/abi": "5.0.7", + "underscore": "1.12.1", + "web3-utils": "1.4.0" + } + }, + "web3-eth-accounts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.4.0.tgz", + "integrity": "sha512-tETHBvfO3Z7BXZ7HJIwuX7ol6lPefP55X7b4IiX82C1PujHwsxENY7c/3wyxzqKoDyH6zfyEQo17yhxkhsM1oA==", + "requires": { + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.1", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "underscore": "1.12.1", + "uuid": "3.3.2", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-utils": "1.4.0" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "web3-eth-contract": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.4.0.tgz", + "integrity": "sha512-GfIhOzfp/ZXKd+1tFEH3ePq0DEsvq9XO5tOsI0REDtEYUj2GNxO5e/x/Fhekk7iLZ7xAqSzDMweFruDQ1fxn0A==", + "requires": { + "@types/bn.js": "^4.11.5", + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-eth-ens": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.4.0.tgz", + "integrity": "sha512-jR1KorjU1erpYFpFzsMXAWZnHhqUqWPBq/4+BGVj7/pJ43+A3mrE1eB0zl91Dwc1RTNwOhB02iOj1c9OlpGr3g==", + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-eth-contract": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-eth-iban": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.4.0.tgz", + "integrity": "sha512-YNx748VzwiBe0gvtZjvU9BQsooZ9s9sAlmiDWJOMcvMbUTDhC7SvxA7vV/vrnOxL6oGHRh0U/azsYNxxlKiTBw==", + "requires": { + "bn.js": "^4.11.9", + "web3-utils": "1.4.0" + } + }, + "web3-eth-personal": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.4.0.tgz", + "integrity": "sha512-8Ip6xZ8plmWqAD4ESbKUIPVV9gfTAFFm0ff1FQIw9I9kYvFlBIPzukvm852w2SftGem+/iRH+2+2mK7HvuKXZQ==", + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-net": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-net": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.4.0.tgz", + "integrity": "sha512-41WkKobL+KnKC0CY0RZ1KhMMyR/hMFGlbHZQac4KtB7ro1UdXeK+RiYX+GzSr1h7j9Dj+dQZqyBs70cxmL9cPQ==", + "requires": { + "web3-core": "1.4.0", + "web3-core-method": "1.4.0", + "web3-utils": "1.4.0" + } + }, + "web3-providers-http": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.4.0.tgz", + "integrity": "sha512-A9nLF4XGZfDb1KYYuKRwHY1H90Ee/0I0CqQQEELI0yuY9eca50qdCHEg3sJhvqBIG44JCm83amOGxR8wi+76tQ==", + "requires": { + "web3-core-helpers": "1.4.0", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.4.0.tgz", + "integrity": "sha512-ul/tSNUI5anhdBGBV+FWFH9EJgO73/G21haFDEXvTnSJQa9/byj401H/E2Xd8BXGk+2XB+CCGLZBiuAjhhhtTA==", + "requires": { + "oboe": "2.1.5", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0" + } + }, + "web3-providers-ws": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.4.0.tgz", + "integrity": "sha512-E5XfF58RLXuCtGiMSXxXEtjceCfPli+I4MDYCKx/J/bDJ6qvLUM2OnnGEmE7pq1Z03h0xh1ZezaB/qoweK3ZIQ==", + "requires": { + "eventemitter3": "4.0.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0", + "websocket": "^1.0.32" + } + }, + "web3-shh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.4.0.tgz", + "integrity": "sha512-OZMkMgo+VZnu1ErhIFXW+5ExnPKQg9v8/2DHGVtNEwuC5OHYuAEF5U7MQgbxYJYwbRmxQCt/hA3VwKjnkbmSAA==", + "requires": { + "web3-core": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-net": "1.4.0" + } + }, + "web3-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.4.0.tgz", + "integrity": "sha512-b8mEhwh/J928Xk+SQFjtqrR2EGPhpknWLcIt9aCpVPVRXiqjUGo/kpOHKz0azu9c6/onEJ9tWXZt0cVjmH0N5Q==", + "requires": { + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.12.1", + "utf8": "3.0.0" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + }, + "websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "requires": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "requires": { + "xhr-request": "^1.1.0" + } + }, + "xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "requires": { + "cookiejar": "^2.1.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/packages/omgx/immutability/test/package.json b/packages/omgx/immutability/test/package.json new file mode 100644 index 000000000000..6230a44751e4 --- /dev/null +++ b/packages/omgx/immutability/test/package.json @@ -0,0 +1,14 @@ +{ + "name": "fund_acc", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "web3": "^1.4.0" + } +} diff --git a/packages/omgx/immutability/scripts/smoke.encode_asb.sh b/packages/omgx/immutability/test/smoke.encode_asb.sh similarity index 94% rename from packages/omgx/immutability/scripts/smoke.encode_asb.sh rename to packages/omgx/immutability/test/smoke.encode_asb.sh index 2b1c2c372c74..c5ac2caa942d 100755 --- a/packages/omgx/immutability/scripts/smoke.encode_asb.sh +++ b/packages/omgx/immutability/test/smoke.encode_asb.sh @@ -1,11 +1,12 @@ -#!/bin/sh +#!/bin/bash function banner { echo "------------------------------------------------------------------------------------------------------------------------------------" } +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" -source /vault/scripts/smoke.env.sh +source $DIR/smoke.env.sh echo 'should work with more complex case' #response=$(curl -k -H X-Vault-Token:test-root-token -X PUT https://localhost:8200/v1/immutability-eth-plugin/encodeAppendSequencerBatch -d '{"should_start_at_element": 10, "total_elements_to_append": 1, "contexts": ["{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 1, \"timestamp\": 100, \"block_number\": 200}"], "transactions": ["0x45423400000011", "0x45423400000012"]}' | jq .data) diff --git a/packages/omgx/immutability/scripts/smoke.env.sh b/packages/omgx/immutability/test/smoke.env.sh similarity index 74% rename from packages/omgx/immutability/scripts/smoke.env.sh rename to packages/omgx/immutability/test/smoke.env.sh index 6524b4389d7d..669268412be9 100755 --- a/packages/omgx/immutability/scripts/smoke.env.sh +++ b/packages/omgx/immutability/test/smoke.env.sh @@ -1,21 +1,20 @@ -#!/bin/sh +#!/bin/bash export MNEMONIC="explain foam nice clown method avocado hill basket echo blur elevator marble" -export CHAIN_ID=5777 +export CHAIN_ID=31337 export CHAIN_L2_ID=28 export PORT=8545 -export RPC_URL="http://ganache:$PORT" -export RPC_L2_URL="http://l2geth:$PORT" +export RPC_URL="http://l1_chain:8545" +export RPC_L2_URL="http://l2geth:8545" export CONTRACTS_PATH="/vault/contracts/erc20/build/" -export PLASMA_CONTRACT=`cat /truffleshuffle/plasma_framework_addr.out` export GAS_PRICE_LOW="1" export GAS_PRICE_HIGH="37000000000" +export GAS_PRICE_HIGH2="700000000000" export FUNDING_AMOUNT=100000000000000000 export TEST_AMOUNT=10000000000000000 export PASSPHRASE="passion bauble hypnotic hanky kiwi effective overcast roman staleness" export EMPTY="" -export BLOCK_ROOT="KW7c+YhqaeXzUSARcnOh0sBSWhAU7l144fF6ls0Y5Vw=" -export BAD_BLOCK_ROOT="KW7c+YhqaeXzUSARcnOh0sBSWhAU7l144fF6ls0Y" +export VAULT_ADDR="$VAULT_ADDR" function check_result(){ EXIT_STATUS=$1 EXPECTED=$2 @@ -28,4 +27,4 @@ function check_string_result(){ echo "Exit string of command was $EXIT_STRING." echo "Expected output of command was $EXPECTED." [[ $EXIT_STRING != $EXPECTED ]] && echo 'DID NOT PASS THE REQUIRED TEST' && exit 1 -} \ No newline at end of file +} diff --git a/packages/omgx/immutability/test/smoke.ovm.sh b/packages/omgx/immutability/test/smoke.ovm.sh new file mode 100755 index 000000000000..935a5418fbe7 --- /dev/null +++ b/packages/omgx/immutability/test/smoke.ovm.sh @@ -0,0 +1,86 @@ +#!/bin/bash + + +function banner { + echo "------------------------------------------------------------------------------------------------------------------------------------" +} +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" + +source $DIR/smoke.env.sh +OVM="OVM-wallet" +node index.js $SEQUENCER_ADDRESS +node index.js $PROPOSER_ADDRESS +banner +echo "CONFIGURE MOUNT" +echo "vault write -format=json immutability-eth-plugin/config rpc_url='$RPC_URL' chain_id='$CHAIN_ID' rpc_l2_url='$RPC_L2_URL' chain_l2_id='$CHAIN_L2_ID'" +vault write -format=json immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" +check_result $? 0 +banner +#vault write -output-curl-string immutability-eth-plugin/config rpc_url="$RPC_URL" chain_id="$CHAIN_ID" rpc_l2_url="$RPC_L2_URL" chain_l2_id="$CHAIN_L2_ID" + +# banner +# echo "CREATE WALLET WITH MNEMONIC" +# echo "vault write -format=json immutability-eth-plugin/wallets/$OVM mnemonic='$MNEMONIC'" +# vault write -format=json immutability-eth-plugin/wallets/$OVM mnemonic="$MNEMONIC" +# check_result $? 0 +# banner +# #vault write -output-curl-string immutability-eth-plugin/wallets/$OVM mnemonic="$MNEMONIC" + +# banner +# echo "CREATE UNAUTHORIZED ACCOUNT IN WALLET" +# echo "vault write -format=json -f immutability-eth-plugin/wallets/$OVM/accounts" +# UNAUTHORIZED=$(vault write -f -field=address immutability-eth-plugin/wallets/$OVM/accounts) +# check_result $? 0 +# echo "UNAUTHORIZED=$UNAUTHORIZED" +# banner +# #vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts +# banner + +# this is a POLICY test +# banner +# banner +# banner +# echo "Append Sequencer Batch tests" +# echo "*** SHOULD FAIL! ***" +# echo "UNAUTHORIZED SUBMISSION OF AppendSequencerBatch BY $UNAUTHORIZED" +# echo "vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendSequencerBatch should_start_at_element=10 total_elements_to_append=1 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 1, \"timestamp\": 100, \"block_number\": 200}" transactions="0x45423400000011" transactions="0x45423400000012" nonce=0 gas_price=$GAS_PRICE_HIGH contract=$OVM_CTC" +# vault write -format=json immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendSequencerBatch should_start_at_element=10 total_elements_to_append=1 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 1, \"timestamp\": 100, \"block_number\": 200}" transactions="0x45423400000011" transactions="0x45423400000012" nonce=0 gas_price=$GAS_PRICE_HIGH contract=$OVM_CTC +# check_result $? 2 +# banner +# vault write -output-curl-string immutability-eth-plugin/wallets/$OVM/accounts/$UNAUTHORIZED/ovm/appendSequencerBatch should_start_at_element=10 total_elements_to_append=1 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 1, \"timestamp\": 100, \"block_number\": 200}" transactions="0x45423400000011" transactions="0x45423400000012" nonce=0 gas_price=$GAS_PRICE_HIGH contract=$OVM_CTC + +banner +banner +banner +echo "Append Sequencer Batch tests" +echo "*** SHOULD NOT FAIL! ***" +echo "AUTHORIZED SUBMISSION OF AppendSequencerBatch BY $SEQUENCER_ADDRESS" +#GetNextQueueIndex 0x7a167a8a +GET_NEXT_QUEUE_INDEX=$(curl $RPC_URL -X POST --data '{"jsonrpc":"2.0", "method":"eth_call", "params":[{"to": "'"$OVM_CTC"'", "data": "0x7a167a8a"}], "id":1}' | jq .result | sed 's/0x//' | tr -d '"') +#GetQueueElement 0x2a7f18be +GET_QUEUE_ELEMENT=$(curl $RPC_URL -X POST --data '{"jsonrpc":"2.0", "method":"eth_call", "params":[{"to": "'"$OVM_CTC"'", "data": "0x2a7f18be'"$GET_NEXT_QUEUE_INDEX"'"}], "id":1}' | jq .result | tr -d '"') +#getTotalElements 0x7aa63a86 +SHOULD_START_AT_ELEMENT=$(($(curl $RPC_URL -X POST --data '{"jsonrpc":"2.0", "method":"eth_call", "params":[{"to": "'"$OVM_CTC"'", "data": "0x7aa63a86"}], "id":1}' | jq .result | tr -d '"'))) +TIMESTAMP=$(($(echo $GET_QUEUE_ELEMENT | cut -c67-130 | (echo -n 0x && cat)))) +BLOCKNUMBER=$(($(echo $GET_QUEUE_ELEMENT | cut -c131-194 | (echo -n 0x && cat)))) +echo $TIMESTAMP +echo $BLOCKNUMBER +echo "vault write -format=json immutability-eth-plugin/wallets/sequencer/accounts/$SEQUENCER_ADDRESS/ovm/appendSequencerBatch should_start_at_element=$SHOULD_START_AT_ELEMENT total_elements_to_append=2 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 0, \"timestamp\": $TIMESTAMP, \"block_number\": $BLOCKNUMBER}" transactions="0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" transactions="0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" nonce=0 gas_price=$GAS_PRICE_HIGH2 contract=$OVM_CTC" +vault write -format=json immutability-eth-plugin/wallets/sequencer/accounts/$SEQUENCER_ADDRESS/ovm/appendSequencerBatch should_start_at_element=$SHOULD_START_AT_ELEMENT total_elements_to_append=2 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 0, \"timestamp\": $TIMESTAMP, \"block_number\": $BLOCKNUMBER}" transactions="0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" transactions="0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" nonce=0 gas_price=$GAS_PRICE_HIGH2 contract=$OVM_CTC +check_result $? 0 +banner +vault write -output-curl-string immutability-eth-plugin/wallets/sequencer/accounts/$SEQUENCER_ADDRESS/ovm/appendSequencerBatch should_start_at_element=$SHOULD_START_AT_ELEMENT total_elements_to_append=2 contexts="{\"num_sequenced_transactions\": 2, \"num_subsequent_queue_transactions\": 0, \"timestamp\": $TIMESTAMP, \"block_number\": $BLOCKNUMBER}" transactions="0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" transactions="0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" nonce=0 gas_price=$GAS_PRICE_HIGH2 contract=$OVM_CTC + + +banner +banner +banner +#getTotalElements 0x7aa63a86 +SHOULD_START_AT_ELEMENT=$(($(curl $RPC_URL -X POST --data '{"jsonrpc":"2.0", "method":"eth_call", "params":[{"to": "'"$OVM_SCC"'", "data": "0x7aa63a86"}], "id":1}' | jq .result | tr -d '"'))) +echo "Append State Batch tests" +echo "*** SHOULD NOT FAIL! ***" +echo "vault write -format=json immutability-eth-plugin/wallets/proposer/accounts/$PROPOSER_ADDRESS/ovm/appendStateBatch batch="0x1111111111111111111111111111111111111111111111111111111111111111" batch="0x1111111111111111111111111111111111111111111111111111111111111111" should_start_at_element=$SHOULD_START_AT_ELEMENT nonce=0 gas_price=$GAS_PRICE_HIGH contract=$OVM_SCC" +vault write -format=json immutability-eth-plugin/wallets/proposer/accounts/$PROPOSER_ADDRESS/ovm/appendStateBatch batch="0x1111111111111111111111111111111111111111111111111111111111111111" batch="0x1111111111111111111111111111111111111111111111111111111111111111" should_start_at_element=$SHOULD_START_AT_ELEMENT nonce=0 gas_price=$GAS_PRICE_HIGH contract=$OVM_SCC +check_result $? 0 +banner +vault write -output-curl-string immutability-eth-plugin/wallets/proposer/accounts/$PROPOSER_ADDRESS/ovm/appendStateBatch nonce=0 gas_price=$GAS_PRICE_HIGH batch="0x1111111111111111111111111111111111111111111111111111111111111111" batch="0x1111111111111111111111111111111111111111111111111111111111111111" should_start_at_element=$SHOULD_START_AT_ELEMENT contract=$OVM_SCC diff --git a/packages/omgx/immutability/scripts/smoke.wallet.sh b/packages/omgx/immutability/test/smoke.wallet.sh similarity index 83% rename from packages/omgx/immutability/scripts/smoke.wallet.sh rename to packages/omgx/immutability/test/smoke.wallet.sh index 5a7b7255bd96..4dd09b42e65b 100755 --- a/packages/omgx/immutability/scripts/smoke.wallet.sh +++ b/packages/omgx/immutability/test/smoke.wallet.sh @@ -1,10 +1,12 @@ -#!/bin/sh +#!/bin/bash function banner { echo "------------------------------------------------------------------------------------------------------------------------------------" } -source /vault/scripts/smoke.env.sh +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" + +source $DIR/smoke.env.sh banner echo "CONFIGURE MOUNT" @@ -68,21 +70,25 @@ echo "vault write -format=json -f immutability-eth-plugin/wallets/test-wallet-2/ ACCOUNT0=$(vault write -f -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts) banner vault write -format=json -f -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts +echo "Funding $ACCOUNT0" +node index.js $ACCOUNT0 banner echo "CREATE SECOND NEW ACCOUNT IN WALLET" echo "vault write -format=json immutability-eth-plugin/wallets/test-wallet-2/accounts" ACCOUNT1=$(vault write -f -field=address immutability-eth-plugin/wallets/test-wallet-2/accounts) +check_result $? 0 banner vault write -output-curl-string -f immutability-eth-plugin/wallets/test-wallet-2/accounts banner -echo "TRANSFER FUNDS FROM $ACCOUNT0 TO $ACCOUNT1" +#TODO need to fund these accounts first +echo "TRANSFER FUNDS FROM $ACCOUNT0 TO $ACCOUNT1" echo "vault write -format=json immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT1 amount=$FUNDING_AMOUNT" vault write -format=json immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT1 amount=$FUNDING_AMOUNT check_result $? 0 banner -vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT1 amount=$FUNDING_AMOUNT +# vault write -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts/$ACCOUNT0/debit to=$ACCOUNT1 amount=$FUNDING_AMOUNT banner echo "CREATE TEMPORARY NEW ACCOUNT IN WALLET" @@ -91,3 +97,11 @@ TEMP_ACCOUNT=$(vault write -f -field=address immutability-eth-plugin/wallets/tes check_result $? 0 banner vault write -output-curl-string -f immutability-eth-plugin/wallets/test-wallet-2/accounts + +banner +echo "LIST ALL ACCOUNTS IN WALLET" +echo "vault list -format=json immutability-eth-plugin/wallets/test-wallet-2/accounts" +vault list immutability-eth-plugin/wallets/test-wallet-2/accounts +check_result $? 0 +banner +vault list -output-curl-string immutability-eth-plugin/wallets/test-wallet-2/accounts \ No newline at end of file diff --git a/packages/omgx/immutability/util/helper.go b/packages/omgx/immutability/util/helper.go index 774a8af02e0e..77cbc6e924f1 100644 --- a/packages/omgx/immutability/util/helper.go +++ b/packages/omgx/immutability/util/helper.go @@ -30,11 +30,6 @@ import ( "github.com/pborman/uuid" "golang.org/x/crypto/scrypt" - "github.com/ethereum/go-ethereum" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/hashicorp/vault/sdk/framework" "github.com/hashicorp/vault/sdk/logical" ) @@ -145,29 +140,6 @@ func ZeroKey(k *ecdsa.PrivateKey) { } } -// EstimateGas attempts to determine the cost for a contract deploy... super annoying -func EstimateGas(opts *bind.TransactOpts, abi abi.ABI, bytecode []byte, backend bind.ContractBackend, params ...interface{}) (uint64, error) { - var input []byte - packed, err := abi.Pack("", params...) - if err != nil { - return 0, fmt.Errorf("failed to pack parameters: %v", err) - } - input = append(bytecode, packed...) - msg := ethereum.CallMsg{From: opts.From, To: nil, Value: opts.Value, Data: input} - gasLimit, err := backend.EstimateGas(ensureContext(opts.Context), msg) - if err != nil { - return 0, fmt.Errorf("failed to estimate gas needed: %v", err) - } - return gasLimit, nil -} - -func ensureContext(ctx context.Context) context.Context { - if ctx == nil { - return context.TODO() - } - return ctx -} - type cipherparamsJSON struct { IV string `json:"iv"` }