diff --git a/.circleci/config.yml b/.circleci/config.yml
index 53ac6bce0..4e9ab435e 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,11 +1,13 @@
version: 2.1
orbs:
aws-cli: circleci/aws-cli@1.3.2
+ docker: circleci/docker@2.1.4
executors:
golang:
docker:
- - image: cimg/go:1.18.1
+ # Must match GO_VERSION_MIN in project root
+ - image: cimg/go:1.18.8
resource_class: 2xlarge
ubuntu:
docker:
@@ -22,11 +24,6 @@ executors:
commands:
- install-deps:
- steps:
- - run: |
- sudo apt update
- sudo apt install python-is-python3
prepare:
parameters:
linux:
@@ -40,19 +37,29 @@ commands:
steps:
- checkout
- git_fetch_all_tags
- - checkout
- when:
- condition: << parameters.linux >>
+ condition: <>
steps:
+ - run:
+ name: Check Go Version
+ command: |
+ v=`go version | { read _ _ v _; echo ${v#go}; }`
+ if [[ $v != `cat GO_VERSION_MIN` ]]; then
+ echo "GO_VERSION_MIN file does not match the go version being used."
+ echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v."
+ exit 1
+ fi
- run: sudo apt-get update
- run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev
+ - run: sudo apt-get install python-is-python3
+
- when:
condition: <>
steps:
- run:
name: Install Go
command: |
- curl https://dl.google.com/go/go1.18.1.darwin-amd64.pkg -o /tmp/go.pkg && \
+ curl https://dl.google.com/go/go`cat GO_VERSION_MIN`.darwin-amd64.pkg -o /tmp/go.pkg && \
sudo installer -pkg /tmp/go.pkg -target /
- run:
name: Export Go
@@ -60,21 +67,12 @@ commands:
echo 'export GOPATH="${HOME}/go"' >> $BASH_ENV
- run: go version
- run:
- name: Install pkg-config, goreleaser, and sha512sum
- command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config goreleaser/tap/goreleaser coreutils
+ name: Install dependencies with Homebrew
+ command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config coreutils jq hwloc
- run:
name: Install Rust
command: |
curl https://sh.rustup.rs -sSf | sh -s -- -y
- - run:
- name: Install hwloc
- command: |
- mkdir ~/hwloc
- curl --location https://download.open-mpi.org/release/hwloc/v2.4/hwloc-2.4.1.tar.gz --output ~/hwloc/hwloc-2.4.1.tar.gz
- cd ~/hwloc
- tar -xvzpf hwloc-2.4.1.tar.gz
- cd hwloc-2.4.1
- ./configure && make && sudo make install
- run: git submodule sync
- run: git submodule update --init
download-params:
@@ -94,28 +92,13 @@ commands:
install_ipfs:
steps:
- run: |
- apt update
- apt install -y wget
- wget https://github.com/ipfs/go-ipfs/releases/download/v0.12.2/go-ipfs_v0.12.2_linux-amd64.tar.gz
- wget https://github.com/ipfs/go-ipfs/releases/download/v0.12.2/go-ipfs_v0.12.2_linux-amd64.tar.gz.sha512
- if [ "$(sha512sum go-ipfs_v0.12.2_linux-amd64.tar.gz)" != "$(cat go-ipfs_v0.12.2_linux-amd64.tar.gz.sha512)" ]
- then
- echo "ipfs failed checksum check"
- exit 1
- fi
- tar -xf go-ipfs_v0.12.2_linux-amd64.tar.gz
- mv go-ipfs/ipfs /usr/local/bin/ipfs
- chmod +x /usr/local/bin/ipfs
- install_ipfs_macos:
- steps:
- - run: |
- curl -O https://dist.ipfs.io/kubo/v0.14.0/kubo_v0.14.0_darwin-amd64.tar.gz
- tar -xvzf kubo_v0.14.0_darwin-amd64.tar.gz
+ curl -O https://dist.ipfs.tech/kubo/v0.16.0/kubo_v0.16.0_linux-amd64.tar.gz
+ tar -xvzf kubo_v0.16.0_linux-amd64.tar.gz
pushd kubo
sudo bash install.sh
popd
- rm -rf kubo/
- rm kubo_v0.14.0_darwin-amd64.tar.gz
+ rm -rf kubo
+ rm kubo_v0.16.0_linux-amd64.tar.gz
git_fetch_all_tags:
steps:
- run:
@@ -140,13 +123,12 @@ commands:
- run:
name: "Run a packer build"
command: packer build << parameters.args >> << parameters.template >>
- no_output_timeout: 30m
+ no_output_timeout: 1h
jobs:
mod-tidy-check:
executor: golang
steps:
- - install-deps
- prepare
- run: go mod tidy -v
- run:
@@ -154,37 +136,6 @@ jobs:
command: |
git --no-pager diff go.mod go.sum
git --no-pager diff --quiet go.mod go.sum
- build-linux:
- executor: golang
- steps:
- - install-deps
- - prepare
- - run: sudo apt-get update
- - run: sudo apt-get install npm
- - run:
- command: make buildall
- - run:
- name: check tag and version output match
- command: ./scripts/version-check.sh ./lotus
- - store_artifacts:
- path: lotus
- - store_artifacts:
- path: lotus-miner
- - store_artifacts:
- path: lotus-worker
- - run: mkdir linux && mv lotus lotus-miner lotus-worker linux/
- - persist_to_workspace:
- root: "."
- paths:
- - linux
-
- build-debug:
- executor: golang
- steps:
- - install-deps
- - prepare
- - run:
- command: make debug
test:
description: |
@@ -214,7 +165,6 @@ jobs:
description: gotestsum format. https://github.com/gotestyourself/gotestsum#format
executor: << parameters.executor >>
steps:
- - install-deps
- prepare
- run:
command: make deps lotus
@@ -258,7 +208,6 @@ jobs:
submodule is used.
executor: << parameters.executor >>
steps:
- - install-deps
- prepare
- run:
command: make deps lotus
@@ -301,121 +250,104 @@ jobs:
path: /tmp/test-reports
- store_artifacts:
path: /tmp/test-artifacts/conformance-coverage.html
- build-ntwk-calibration:
- description: |
- Compile lotus binaries for the calibration network
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
+
+ build-linux-amd64:
+ executor: golang
steps:
- - install-deps
- prepare
- - run: make calibnet
- - run: mkdir linux-calibrationnet && mv lotus lotus-miner lotus-worker linux-calibrationnet
+ - run: make lotus lotus-miner lotus-worker
+ - run:
+ name: check tag and version output match
+ command: ./scripts/version-check.sh ./lotus
+ - run: |
+ mkdir -p /tmp/workspace/linux_amd64_v1 && \
+ mv lotus lotus-miner lotus-worker /tmp/workspace/linux_amd64_v1/
- persist_to_workspace:
- root: "."
+ root: /tmp/workspace
paths:
- - linux-calibrationnet
- build-ntwk-butterfly:
- description: |
- Compile lotus binaries for the butterfly network
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
- steps:
- - install-deps
- - prepare
- - run: make butterflynet
- - run: mkdir linux-butterflynet && mv lotus lotus-miner lotus-worker linux-butterflynet
- - persist_to_workspace:
- root: "."
- paths:
- - linux-butterflynet
- build-lotus-soup:
- description: |
- Compile `lotus-soup` Testground test plan
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
- steps:
- - install-deps
- - prepare
- - run: cd extern/filecoin-ffi && make
- - run:
- name: "go get lotus@master"
- command: cd testplans/lotus-soup && go mod edit -replace=github.com/filecoin-project/lotus=../.. && go mod tidy
- - run:
- name: "build lotus-soup testplan"
- command: pushd testplans/lotus-soup && go build -tags=testground .
- trigger-testplans:
- description: |
- Trigger `lotus-soup` test cases on TaaS
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
- steps:
- - install-deps
- - prepare
- - run:
- name: "download testground"
- command: wget https://gist.github.com/nonsense/5fbf3167cac79945f658771aed32fc44/raw/2e17eb0debf7ec6bdf027c1bdafc2c92dd97273b/testground-d3e9603 -O ~/testground-cli && chmod +x ~/testground-cli
- - run:
- name: "prepare .env.toml"
- command: pushd testplans/lotus-soup && mkdir -p $HOME/testground && cp env-ci.toml $HOME/testground/.env.toml && echo 'endpoint="https://ci.testground.ipfs.team"' >> $HOME/testground/.env.toml && echo 'user="circleci"' >> $HOME/testground/.env.toml
- - run:
- name: "prepare testground home dir and link test plans"
- command: mkdir -p $HOME/testground/plans && ln -s $(pwd)/testplans/lotus-soup $HOME/testground/plans/lotus-soup
- - run:
- name: "go get lotus@master"
- command: cd testplans/lotus-soup && go get github.com/filecoin-project/lotus@master
- - run:
- name: "trigger deals baseline testplan on taas"
- command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/baseline-k8s-3-1.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH
- - run:
- name: "trigger payment channel stress testplan on taas"
- command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/paych-stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH
- build-macos:
+ - linux_amd64_v1
+
+ build-darwin-amd64:
description: build darwin lotus binary
- parameters:
- publish:
- default: false
- description: publish github release and homebrew?
- type: boolean
+ working_directory: ~/go/src/github.com/filecoin-project/lotus
macos:
xcode: "13.4.1"
- working_directory: ~/go/src/github.com/filecoin-project/lotus
steps:
- prepare:
linux: false
darwin: true
- - install_ipfs_macos
- - restore_cache:
- name: restore cargo cache
- key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }}
+ - run: make lotus lotus-miner lotus-worker
+ - run:
+ name: check tag and version output match
+ command: ./scripts/version-check.sh ./lotus
+ - run: |
+ mkdir -p /tmp/workspace/darwin_amd64_v1 && \
+ mv lotus lotus-miner lotus-worker /tmp/workspace/darwin_amd64_v1/
+ - persist_to_workspace:
+ root: /tmp/workspace
+ paths:
+ - darwin_amd64_v1
+
+ build-darwin-arm64:
+ description: self-hosted m1 runner
+ working_directory: ~/go/src/github.com/filecoin-project/lotus
+ machine: true
+ resource_class: filecoin-project/self-hosted-m1
+ steps:
+ - run: echo 'export PATH=/opt/homebrew/bin:"$PATH"' >> "$BASH_ENV"
+ - prepare:
+ linux: false
+ darwin: true
+ - run: |
+ export CPATH=$(brew --prefix)/include
+ export LIBRARY_PATH=$(brew --prefix)/lib
+ make lotus lotus-miner lotus-worker
+ - run:
+ name: check tag and version output match
+ command: ./scripts/version-check.sh ./lotus
+ - run: |
+ mkdir -p /tmp/workspace/darwin_arm64 && \
+ mv lotus lotus-miner lotus-worker /tmp/workspace/darwin_arm64/
+ - persist_to_workspace:
+ root: /tmp/workspace
+ paths:
+ - darwin_arm64
+ - run:
+ command: make clean
+ when: always
+ - run:
+ name: cleanup homebrew
+ command: HOMEBREW_NO_AUTO_UPDATE=1 brew uninstall pkg-config coreutils jq hwloc
+ when: always
+
+ release:
+ executor: golang
+ parameters:
+ dry-run:
+ default: false
+ description: should this release actually publish it's artifacts?
+ type: boolean
+ steps:
+ - checkout
+ - run: |
+ echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | sudo tee /etc/apt/sources.list.d/goreleaser.list
+ sudo apt update
+ sudo apt install goreleaser-pro
+ - install_ipfs
+ - attach_workspace:
+ at: /tmp/workspace
- when:
- condition: << parameters.publish >>
+ condition: << parameters.dry-run >>
steps:
- - run: goreleaser release --rm-dist
+ - run: goreleaser release --rm-dist --snapshot --debug
- run: ./scripts/generate-checksums.sh
- - run: ./scripts/publish-checksums.sh
- when:
condition:
- not: << parameters.publish >>
+ not: << parameters.dry-run >>
steps:
- - run: goreleaser release --rm-dist --snapshot
+ - run: goreleaser release --rm-dist --debug
- run: ./scripts/generate-checksums.sh
- - store_artifacts:
- path: dist
- - persist_to_workspace:
- root: "."
- paths:
- - dist
- - save_cache:
- name: save cargo cache
- key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }}
- paths:
- - "~/.rustup"
- - "~/.cargo"
+ - run: ./scripts/publish-checksums.sh
build-appimage:
machine:
@@ -423,7 +355,14 @@ jobs:
steps:
- checkout
- attach_workspace:
- at: "."
+ at: /tmp/workspace
+ - run:
+ name: Update Go
+ command: |
+ sudo rm -rf /usr/local/go && \
+ curl -L https://golang.org/dl/go`cat GO_VERSION_MIN`.linux-amd64.tar.gz -o /tmp/go.tar.gz && \
+ sudo tar -C /usr/local -xvf /tmp/go.tar.gz
+ - run: go version
- run:
name: install appimage-builder
command: |
@@ -451,13 +390,11 @@ jobs:
command: |
sed -i "s/version: latest/version: ${CIRCLE_TAG:-latest}/" AppImageBuilder.yml
make appimage
- - run:
- name: prepare workspace
- command: |
- mkdir appimage
- mv Lotus-*.AppImage appimage
+ - run: |
+ mkdir -p /tmp/workspace/appimage && \
+ mv Lotus-*.AppImage /tmp/workspace/appimage/
- persist_to_workspace:
- root: "."
+ root: /tmp/workspace
paths:
- appimage
@@ -465,7 +402,6 @@ jobs:
gofmt:
executor: golang
steps:
- - install-deps
- prepare
- run:
command: "! go fmt ./... 2>&1 | read"
@@ -473,7 +409,6 @@ jobs:
gen-check:
executor: golang
steps:
- - install-deps
- prepare
- run: make deps
- run: go install golang.org/x/tools/cmd/goimports
@@ -488,7 +423,6 @@ jobs:
docs-check:
executor: golang
steps:
- - install-deps
- prepare
- run: go install golang.org/x/tools/cmd/goimports
- run: zcat build/openrpc/full.json.gz | jq > ../pre-openrpc-full
@@ -525,7 +459,6 @@ jobs:
Arguments to pass to golangci-lint
executor: << parameters.executor >>
steps:
- - install-deps
- prepare
- run:
command: make deps
@@ -553,13 +486,13 @@ jobs:
steps:
- run:
name: Install git jq curl
- command: apt update && apt install -y git jq curl
+ command: apt update && apt install -y git jq curl sudo
- checkout
- git_fetch_all_tags
- checkout
- install_ipfs
- attach_workspace:
- at: "."
+ at: /tmp/workspace
- when:
condition: << parameters.linux >>
steps:
@@ -604,129 +537,100 @@ jobs:
shell: /bin/bash -o pipefail
command: |
snapcraft upload *.snap --release << parameters.channel >>
-
- build-and-push-image:
- description: build and push docker images to public AWS ECR registry
- executor: aws-cli/default
+ build-docker:
+ description: >
+ Publish to Dockerhub
+ executor: docker/docker
parameters:
- profile-name:
+ image:
type: string
- default: "default"
- description: AWS profile name to be configured.
-
- aws-access-key-id:
- type: env_var_name
- default: AWS_ACCESS_KEY_ID
+ default: lotus
description: >
- AWS access key id for IAM role. Set this to the name of
- the environment variable you will set to hold this
- value, i.e. AWS_ACCESS_KEY.
-
- aws-secret-access-key:
- type: env_var_name
- default: AWS_SECRET_ACCESS_KEY
- description: >
- AWS secret key for IAM role. Set this to the name of
- the environment variable you will set to hold this
- value, i.e. AWS_SECRET_ACCESS_KEY.
-
- region:
- type: env_var_name
- default: AWS_REGION
- description: >
- Name of env var storing your AWS region information,
- defaults to AWS_REGION
-
- account-url:
- type: env_var_name
- default: AWS_ECR_ACCOUNT_URL
- description: >
- Env var storing Amazon ECR account URL that maps to an AWS account,
- e.g. {awsAccountNum}.dkr.ecr.us-west-2.amazonaws.com
- defaults to AWS_ECR_ACCOUNT_URL
-
- dockerfile:
+ Passed to the docker build process to determine which image in the
+ Dockerfile should be built. Expected values are `lotus`,
+ `lotus-all-in-one`
+ network:
type: string
- default: Dockerfile
- description: Name of dockerfile to use. Defaults to Dockerfile.
-
- path:
- type: string
- default: .
- description: Path to the directory containing your Dockerfile and build context. Defaults to . (working directory).
-
- extra-build-args:
+ default: "mainnet"
+ description: >
+ Passed to the docker build process using GOFLAGS+=-tags=<>.
+ Expected values are `debug`, `2k`, `calibnet`, `butterflynet`,
+ `interopnet`.
+ channel:
type: string
default: ""
description: >
- Extra flags to pass to docker build. For examples, see
- https://docs.docker.com/engine/reference/commandline/build
-
- repo:
- type: string
- description: Name of an Amazon ECR repository
-
- tag:
- type: string
- default: "latest"
- description: A comma-separated string containing docker image tags to build and push (default = latest)
-
- target:
- type: string
- default: "lotus-all-in-one"
- description: Docker target to build
-
+ The release channel to use for this image.
+ push:
+ type: boolean
+ default: false
+ description: >
+ When true, pushes the image to Dockerhub
steps:
- - run:
- name: Confirm that environment variables are set
- command: |
- if [ -z "$AWS_ACCESS_KEY_ID" ]; then
- echo "No AWS_ACCESS_KEY_ID is set. Skipping build-and-push job ..."
- circleci-agent step halt
- fi
-
- - aws-cli/setup:
- profile-name: <>
- aws-access-key-id: <>
- aws-secret-access-key: <>
- aws-region: <>
-
- - run:
- name: Log into Amazon ECR
- command: |
- aws ecr-public get-login-password --region $<> --profile <> | docker login --username AWS --password-stdin $<>
-
+ - setup_remote_docker
- checkout
-
- - setup_remote_docker:
- version: 19.03.13
- docker_layer_caching: false
-
- - run:
- name: Build docker image
- command: |
- registry_id=$(echo $<> | sed "s;\..*;;g")
-
- docker_tag_args=""
- IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
- for tag in "${DOCKER_TAGS[@]}"; do
- docker_tag_args="$docker_tag_args -t $<>/<>:$tag"
- done
-
- docker build \
- <<#parameters.extra-build-args>><><> \
- --target <> \
- -f <>/<> \
- $docker_tag_args \
- <>
-
- - run:
- name: Push image to Amazon ECR
- command: |
- IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
- for tag in "${DOCKER_TAGS[@]}"; do
- docker push $<>/<>:${tag}
- done
+ - docker/check:
+ docker-username: DOCKERHUB_USERNAME
+ docker-password: DOCKERHUB_PASSWORD
+ - when:
+ condition:
+ equal: [ mainnet, <> ]
+ steps:
+ - when:
+ condition: >
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <>
+ tag: <>
+ - run:
+ name: Docker push
+ command: |
+ docker push filecoin/<>:<>
+ if [[ ! -z $CIRCLE_SHA ]]; then
+ docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA}"
+ docker push filecoin/<>:"${CIRCLE_SHA}"
+ fi
+ if [[ ! -z $CIRCLE_TAG ]]; then
+ docker image tag filecoin/<>:<> filecoin/<>:"${CIRCLE_TAG}"
+ docker push filecoin/<>:"${CIRCLE_TAG}"
+ fi
+ - unless:
+ condition: <>
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <>
+ - when:
+ condition:
+ not:
+ equal: [ mainnet, <> ]
+ steps:
+ - when:
+ condition: <>
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <> --build-arg GOFLAGS=-tags=<>
+ tag: <>-<>
+ - run:
+ name: Docker push
+ command: |
+ docker push filecoin/<>:<>-<>
+ if [[ ! -z $CIRCLE_SHA ]]; then
+ docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA}"-<>
+ docker push filecoin/<>:"${CIRCLE_SHA}"-<>
+ fi
+ if [[ ! -z $CIRCLE_TAG ]]; then
+ docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_TAG}"-<>
+ docker push filecoin/<>:"${CIRCLE_TAG}"-<>
+ fi
+ - unless:
+ condition: <>
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <> --build-arg GOFLAGS=-tags=<>
publish-packer-snap:
description: build packer image with snap. mainnet only.
@@ -734,55 +638,8 @@ jobs:
name: packer
steps:
- checkout
- - attach_workspace:
- at: "."
- packer_build:
template: tools/packer/lotus-snap.pkr.hcl
- publish-dockerhub:
- description: publish to dockerhub
- machine:
- image: ubuntu-2004:202010-01
- parameters:
- tag:
- type: string
- default: latest
- steps:
- - checkout
- - run:
- name: dockerhub login
- command: echo $DOCKERHUB_PASSWORD | docker login --username $DOCKERHUB_USERNAME --password-stdin
- - run:
- name: docker build
- command: |
- docker build --target lotus -t filecoin/lotus:<< parameters.tag >> -f Dockerfile.lotus .
- docker build --target lotus-gateway -t filecoin/lotus-gateway:<< parameters.tag >> -f Dockerfile.lotus .
- docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:<< parameters.tag >> -f Dockerfile.lotus .
- if [[ ! -z $CIRCLE_SHA1 ]]; then
- docker build --target lotus -t filecoin/lotus:$CIRCLE_SHA1 -f Dockerfile.lotus .
- docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_SHA1 -f Dockerfile.lotus .
- docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_SHA1 -f Dockerfile.lotus .
- fi
- if [[ ! -z $CIRCLE_TAG ]]; then
- docker build --target lotus -t filecoin/lotus:$CIRCLE_TAG -f Dockerfile.lotus .
- docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_TAG -f Dockerfile.lotus .
- docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_TAG -f Dockerfile.lotus .
- fi
- - run:
- name: docker push
- command: |
- docker push filecoin/lotus:<< parameters.tag >>
- docker push filecoin/lotus-gateway:<< parameters.tag >>
- docker push filecoin/lotus-all-in-one:<< parameters.tag >>
- if [[ ! -z $CIRCLE_SHA1 ]]; then
- docker push filecoin/lotus:$CIRCLE_SHA1
- docker push filecoin/lotus-gateway:$CIRCLE_SHA1
- docker push filecoin/lotus-all-in-one:$CIRCLE_SHA1
- fi
- if [[ ! -z $CIRCLE_TAG ]]; then
- docker push filecoin/lotus:$CIRCLE_TAG
- docker push filecoin/lotus-gateway:$CIRCLE_TAG
- docker push filecoin/lotus-all-in-one:$CIRCLE_TAG
- fi
workflows:
version: 2.1
@@ -879,6 +736,11 @@ workflows:
suite: itest-deals_publish
target: "./itests/deals_publish_test.go"
+ - test:
+ name: test-itest-deals_remote_retrieval
+ suite: itest-deals_remote_retrieval
+ target: "./itests/deals_remote_retrieval_test.go"
+
- test:
name: test-itest-deals_retry_deal_no_funds
suite: itest-deals_retry_deal_no_funds
@@ -924,6 +786,21 @@ workflows:
suite: itest-mempool
target: "./itests/mempool_test.go"
+ - test:
+ name: test-itest-migration_nv17
+ suite: itest-migration_nv17
+ target: "./itests/migration_nv17_test.go"
+
+ - test:
+ name: test-itest-mpool_msg_uuid
+ suite: itest-mpool_msg_uuid
+ target: "./itests/mpool_msg_uuid_test.go"
+
+ - test:
+ name: test-itest-mpool_push_with_uuid
+ suite: itest-mpool_push_with_uuid
+ target: "./itests/mpool_push_with_uuid_test.go"
+
- test:
name: test-itest-multisig
suite: itest-multisig
@@ -959,6 +836,21 @@ workflows:
suite: itest-paych_cli
target: "./itests/paych_cli_test.go"
+ - test:
+ name: test-itest-pending_deal_allocation
+ suite: itest-pending_deal_allocation
+ target: "./itests/pending_deal_allocation_test.go"
+
+ - test:
+ name: test-itest-raft_messagesigner
+ suite: itest-raft_messagesigner
+ target: "./itests/raft_messagesigner_test.go"
+
+ - test:
+ name: test-itest-remove_verifreg_datacap
+ suite: itest-remove_verifreg_datacap
+ target: "./itests/remove_verifreg_datacap_test.go"
+
- test:
name: test-itest-sdr_upgrade
suite: itest-sdr_upgrade
@@ -969,6 +861,16 @@ workflows:
suite: itest-sector_finalize_early
target: "./itests/sector_finalize_early_test.go"
+ - test:
+ name: test-itest-sector_import_full
+ suite: itest-sector_import_full
+ target: "./itests/sector_import_full_test.go"
+
+ - test:
+ name: test-itest-sector_import_simple
+ suite: itest-sector_import_simple
+ target: "./itests/sector_import_simple_test.go"
+
- test:
name: test-itest-sector_make_cc_avail
suite: itest-sector_make_cc_avail
@@ -1004,6 +906,11 @@ workflows:
suite: itest-sector_terminate
target: "./itests/sector_terminate_test.go"
+ - test:
+ name: test-itest-sector_unseal
+ suite: itest-sector_unseal
+ target: "./itests/sector_unseal_test.go"
+
- test:
name: test-itest-self_sent_txn
suite: itest-self_sent_txn
@@ -1054,6 +961,11 @@ workflows:
suite: itest-worker
target: "./itests/worker_test.go"
+ - test:
+ name: test-itest-worker_upgrade
+ suite: itest-worker_upgrade
+ target: "./itests/worker_upgrade_test.go"
+
- test:
name: test-unit-cli
suite: utest-unit-cli
@@ -1083,31 +995,42 @@ workflows:
suite: conformance-bleeding-edge
target: "./conformance"
vectors-branch: specs-actors-v7
- - trigger-testplans:
+
+ release:
+ jobs:
+ - build-linux-amd64:
+ name: "Build ( linux / amd64 )"
filters:
branches:
only:
- - master
- - build-debug
- - build-linux:
- filters:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-ntwk-calibration:
+ - build-darwin-amd64:
+ name: "Build ( darwin / amd64 )"
filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-ntwk-butterfly:
+ - build-darwin-arm64:
+ name: "Build ( darwin / arm64 )"
filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-lotus-soup
- - build-macos:
- name: publish-macos
- publish: true
+ - release:
+ name: "Release"
+ requires:
+ - "Build ( darwin / amd64 )"
+ - "Build ( linux / amd64 )"
+ - "Build ( darwin / arm64 )"
filters:
branches:
ignore:
@@ -1115,12 +1038,19 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-macos:
+ - release:
+ name: "Release (dry-run)"
+ dry-run: true
+ requires:
+ - "Build ( darwin / amd64 )"
+ - "Build ( linux / amd64 )"
+ - "Build ( darwin / arm64 )"
filters:
branches:
only:
- /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
- build-appimage:
+ name: "Build AppImage"
filters:
branches:
only:
@@ -1129,22 +1059,10 @@ workflows:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- publish:
- name: publish-linux
- linux: true
- requires:
- - build-linux
- filters:
- branches:
- ignore:
- - /.*/
- tags:
- only:
- - /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - publish:
- name: publish-appimage
+ name: "Publish AppImage"
appimage: true
requires:
- - build-appimage
+ - "Build AppImage"
filters:
branches:
ignore:
@@ -1152,42 +1070,6 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-and-push-image:
- name: build-and-push/lotus-all-in-one
- dockerfile: Dockerfile.lotus
- path: .
- repo: lotus-dev
- tag: '${CIRCLE_SHA1:0:8}'
- target: lotus-all-in-one
- - build-and-push-image:
- name: build-and-push/lotus-test
- dockerfile: Dockerfile.lotus
- path: .
- repo: lotus-test
- tag: '${CIRCLE_SHA1:0:8}'
- target: lotus-test
- - publish-snapcraft:
- name: "Publish Snapcraft (lotus-filecoin / candidate)"
- channel: stable
- snap-name: lotus-filecoin
- filters:
- branches:
- ignore:
- - /.*/
- tags:
- only:
- - /^v\d+\.\d+\.\d+$/
- - publish-snapcraft:
- name: "Publish Snapcraft (lotus-filecoin / candidate)"
- channel: candidate
- snap-name: lotus-filecoin
- filters:
- branches:
- ignore:
- - /.*/
- tags:
- only:
- - /^v\d+\.\d+\.\d+-rc\d+$/
- publish-snapcraft:
name: "Publish Snapcraft (lotus / stable)"
channel: stable
@@ -1210,16 +1092,253 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+-rc\d+$/
- - publish-dockerhub:
- name: publish-dockerhub
- tag: stable
+ - publish-snapcraft:
+ name: "Publish Snapcraft (lotus-filecoin / stable)"
+ channel: stable
+ snap-name: lotus-filecoin
filters:
branches:
ignore:
- /.*/
tags:
only:
- - /^v\d+\.\d+\.\d+(-rc\d+)?$/
+ - /^v\d+\.\d+\.\d+$/
+ - publish-snapcraft:
+ name: "Publish Snapcraft (lotus-filecoin / candidate)"
+ channel: candidate
+ snap-name: lotus-filecoin
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+-rc\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / stable / mainnet)"
+ image: lotus-all-in-one
+ channel: stable
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / candidate / mainnet)"
+ image: lotus-all-in-one
+ channel: candidate
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+-rc\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / edge / mainnet)"
+ image: lotus-all-in-one
+ channel: master
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ only:
+ - master
+ - build-docker:
+ name: "Docker build (lotus-all-in-one / mainnet)"
+ image: lotus-all-in-one
+ network: mainnet
+ push: false
+ filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / stable / butterflynet)"
+ image: lotus-all-in-one
+ channel: stable
+ network: butterflynet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / candidate / butterflynet)"
+ image: lotus-all-in-one
+ channel: candidate
+ network: butterflynet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+-rc\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / edge / butterflynet)"
+ image: lotus-all-in-one
+ channel: master
+ network: butterflynet
+ push: true
+ filters:
+ branches:
+ only:
+ - master
+ - build-docker:
+ name: "Docker build (lotus-all-in-one / butterflynet)"
+ image: lotus-all-in-one
+ network: butterflynet
+ push: false
+ filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / stable / calibnet)"
+ image: lotus-all-in-one
+ channel: stable
+ network: calibnet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / candidate / calibnet)"
+ image: lotus-all-in-one
+ channel: candidate
+ network: calibnet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+-rc\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / edge / calibnet)"
+ image: lotus-all-in-one
+ channel: master
+ network: calibnet
+ push: true
+ filters:
+ branches:
+ only:
+ - master
+ - build-docker:
+ name: "Docker build (lotus-all-in-one / calibnet)"
+ image: lotus-all-in-one
+ network: calibnet
+ push: false
+ filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / stable / debug)"
+ image: lotus-all-in-one
+ channel: stable
+ network: debug
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / candidate / debug)"
+ image: lotus-all-in-one
+ channel: candidate
+ network: debug
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+-rc\d+$/
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / edge / debug)"
+ image: lotus-all-in-one
+ channel: master
+ network: debug
+ push: true
+ filters:
+ branches:
+ only:
+ - master
+ - build-docker:
+ name: "Docker build (lotus-all-in-one / debug)"
+ image: lotus-all-in-one
+ network: debug
+ push: false
+ filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
+ - build-docker:
+ name: "Docker push (lotus / stable / mainnet)"
+ image: lotus
+ channel: stable
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+$/
+ - build-docker:
+ name: "Docker push (lotus / candidate / mainnet)"
+ image: lotus
+ channel: candidate
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+-rc\d+$/
+ - build-docker:
+ name: "Docker push (lotus / master / mainnet)"
+ image: lotus
+ channel: master
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ only:
+ - master
+ - build-docker:
+ name: "Docker build (lotus / mainnet)"
+ image: lotus
+ network: mainnet
+ push: false
+ filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
nightly:
triggers:
@@ -1231,23 +1350,44 @@ workflows:
- master
jobs:
- publish-snapcraft:
- name: "Publish Snapcraft Nightly (lotus-filecoin / edge)"
- channel: edge
- snap-name: lotus-filecoin
- - publish-snapcraft:
- name: "Publish Snapcraft Nightly (lotus / edge)"
+ name: "Publish Snapcraft (lotus / edge)"
channel: edge
snap-name: lotus
- - publish-dockerhub:
- name: publish-dockerhub-nightly
- tag: nightly
- monthly:
+ - publish-snapcraft:
+ name: "Publish Snapcraft (lotus-filecoin / edge)"
+ channel: edge
+ snap-name: lotus-filecoin
+ - build-docker:
+ name: "Docker (lotus-all-in-one / nightly / mainnet)"
+ image: lotus-all-in-one
+ channel: nightly
+ network: mainnet
+ push: true
+ - build-docker:
+ name: "Docker (lotus-all-in-one / nightly / butterflynet)"
+ image: lotus-all-in-one
+ channel: nightly
+ network: butterflynet
+ push: true
+ - build-docker:
+ name: "Docker (lotus-all-in-one / nightly / calibnet)"
+ image: lotus-all-in-one
+ channel: nightly
+ network: calibnet
+ push: true
+ - build-docker:
+ name: "Docker (lotus-all-in-one / nightly / debug)"
+ image: lotus-all-in-one
+ channel: nightly
+ network: debug
+ push: true
+ biweekly:
triggers:
- schedule:
- cron: "0 0 1 * *"
+ cron: "0 0 1,15 * *"
filters:
branches:
only:
- master
jobs:
- - publish-packer-snap
\ No newline at end of file
+ - publish-packer-snap
diff --git a/.circleci/gen.go b/.circleci/gen.go
index 844348e29..6cc9cedb1 100644
--- a/.circleci/gen.go
+++ b/.circleci/gen.go
@@ -106,10 +106,14 @@ func main() {
// form the input data.
type data struct {
+ Networks []string
+ SnapNames []string
ItestFiles []string
UnitSuites map[string]string
}
in := data{
+ Networks: []string{"mainnet", "butterflynet", "calibnet", "debug"},
+ SnapNames: []string{"lotus", "lotus-filecoin"},
ItestFiles: itests,
UnitSuites: func() map[string]string {
ret := make(map[string]string)
diff --git a/.circleci/template.yml b/.circleci/template.yml
index 9843463df..4c7ca9e1b 100644
--- a/.circleci/template.yml
+++ b/.circleci/template.yml
@@ -1,11 +1,13 @@
version: 2.1
orbs:
aws-cli: circleci/aws-cli@1.3.2
+ docker: circleci/docker@2.1.4
executors:
golang:
docker:
- - image: cimg/go:1.18.1
+ # Must match GO_VERSION_MIN in project root
+ - image: cimg/go:1.18.8
resource_class: 2xlarge
ubuntu:
docker:
@@ -22,11 +24,6 @@ executors:
commands:
- install-deps:
- steps:
- - run: |
- sudo apt update
- sudo apt install python-is-python3
prepare:
parameters:
linux:
@@ -40,19 +37,29 @@ commands:
steps:
- checkout
- git_fetch_all_tags
- - checkout
- when:
- condition: << parameters.linux >>
+ condition: <>
steps:
+ - run:
+ name: Check Go Version
+ command: |
+ v=`go version | { read _ _ v _; echo ${v#go}; }`
+ if [["[[ $v != `cat GO_VERSION_MIN` ]]"]]; then
+ echo "GO_VERSION_MIN file does not match the go version being used."
+ echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v."
+ exit 1
+ fi
- run: sudo apt-get update
- run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev
+ - run: sudo apt-get install python-is-python3
+
- when:
condition: <>
steps:
- run:
name: Install Go
command: |
- curl https://dl.google.com/go/go1.18.1.darwin-amd64.pkg -o /tmp/go.pkg && \
+ curl https://dl.google.com/go/go`cat GO_VERSION_MIN`.darwin-amd64.pkg -o /tmp/go.pkg && \
sudo installer -pkg /tmp/go.pkg -target /
- run:
name: Export Go
@@ -60,21 +67,12 @@ commands:
echo 'export GOPATH="${HOME}/go"' >> $BASH_ENV
- run: go version
- run:
- name: Install pkg-config, goreleaser, and sha512sum
- command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config goreleaser/tap/goreleaser coreutils
+ name: Install dependencies with Homebrew
+ command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config coreutils jq hwloc
- run:
name: Install Rust
command: |
curl https://sh.rustup.rs -sSf | sh -s -- -y
- - run:
- name: Install hwloc
- command: |
- mkdir ~/hwloc
- curl --location https://download.open-mpi.org/release/hwloc/v2.4/hwloc-2.4.1.tar.gz --output ~/hwloc/hwloc-2.4.1.tar.gz
- cd ~/hwloc
- tar -xvzpf hwloc-2.4.1.tar.gz
- cd hwloc-2.4.1
- ./configure && make && sudo make install
- run: git submodule sync
- run: git submodule update --init
download-params:
@@ -94,28 +92,13 @@ commands:
install_ipfs:
steps:
- run: |
- apt update
- apt install -y wget
- wget https://github.com/ipfs/go-ipfs/releases/download/v0.12.2/go-ipfs_v0.12.2_linux-amd64.tar.gz
- wget https://github.com/ipfs/go-ipfs/releases/download/v0.12.2/go-ipfs_v0.12.2_linux-amd64.tar.gz.sha512
- if [ "$(sha512sum go-ipfs_v0.12.2_linux-amd64.tar.gz)" != "$(cat go-ipfs_v0.12.2_linux-amd64.tar.gz.sha512)" ]
- then
- echo "ipfs failed checksum check"
- exit 1
- fi
- tar -xf go-ipfs_v0.12.2_linux-amd64.tar.gz
- mv go-ipfs/ipfs /usr/local/bin/ipfs
- chmod +x /usr/local/bin/ipfs
- install_ipfs_macos:
- steps:
- - run: |
- curl -O https://dist.ipfs.io/kubo/v0.14.0/kubo_v0.14.0_darwin-amd64.tar.gz
- tar -xvzf kubo_v0.14.0_darwin-amd64.tar.gz
+ curl -O https://dist.ipfs.tech/kubo/v0.16.0/kubo_v0.16.0_linux-amd64.tar.gz
+ tar -xvzf kubo_v0.16.0_linux-amd64.tar.gz
pushd kubo
sudo bash install.sh
popd
- rm -rf kubo/
- rm kubo_v0.14.0_darwin-amd64.tar.gz
+ rm -rf kubo
+ rm kubo_v0.16.0_linux-amd64.tar.gz
git_fetch_all_tags:
steps:
- run:
@@ -140,13 +123,12 @@ commands:
- run:
name: "Run a packer build"
command: packer build << parameters.args >> << parameters.template >>
- no_output_timeout: 30m
+ no_output_timeout: 1h
jobs:
mod-tidy-check:
executor: golang
steps:
- - install-deps
- prepare
- run: go mod tidy -v
- run:
@@ -154,37 +136,6 @@ jobs:
command: |
git --no-pager diff go.mod go.sum
git --no-pager diff --quiet go.mod go.sum
- build-linux:
- executor: golang
- steps:
- - install-deps
- - prepare
- - run: sudo apt-get update
- - run: sudo apt-get install npm
- - run:
- command: make buildall
- - run:
- name: check tag and version output match
- command: ./scripts/version-check.sh ./lotus
- - store_artifacts:
- path: lotus
- - store_artifacts:
- path: lotus-miner
- - store_artifacts:
- path: lotus-worker
- - run: mkdir linux && mv lotus lotus-miner lotus-worker linux/
- - persist_to_workspace:
- root: "."
- paths:
- - linux
-
- build-debug:
- executor: golang
- steps:
- - install-deps
- - prepare
- - run:
- command: make debug
test:
description: |
@@ -214,7 +165,6 @@ jobs:
description: gotestsum format. https://github.com/gotestyourself/gotestsum#format
executor: << parameters.executor >>
steps:
- - install-deps
- prepare
- run:
command: make deps lotus
@@ -258,7 +208,6 @@ jobs:
submodule is used.
executor: << parameters.executor >>
steps:
- - install-deps
- prepare
- run:
command: make deps lotus
@@ -301,121 +250,104 @@ jobs:
path: /tmp/test-reports
- store_artifacts:
path: /tmp/test-artifacts/conformance-coverage.html
- build-ntwk-calibration:
- description: |
- Compile lotus binaries for the calibration network
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
+
+ build-linux-amd64:
+ executor: golang
steps:
- - install-deps
- prepare
- - run: make calibnet
- - run: mkdir linux-calibrationnet && mv lotus lotus-miner lotus-worker linux-calibrationnet
+ - run: make lotus lotus-miner lotus-worker
+ - run:
+ name: check tag and version output match
+ command: ./scripts/version-check.sh ./lotus
+ - run: |
+ mkdir -p /tmp/workspace/linux_amd64_v1 && \
+ mv lotus lotus-miner lotus-worker /tmp/workspace/linux_amd64_v1/
- persist_to_workspace:
- root: "."
+ root: /tmp/workspace
paths:
- - linux-calibrationnet
- build-ntwk-butterfly:
- description: |
- Compile lotus binaries for the butterfly network
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
- steps:
- - install-deps
- - prepare
- - run: make butterflynet
- - run: mkdir linux-butterflynet && mv lotus lotus-miner lotus-worker linux-butterflynet
- - persist_to_workspace:
- root: "."
- paths:
- - linux-butterflynet
- build-lotus-soup:
- description: |
- Compile `lotus-soup` Testground test plan
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
- steps:
- - install-deps
- - prepare
- - run: cd extern/filecoin-ffi && make
- - run:
- name: "go get lotus@master"
- command: cd testplans/lotus-soup && go mod edit -replace=github.com/filecoin-project/lotus=../.. && go mod tidy
- - run:
- name: "build lotus-soup testplan"
- command: pushd testplans/lotus-soup && go build -tags=testground .
- trigger-testplans:
- description: |
- Trigger `lotus-soup` test cases on TaaS
- parameters:
- <<: *test-params
- executor: << parameters.executor >>
- steps:
- - install-deps
- - prepare
- - run:
- name: "download testground"
- command: wget https://gist.github.com/nonsense/5fbf3167cac79945f658771aed32fc44/raw/2e17eb0debf7ec6bdf027c1bdafc2c92dd97273b/testground-d3e9603 -O ~/testground-cli && chmod +x ~/testground-cli
- - run:
- name: "prepare .env.toml"
- command: pushd testplans/lotus-soup && mkdir -p $HOME/testground && cp env-ci.toml $HOME/testground/.env.toml && echo 'endpoint="https://ci.testground.ipfs.team"' >> $HOME/testground/.env.toml && echo 'user="circleci"' >> $HOME/testground/.env.toml
- - run:
- name: "prepare testground home dir and link test plans"
- command: mkdir -p $HOME/testground/plans && ln -s $(pwd)/testplans/lotus-soup $HOME/testground/plans/lotus-soup
- - run:
- name: "go get lotus@master"
- command: cd testplans/lotus-soup && go get github.com/filecoin-project/lotus@master
- - run:
- name: "trigger deals baseline testplan on taas"
- command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/baseline-k8s-3-1.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH
- - run:
- name: "trigger payment channel stress testplan on taas"
- command: ~/testground-cli run composition -f $HOME/testground/plans/lotus-soup/_compositions/paych-stress-k8s.toml --metadata-commit=$CIRCLE_SHA1 --metadata-repo=filecoin-project/lotus --metadata-branch=$CIRCLE_BRANCH
- build-macos:
+ - linux_amd64_v1
+
+ build-darwin-amd64:
description: build darwin lotus binary
- parameters:
- publish:
- default: false
- description: publish github release and homebrew?
- type: boolean
+ working_directory: ~/go/src/github.com/filecoin-project/lotus
macos:
xcode: "13.4.1"
- working_directory: ~/go/src/github.com/filecoin-project/lotus
steps:
- prepare:
linux: false
darwin: true
- - install_ipfs_macos
- - restore_cache:
- name: restore cargo cache
- key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }}
+ - run: make lotus lotus-miner lotus-worker
+ - run:
+ name: check tag and version output match
+ command: ./scripts/version-check.sh ./lotus
+ - run: |
+ mkdir -p /tmp/workspace/darwin_amd64_v1 && \
+ mv lotus lotus-miner lotus-worker /tmp/workspace/darwin_amd64_v1/
+ - persist_to_workspace:
+ root: /tmp/workspace
+ paths:
+ - darwin_amd64_v1
+
+ build-darwin-arm64:
+ description: self-hosted m1 runner
+ working_directory: ~/go/src/github.com/filecoin-project/lotus
+ machine: true
+ resource_class: filecoin-project/self-hosted-m1
+ steps:
+ - run: echo 'export PATH=/opt/homebrew/bin:"$PATH"' >> "$BASH_ENV"
+ - prepare:
+ linux: false
+ darwin: true
+ - run: |
+ export CPATH=$(brew --prefix)/include
+ export LIBRARY_PATH=$(brew --prefix)/lib
+ make lotus lotus-miner lotus-worker
+ - run:
+ name: check tag and version output match
+ command: ./scripts/version-check.sh ./lotus
+ - run: |
+ mkdir -p /tmp/workspace/darwin_arm64 && \
+ mv lotus lotus-miner lotus-worker /tmp/workspace/darwin_arm64/
+ - persist_to_workspace:
+ root: /tmp/workspace
+ paths:
+ - darwin_arm64
+ - run:
+ command: make clean
+ when: always
+ - run:
+ name: cleanup homebrew
+ command: HOMEBREW_NO_AUTO_UPDATE=1 brew uninstall pkg-config coreutils jq hwloc
+ when: always
+
+ release:
+ executor: golang
+ parameters:
+ dry-run:
+ default: false
+ description: should this release actually publish it's artifacts?
+ type: boolean
+ steps:
+ - checkout
+ - run: |
+ echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | sudo tee /etc/apt/sources.list.d/goreleaser.list
+ sudo apt update
+ sudo apt install goreleaser-pro
+ - install_ipfs
+ - attach_workspace:
+ at: /tmp/workspace
- when:
- condition: << parameters.publish >>
+ condition: << parameters.dry-run >>
steps:
- - run: goreleaser release --rm-dist
+ - run: goreleaser release --rm-dist --snapshot --debug
- run: ./scripts/generate-checksums.sh
- - run: ./scripts/publish-checksums.sh
- when:
condition:
- not: << parameters.publish >>
+ not: << parameters.dry-run >>
steps:
- - run: goreleaser release --rm-dist --snapshot
+ - run: goreleaser release --rm-dist --debug
- run: ./scripts/generate-checksums.sh
- - store_artifacts:
- path: dist
- - persist_to_workspace:
- root: "."
- paths:
- - dist
- - save_cache:
- name: save cargo cache
- key: v3-go-deps-{{ arch }}-{{ checksum "~/go/src/github.com/filecoin-project/lotus/go.sum" }}
- paths:
- - "~/.rustup"
- - "~/.cargo"
+ - run: ./scripts/publish-checksums.sh
build-appimage:
machine:
@@ -423,7 +355,14 @@ jobs:
steps:
- checkout
- attach_workspace:
- at: "."
+ at: /tmp/workspace
+ - run:
+ name: Update Go
+ command: |
+ sudo rm -rf /usr/local/go && \
+ curl -L https://golang.org/dl/go`cat GO_VERSION_MIN`.linux-amd64.tar.gz -o /tmp/go.tar.gz && \
+ sudo tar -C /usr/local -xvf /tmp/go.tar.gz
+ - run: go version
- run:
name: install appimage-builder
command: |
@@ -451,13 +390,11 @@ jobs:
command: |
sed -i "s/version: latest/version: ${CIRCLE_TAG:-latest}/" AppImageBuilder.yml
make appimage
- - run:
- name: prepare workspace
- command: |
- mkdir appimage
- mv Lotus-*.AppImage appimage
+ - run: |
+ mkdir -p /tmp/workspace/appimage && \
+ mv Lotus-*.AppImage /tmp/workspace/appimage/
- persist_to_workspace:
- root: "."
+ root: /tmp/workspace
paths:
- appimage
@@ -465,7 +402,6 @@ jobs:
gofmt:
executor: golang
steps:
- - install-deps
- prepare
- run:
command: "! go fmt ./... 2>&1 | read"
@@ -473,7 +409,6 @@ jobs:
gen-check:
executor: golang
steps:
- - install-deps
- prepare
- run: make deps
- run: go install golang.org/x/tools/cmd/goimports
@@ -488,7 +423,6 @@ jobs:
docs-check:
executor: golang
steps:
- - install-deps
- prepare
- run: go install golang.org/x/tools/cmd/goimports
- run: zcat build/openrpc/full.json.gz | jq > ../pre-openrpc-full
@@ -525,7 +459,6 @@ jobs:
Arguments to pass to golangci-lint
executor: << parameters.executor >>
steps:
- - install-deps
- prepare
- run:
command: make deps
@@ -553,13 +486,13 @@ jobs:
steps:
- run:
name: Install git jq curl
- command: apt update && apt install -y git jq curl
+ command: apt update && apt install -y git jq curl sudo
- checkout
- git_fetch_all_tags
- checkout
- install_ipfs
- attach_workspace:
- at: "."
+ at: /tmp/workspace
- when:
condition: << parameters.linux >>
steps:
@@ -604,129 +537,100 @@ jobs:
shell: /bin/bash -o pipefail
command: |
snapcraft upload *.snap --release << parameters.channel >>
-
- build-and-push-image:
- description: build and push docker images to public AWS ECR registry
- executor: aws-cli/default
+ build-docker:
+ description: >
+ Publish to Dockerhub
+ executor: docker/docker
parameters:
- profile-name:
+ image:
type: string
- default: "default"
- description: AWS profile name to be configured.
-
- aws-access-key-id:
- type: env_var_name
- default: AWS_ACCESS_KEY_ID
+ default: lotus
description: >
- AWS access key id for IAM role. Set this to the name of
- the environment variable you will set to hold this
- value, i.e. AWS_ACCESS_KEY.
-
- aws-secret-access-key:
- type: env_var_name
- default: AWS_SECRET_ACCESS_KEY
- description: >
- AWS secret key for IAM role. Set this to the name of
- the environment variable you will set to hold this
- value, i.e. AWS_SECRET_ACCESS_KEY.
-
- region:
- type: env_var_name
- default: AWS_REGION
- description: >
- Name of env var storing your AWS region information,
- defaults to AWS_REGION
-
- account-url:
- type: env_var_name
- default: AWS_ECR_ACCOUNT_URL
- description: >
- Env var storing Amazon ECR account URL that maps to an AWS account,
- e.g. {awsAccountNum}.dkr.ecr.us-west-2.amazonaws.com
- defaults to AWS_ECR_ACCOUNT_URL
-
- dockerfile:
+ Passed to the docker build process to determine which image in the
+ Dockerfile should be built. Expected values are `lotus`,
+ `lotus-all-in-one`
+ network:
type: string
- default: Dockerfile
- description: Name of dockerfile to use. Defaults to Dockerfile.
-
- path:
- type: string
- default: .
- description: Path to the directory containing your Dockerfile and build context. Defaults to . (working directory).
-
- extra-build-args:
+ default: "mainnet"
+ description: >
+ Passed to the docker build process using GOFLAGS+=-tags=<>.
+ Expected values are `debug`, `2k`, `calibnet`, `butterflynet`,
+ `interopnet`.
+ channel:
type: string
default: ""
description: >
- Extra flags to pass to docker build. For examples, see
- https://docs.docker.com/engine/reference/commandline/build
-
- repo:
- type: string
- description: Name of an Amazon ECR repository
-
- tag:
- type: string
- default: "latest"
- description: A comma-separated string containing docker image tags to build and push (default = latest)
-
- target:
- type: string
- default: "lotus-all-in-one"
- description: Docker target to build
-
+ The release channel to use for this image.
+ push:
+ type: boolean
+ default: false
+ description: >
+ When true, pushes the image to Dockerhub
steps:
- - run:
- name: Confirm that environment variables are set
- command: |
- if [ -z "$AWS_ACCESS_KEY_ID" ]; then
- echo "No AWS_ACCESS_KEY_ID is set. Skipping build-and-push job ..."
- circleci-agent step halt
- fi
-
- - aws-cli/setup:
- profile-name: <>
- aws-access-key-id: <>
- aws-secret-access-key: <>
- aws-region: <>
-
- - run:
- name: Log into Amazon ECR
- command: |
- aws ecr-public get-login-password --region $<> --profile <> | docker login --username AWS --password-stdin $<>
-
+ - setup_remote_docker
- checkout
-
- - setup_remote_docker:
- version: 19.03.13
- docker_layer_caching: false
-
- - run:
- name: Build docker image
- command: |
- registry_id=$(echo $<> | sed "s;\..*;;g")
-
- docker_tag_args=""
- IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
- for tag in "${DOCKER_TAGS[@]}"; do
- docker_tag_args="$docker_tag_args -t $<>/<>:$tag"
- done
-
- docker build \
- <<#parameters.extra-build-args>><><> \
- --target <> \
- -f <>/<> \
- $docker_tag_args \
- <>
-
- - run:
- name: Push image to Amazon ECR
- command: |
- IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
- for tag in "${DOCKER_TAGS[@]}"; do
- docker push $<>/<>:${tag}
- done
+ - docker/check:
+ docker-username: DOCKERHUB_USERNAME
+ docker-password: DOCKERHUB_PASSWORD
+ - when:
+ condition:
+ equal: [ mainnet, <> ]
+ steps:
+ - when:
+ condition: >
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <>
+ tag: <>
+ - run:
+ name: Docker push
+ command: |
+ docker push filecoin/<>:<>
+ if [["[[ ! -z $CIRCLE_SHA ]]"]]; then
+ docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA}"
+ docker push filecoin/<>:"${CIRCLE_SHA}"
+ fi
+ if [["[[ ! -z $CIRCLE_TAG ]]"]]; then
+ docker image tag filecoin/<>:<> filecoin/<>:"${CIRCLE_TAG}"
+ docker push filecoin/<>:"${CIRCLE_TAG}"
+ fi
+ - unless:
+ condition: <>
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <>
+ - when:
+ condition:
+ not:
+ equal: [ mainnet, <> ]
+ steps:
+ - when:
+ condition: <>
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <> --build-arg GOFLAGS=-tags=<>
+ tag: <>-<>
+ - run:
+ name: Docker push
+ command: |
+ docker push filecoin/<>:<>-<>
+ if [["[[ ! -z $CIRCLE_SHA ]]"]]; then
+ docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA}"-<>
+ docker push filecoin/<>:"${CIRCLE_SHA}"-<>
+ fi
+ if [["[[ ! -z $CIRCLE_TAG ]]"]]; then
+ docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_TAG}"-<>
+ docker push filecoin/<>:"${CIRCLE_TAG}"-<>
+ fi
+ - unless:
+ condition: <>
+ steps:
+ - docker/build:
+ image: filecoin/<>
+ extra_build_args: --target <> --build-arg GOFLAGS=-tags=<>
publish-packer-snap:
description: build packer image with snap. mainnet only.
@@ -734,55 +638,8 @@ jobs:
name: packer
steps:
- checkout
- - attach_workspace:
- at: "."
- packer_build:
template: tools/packer/lotus-snap.pkr.hcl
- publish-dockerhub:
- description: publish to dockerhub
- machine:
- image: ubuntu-2004:202010-01
- parameters:
- tag:
- type: string
- default: latest
- steps:
- - checkout
- - run:
- name: dockerhub login
- command: echo $DOCKERHUB_PASSWORD | docker login --username $DOCKERHUB_USERNAME --password-stdin
- - run:
- name: docker build
- command: |
- docker build --target lotus -t filecoin/lotus:<< parameters.tag >> -f Dockerfile.lotus .
- docker build --target lotus-gateway -t filecoin/lotus-gateway:<< parameters.tag >> -f Dockerfile.lotus .
- docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:<< parameters.tag >> -f Dockerfile.lotus .
- if [["[[ ! -z $CIRCLE_SHA1 ]]"]]; then
- docker build --target lotus -t filecoin/lotus:$CIRCLE_SHA1 -f Dockerfile.lotus .
- docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_SHA1 -f Dockerfile.lotus .
- docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_SHA1 -f Dockerfile.lotus .
- fi
- if [["[[ ! -z $CIRCLE_TAG ]]"]]; then
- docker build --target lotus -t filecoin/lotus:$CIRCLE_TAG -f Dockerfile.lotus .
- docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_TAG -f Dockerfile.lotus .
- docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_TAG -f Dockerfile.lotus .
- fi
- - run:
- name: docker push
- command: |
- docker push filecoin/lotus:<< parameters.tag >>
- docker push filecoin/lotus-gateway:<< parameters.tag >>
- docker push filecoin/lotus-all-in-one:<< parameters.tag >>
- if [["[[ ! -z $CIRCLE_SHA1 ]]"]]; then
- docker push filecoin/lotus:$CIRCLE_SHA1
- docker push filecoin/lotus-gateway:$CIRCLE_SHA1
- docker push filecoin/lotus-all-in-one:$CIRCLE_SHA1
- fi
- if [["[[ ! -z $CIRCLE_TAG ]]"]]; then
- docker push filecoin/lotus:$CIRCLE_TAG
- docker push filecoin/lotus-gateway:$CIRCLE_TAG
- docker push filecoin/lotus-all-in-one:$CIRCLE_TAG
- fi
workflows:
version: 2.1
@@ -823,31 +680,42 @@ workflows:
suite: conformance-bleeding-edge
target: "./conformance"
vectors-branch: specs-actors-v7
- - trigger-testplans:
+
+ release:
+ jobs:
+ - build-linux-amd64:
+ name: "Build ( linux / amd64 )"
filters:
branches:
only:
- - master
- - build-debug
- - build-linux:
- filters:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-ntwk-calibration:
+ - build-darwin-amd64:
+ name: "Build ( darwin / amd64 )"
filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-ntwk-butterfly:
+ - build-darwin-arm64:
+ name: "Build ( darwin / arm64 )"
filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-lotus-soup
- - build-macos:
- name: publish-macos
- publish: true
+ - release:
+ name: "Release"
+ requires:
+ - "Build ( darwin / amd64 )"
+ - "Build ( linux / amd64 )"
+ - "Build ( darwin / arm64 )"
filters:
branches:
ignore:
@@ -855,12 +723,19 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-macos:
+ - release:
+ name: "Release (dry-run)"
+ dry-run: true
+ requires:
+ - "Build ( darwin / amd64 )"
+ - "Build ( linux / amd64 )"
+ - "Build ( darwin / arm64 )"
filters:
branches:
only:
- /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
- build-appimage:
+ name: "Build AppImage"
filters:
branches:
only:
@@ -869,22 +744,10 @@ workflows:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- publish:
- name: publish-linux
- linux: true
- requires:
- - build-linux
- filters:
- branches:
- ignore:
- - /.*/
- tags:
- only:
- - /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - publish:
- name: publish-appimage
+ name: "Publish AppImage"
appimage: true
requires:
- - build-appimage
+ - "Build AppImage"
filters:
branches:
ignore:
@@ -892,24 +755,11 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+(-rc\d+)?$/
- - build-and-push-image:
- name: build-and-push/lotus-all-in-one
- dockerfile: Dockerfile.lotus
- path: .
- repo: lotus-dev
- tag: '${CIRCLE_SHA1:0:8}'
- target: lotus-all-in-one
- - build-and-push-image:
- name: build-and-push/lotus-test
- dockerfile: Dockerfile.lotus
- path: .
- repo: lotus-test
- tag: '${CIRCLE_SHA1:0:8}'
- target: lotus-test
+ [[- range .SnapNames]]
- publish-snapcraft:
- name: "Publish Snapcraft (lotus-filecoin / candidate)"
+ name: "Publish Snapcraft ([[.]] / stable)"
channel: stable
- snap-name: lotus-filecoin
+ snap-name: [[.]]
filters:
branches:
ignore:
@@ -918,9 +768,9 @@ workflows:
only:
- /^v\d+\.\d+\.\d+$/
- publish-snapcraft:
- name: "Publish Snapcraft (lotus-filecoin / candidate)"
+ name: "Publish Snapcraft ([[.]] / candidate)"
channel: candidate
- snap-name: lotus-filecoin
+ snap-name: [[.]]
filters:
branches:
ignore:
@@ -928,10 +778,14 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+-rc\d+$/
- - publish-snapcraft:
- name: "Publish Snapcraft (lotus / stable)"
+ [[- end]]
+ [[- range .Networks]]
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / stable / [[.]])"
+ image: lotus-all-in-one
channel: stable
- snap-name: lotus
+ network: [[.]]
+ push: true
filters:
branches:
ignore:
@@ -939,10 +793,12 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+$/
- - publish-snapcraft:
- name: "Publish Snapcraft (lotus / candidate)"
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / candidate / [[.]])"
+ image: lotus-all-in-one
channel: candidate
- snap-name: lotus
+ network: [[.]]
+ push: true
filters:
branches:
ignore:
@@ -950,16 +806,71 @@ workflows:
tags:
only:
- /^v\d+\.\d+\.\d+-rc\d+$/
- - publish-dockerhub:
- name: publish-dockerhub
- tag: stable
+ - build-docker:
+ name: "Docker push (lotus-all-in-one / edge / [[.]])"
+ image: lotus-all-in-one
+ channel: master
+ network: [[.]]
+ push: true
+ filters:
+ branches:
+ only:
+ - master
+ - build-docker:
+ name: "Docker build (lotus-all-in-one / [[.]])"
+ image: lotus-all-in-one
+ network: [[.]]
+ push: false
+ filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
+ [[- end]]
+ - build-docker:
+ name: "Docker push (lotus / stable / mainnet)"
+ image: lotus
+ channel: stable
+ network: mainnet
+ push: true
filters:
branches:
ignore:
- /.*/
tags:
only:
- - /^v\d+\.\d+\.\d+(-rc\d+)?$/
+ - /^v\d+\.\d+\.\d+$/
+ - build-docker:
+ name: "Docker push (lotus / candidate / mainnet)"
+ image: lotus
+ channel: candidate
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ ignore:
+ - /.*/
+ tags:
+ only:
+ - /^v\d+\.\d+\.\d+-rc\d+$/
+ - build-docker:
+ name: "Docker push (lotus / master / mainnet)"
+ image: lotus
+ channel: master
+ network: mainnet
+ push: true
+ filters:
+ branches:
+ only:
+ - master
+ - build-docker:
+ name: "Docker build (lotus / mainnet)"
+ image: lotus
+ network: mainnet
+ push: false
+ filters:
+ branches:
+ only:
+ - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
nightly:
triggers:
@@ -970,24 +881,27 @@ workflows:
only:
- master
jobs:
+ [[- range .SnapNames]]
- publish-snapcraft:
- name: "Publish Snapcraft Nightly (lotus-filecoin / edge)"
+ name: "Publish Snapcraft ([[.]] / edge)"
channel: edge
- snap-name: lotus-filecoin
- - publish-snapcraft:
- name: "Publish Snapcraft Nightly (lotus / edge)"
- channel: edge
- snap-name: lotus
- - publish-dockerhub:
- name: publish-dockerhub-nightly
- tag: nightly
- monthly:
+ snap-name: [[.]]
+ [[- end]]
+ [[- range .Networks]]
+ - build-docker:
+ name: "Docker (lotus-all-in-one / nightly / [[.]])"
+ image: lotus-all-in-one
+ channel: nightly
+ network: [[.]]
+ push: true
+ [[- end]]
+ biweekly:
triggers:
- schedule:
- cron: "0 0 1 * *"
+ cron: "0 0 1,15 * *"
filters:
branches:
only:
- master
jobs:
- - publish-packer-snap
\ No newline at end of file
+ - publish-packer-snap
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..cf5b209d7
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+chain/actors/builtin/*/v* linguist-generated=true
+chain/actors/builtin/*/message* linguist-generated=true
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 9c76b54dd..981a80256 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -81,7 +81,7 @@ body:
render: text
description: |
Please provide debug logs of the problem, remember you can get set log level control for:
- * lotus: use `lotus log list` to get all log systems available and set level by `lotus log set-level`. An example can be found [here](https://docs.filecoin.io/get-started/lotus/configuration-and-advanced-usage/#log-level-control).
+ * lotus: use `lotus log list` to get all log systems available and set level by `lotus log set-level`. An example can be found [here](https://lotus.filecoin.io/lotus/configure/defaults/#log-level-control).
* lotus-miner:`lotus-miner log list` to get all log systems available and set level by `lotus-miner log set-level
If you don't provide detailed logs when you raise the issue it will almost certainly be the first request I make before furthur diagnosing the problem.
validations:
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index c806120b1..b6ef5fa3c 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,21 +1,23 @@
## Related Issues
-
+
## Proposed Changes
-
-
+
## Additional Info
-
+
## Checklist
Before you mark the PR ready for review, please make sure that:
-- [ ] All commits have a clear commit message.
-- [ ] The PR title is in the form of of `: : `
- - example: ` fix: mempool: Introduce a cache for valid signatures`
- - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_,_perf_, _refactor_, _revert_, _style_, _test_
- - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_, _deps_
-- [ ] This PR has tests for new functionality or change in behaviour
-- [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials)
+
+- [ ] Commits have a clear commit message.
+- [ ] PR title is in the form of of `: : `
+ - example: ` fix: mempool: Introduce a cache for valid signatures`
+ - `PR type`: fix, feat, build, chore, ci, docs, perf, refactor, revert, style, test
+ - `area`, e.g. api, chain, state, market, mempool, multisig, networking, paych, proving, sealing, wallet, deps
+- [ ] New features have usage guidelines and / or documentation updates in
+ - [ ] [Lotus Documentation](https://lotus.filecoin.io)
+ - [ ] [Discussion Tutorials](https://github.com/filecoin-project/lotus/discussions/categories/tutorials)
+- [ ] Tests exist for new functionality or change in behavior
- [ ] CI is green
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 70d15c60c..65d5fd93a 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -37,7 +37,7 @@ jobs:
- uses: actions/setup-go@v1
with:
- go-version: '1.18.1'
+ go-version: '1.18.8'
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
diff --git a/.gitignore b/.gitignore
index b111195cf..5ff2726f2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,6 @@
/lotus-chainwatch
/lotus-shed
/lotus-sim
-/lotus-pond
/lotus-townhall
/lotus-fountain
/lotus-stats
@@ -21,8 +20,6 @@
/docgen-md
/docgen-openrpc
/bench.json
-/lotuspond/front/node_modules
-/lotuspond/front/build
/cmd/lotus-townhall/townhall/node_modules
/cmd/lotus-townhall/townhall/build
/cmd/lotus-townhall/townhall/package-lock.json
diff --git a/.golangci.yml b/.golangci.yml
index f73241217..fe663ef7b 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -43,9 +43,6 @@ issues:
exclude-use-default: false
exclude-rules:
- - path: lotuspond
- linters:
- - errcheck
- path: node/modules/lp2p
linters:
diff --git a/.goreleaser.yaml b/.goreleaser.yaml
index f8839cc13..7e96e3ce8 100644
--- a/.goreleaser.yaml
+++ b/.goreleaser.yaml
@@ -1,119 +1,65 @@
project_name: lotus
-before:
- hooks:
- - go mod tidy
- - make deps
universal_binaries:
- id: lotus
replace: true
name_template: lotus
- ids:
- - lotus_darwin_amd64
- - lotus_darwin_arm64
- id: lotus-miner
replace: true
name_template: lotus-miner
- ids:
- - lotus-miner_darwin_amd64
- - lotus-miner_darwin_arm64
- id: lotus-worker
replace: true
name_template: lotus-worker
- ids:
- - lotus-worker_darwin_amd64
- - lotus-worker_darwin_arm64
builds:
- - id: lotus_darwin_amd64
- main: ./cmd/lotus
+ - id: lotus
binary: lotus
+ builder: prebuilt
goos:
- darwin
+ - linux
goarch:
- amd64
- env:
- - CGO_ENABLED=1
- - FFI_BUILD_FROM_SOURCE=1
- ldflags:
- - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}}
- - id: lotus-miner_darwin_amd64
- main: ./cmd/lotus-miner
+ - arm64
+ goamd64:
+ - v1
+ ignore:
+ - goos: linux
+ goarch: arm64
+ prebuilt:
+ path: /tmp/workspace/{{ .Os }}_{{ .Arch }}{{ with .Amd64 }}_{{ . }}{{ end }}/lotus
+ - id: lotus-miner
binary: lotus-miner
+ builder: prebuilt
goos:
- darwin
+ - linux
goarch:
- amd64
- env:
- - CGO_ENABLED=1
- - FFI_BUILD_FROM_SOURCE=1
- ldflags:
- - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}}
- - id: lotus-worker_darwin_amd64
- main: ./cmd/lotus-worker
+ - arm64
+ goamd64:
+ - v1
+ ignore:
+ - goos: linux
+ goarch: arm64
+ prebuilt:
+ path: /tmp/workspace/{{ .Os }}_{{ .Arch }}{{ with .Amd64 }}_{{ . }}{{ end }}/lotus-miner
+ - id: lotus-worker
binary: lotus-worker
+ builder: prebuilt
goos:
- darwin
+ - linux
goarch:
- amd64
- env:
- - CGO_ENABLED=1
- - FFI_BUILD_FROM_SOURCE=1
- ldflags:
- - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}}
- - id: lotus_darwin_arm64
- main: ./cmd/lotus
- binary: lotus
- goos:
- - darwin
- goarch:
- arm64
- env:
- - CGO_ENABLED=1
- - FFI_BUILD_FROM_SOURCE=1
- - CPATH=/opt/homebrew/include
- - LIBRARY_PATH=/opt/homebrew/lib
- ldflags:
- - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}}
- - id: lotus-miner_darwin_arm64
- main: ./cmd/lotus-miner
- binary: lotus-miner
- goos:
- - darwin
- goarch:
- - arm64
- env:
- - CGO_ENABLED=1
- - FFI_BUILD_FROM_SOURCE=1
- - CPATH=/opt/homebrew/include
- - LIBRARY_PATH=/opt/homebrew/lib
- ldflags:
- - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}}
- - id: lotus-worker_darwin_arm64
- main: ./cmd/lotus-worker
- binary: lotus-worker
- goos:
- - darwin
- goarch:
- - arm64
- env:
- - CGO_ENABLED=1
- - FFI_BUILD_FROM_SOURCE=1
- - CPATH=/opt/homebrew/include
- - LIBRARY_PATH=/opt/homebrew/lib
- ldflags:
- - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}}
-# - id: linux
-# main: ./cmd/lotus
-# binary: lotus
-# goos:
-# - linux
-# goarch:
-# - amd64
-# env:
-# - CGO_ENABLED=1
-# ldflags:
-# - -X=github.com/filecoin-project/lotus/build.CurrentCommit=+git.{{.ShortCommit}}
+ goamd64:
+ - v1
+ ignore:
+ - goos: linux
+ goarch: arm64
+ prebuilt:
+ path: /tmp/workspace/{{ .Os }}_{{ .Arch }}{{ with .Amd64 }}_{{ . }}{{ end }}/lotus-worker
archives:
- id: primary
@@ -129,8 +75,7 @@ release:
owner: filecoin-project
name: lotus
prerelease: auto
- name_template: "Release v{{.Version}}"
-
+ name_template: "v{{.Version}}"
brews:
- tap:
@@ -151,10 +96,8 @@ brews:
homepage: "https://filecoin.io"
description: "A homebrew cask for installing filecoin-project/lotus on MacOS"
license: MIT
+ skip_upload: auto
dependencies:
- - name: pkg-config
- - name: jq
- - name: bzr
- name: hwloc
# produced manually so we can include cid checksums
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 235763772..622de475a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,393 @@
# Lotus changelog
+# 1.18.1 / 2022-11-28
+
+This is a small OPTIONAL patch release for the mandatory v1.18.0 release that supports the Filecoin nv17 Shark Upgrade.
+We highly recommend you to read the full [v1.18.0 release note](https://github.com/filecoin-project/lotus/releases/tag/v1.18.0) if you haven't already.
+
+Note to SPs:
+If you are running into issue with updating your miner node from an earlier release and is failing to restart your miner, check your `journalctl` and see if you noticed the following error:
+```
+New sector storage: <%d>
+Nov 19 15:03:43 g0lotus01 lotus-miner[]: ERROR: creating node: starting node: could not build arguments for function "reflect".makeFuncStub (/usr/local/go/src/reflect/asm_amd64.s:28): failed to build *paths.Local: received non-nil error from function "reflect".makeFuncStub (/usr/local/go/src/reflect/asm_amd64.s:28): opening path /media/data1/lotusstorage: path with ID <%d> already opened: ''
+```
+If so, this check is introduced via [#9032](https://github.com/filecoin-project/lotus/pull/9032), precisely this [line](https://github.com/filecoin-project/lotus/blame/master/storage/paths/local.go#L164-L166
+). It's added to prevents double-attaching paths given it's now possible to manipulate paths at runtime. Verify storage.json configs if you encounter this error or remove the undesired depulicated path as you see fit accordingly.
+
+## Bug Fixes
+
+- fix: cli: check found before dereferencing SectorInfo #9703
+
+# 1.18.0 / 2022-11-15
+
+> ⚠️ **Please note that from Lotus v1.17.2&^ will require a Go-version of v1.18.1&^**
+
+This is the final release of the upcoming MANDATORY release of Lotus that introduces [Filecoin network v17,
+codenamed the Shark upgrade](https://github.com/filecoin-project/community/discussions/74?sort=top#discussioncomment-3825422). Shark upgrade delivers a wave of protocol refinements that will allow for useful smart contracts to be written using the FVM (eg. programmable markets, lending contracts, etc.).
+
+**The Filecoin mainnet is scheduled to upgrade to nv17 at epoch 2383680, on Nov 30th on 2022-11-30T14:00:00Z. All node operators, including storage providers, must upgrade to this release before that time. Storage providers must update their daemons, miners, market and worker(s)/boost.**
+
+The Shark upgrade introduces the following FIPs, delivered in [actors v9](https://github.com/filecoin-project/builtin-actors/releases/tag/v9.0.3):
+- [FIP0029 Beneficiary Address for Storage Providers](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0029.md): step towards better lending market for SP
+- [FIP0034 Fix PreCommit Deposit Independent of Sector Content](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0034.md): resolves a significant weakening of Filecoin PoRep’s security guarantees
+ - ❗Pre-commit deposit will be calculated as the 20-day projection of expected reward earned by a sector with **a sector quality of 10 (i.e. full of verified deals)**, regardless of sector content. The Initial Pledge value, due when the sector is proven, is left **unchanged**.
+- [FIP0041 Forward Compatibility for PreCommit](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0041.md): enables a cleaner and easier transition to Programmable Storage Markets
+- [FIP0044 Standard Message Authentication](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0044.md): enable metadata authentication for user defined actor
+- [FIP0045 Decoupling Fil+ from Marketplace](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0045.md): DataCap and the 10x QAP is now only associated with how long DATA is wanted to be stored on the network.
+ - This is a transitional state to enabling far more efficient and dynamic storage markets on Filecoin network in the future.
+ - ⭐️ First Fungible Token Contract - Datacap Actor, on Filecoin! ([fungible token standard](https://github.com/filecoin-project/FIPs/blob/master/FRCs/frc-0046.md), [token contract library](https://github.com/helix-onchain/filecoin/tree/5455f4f831e0f3f20005a9a789623d7ad6dada15/frc46_token)).
+ - For storage deal participants (clients and storage providers):
+ - `PublishStorageDeals`/`ProveCommit(Aggregate)`/`ProveReplicaUpdates` message that includes verified deals will see a gas usage increase, more details can be found [here](https://github.com/filecoin-project/FIPs/blob/385f069b3b146c5fef4fdc1109a0e2f35f399e48/FIPS/fip-0045.md?plain=1#L784)
+ - `Term` is introduced for defining how long the DataCap is assigned to a piece of data. Anyone who cares about that piece of data may extend the _term_, which incentives SPs to store the data longer on the network without a new deal/resealing.
+ - There is no more diluted verified deal QAP due to deal/sector space time for new sectors that contains verified deals after this upgrade.
+ - SPs may enjoy 90 days of extra QAP than deal duration by default, given `term_max` is always `deal duration + 90 days`.
+❗ We highly recommend all lotus users, especially storage providers, developers and clients to read the FIPs in detail to understand the protocol changes and potential impact to network participants!
+
+## Snapshots
+
+The [#fil-infra](https://filecoinproject.slack.com/archives/C039RBG3RPC) team at PL has launched a brand new Lightweight Filecoin Chain Snapshots Service to support chain management needs for the node operators, check [here](https://www.notion.so/pl-strflt/Lightweight-Filecoin-Chain-Snapshots-17e4c386f35c44548f5863afb7b5e024) for the full detail.
+We are planning to switch [the snapshot service listed in lotus docs](https://lotus.filecoin.io/lotus/manage/chain-management/#lightweight-snapshot) to the new Lightweight Filecoin Chain Snapshots Service by EOY, and deprecate public support of the current snapshots production. We recommend all users to test and switch the new service ASAP, and if you run into any issue, please report them [here](https://github.com/filecoin-project/filecoin-chain-archiver/discussions/new?category=feedback) and the team would be happy to support you! For the main differences between the old & the new service, checkout the FAQ section [here](https://www.notion.so/pl-strflt/Lightweight-Filecoin-Chain-Snapshots-17e4c386f35c44548f5863afb7b5e024)
+
+## Migration
+
+We are expecting a heavier than normal state migration for this upgrade due to the amount of the state changes introduced.
+All node operators, including storage providers, should be aware that two pre-migrations are being scheduled. The first pre-migration will begin at 2022-11-30T12:00:00Z (120 minutes before the real upgrade), the second pre-migration will begin at 2022-11-30T13:45:00Z (7.5 minutes before the real upgrade).
+The first pre-migration will take up to 1.5hr, depending on the amount of the historical state in the node blockstore and the hardware specs the node is running on. During this time, expect slower block validation times, increased CPU and memory usage, and longer delays for API queries.
+We recommend node operators (who haven't enbabled splistore `universal` mode) that do not care about historical chain states, to prune the chain blockstore by syncing from a snapshot 1-2 days before the upgrade.
+Note to full archival node operators: you may expect a migration that takes up to 20 min upon the upgrade, during this period your node will fall out of sync and your chain service may have some disruption. However, you can expect the node to catch up soon after the migration completes.
+
+### v9 Built-in actor bundles
+
+Bundles for all networks(mainnet, calibnet, and etc) are included in the lotus source tree (`build/actors/`) and embedded on build, for v9 actors you can find it [here](https://github.com/filecoin-project/lotus/blob/master/build/actors/v9.tar.zst).
+Reminder: Lotus verifies that the bundle CIDs are the right ones upon build & upgrade against the values in `build/builtin_actors_gen.go`, according to the network you are building. You may also check the bundle manifest CID matches the bundle gen-ed values by running `lotus state actor-cids --network-version 17`.
+
+The manifest CID & full list of actor code CIDs for nv17 using [actor v9](https://github.com/filecoin-project/builtin-actors/releases/tag/v9.0.3) is:
+
+```
+"_manifest": "bafy2bzaceb6j6666h36xnhksu3ww4kxb6e25niayfgkdnifaqi6m6ooc66i6i"
+"account": "bafk2bzacect2p7urje3pylrrrjy3tngn6yaih4gtzauuatf2jllk3ksgfiw2y"
+"cron": "bafk2bzacebcec3lffmos3nawm5cvwehssxeqwxixoyyfvejy7viszzsxzyu26"
+"datacap": "bafk2bzacebb6uy2ys7tapekmtj7apnjg7oyj4ia5t7tlkvbmwtxwv74lb2pug"
+"init": "bafk2bzacebtdq4zyuxk2fzbdkva6kc4mx75mkbfmldplfntayhbl5wkqou33i"
+"multisig": "bafk2bzacec4va3nmugyqjqrs3lqyr2ij67jhjia5frvx7omnh2isha6abxzya"
+"paymentchannel": "bafk2bzacebhdvjbjcgupklddfavzef4e4gnkt3xk3rbmgfmk7xhecszhfxeds"
+"reward": "bafk2bzacebezgbbmcm2gbcqwisus5fjvpj7hhmu5ubd37phuku3hmkfulxm2o"
+"storagemarket": "bafk2bzacec3j7p6gklk64stax5px3xxd7hdtejaepnd4nw7s2adihde6emkcu"
+"storageminer": "bafk2bzacedyux5hlrildwutvvjdcsvjtwsoc5xnqdjl73ouiukgklekeuyfl4"
+"storagepower": "bafk2bzacedsetphfajgne4qy3vdrpyd6ekcmtfs2zkjut4r34cvnuoqemdrtw"
+"system": "bafk2bzaceagvlo2jtahj7dloshrmwfulrd6e2izqev32qm46eumf754weec6c"
+"verifiedregistry": "bafk2bzacecf3yodlyudzukumehbuabgqljyhjt5ifiv4vetcfohnvsxzynwga"
+```
+
+## New Features
+- Integrate actor v9:
+ - test: Add invariance checks to v17 migration test ([filecoin-project/lotus#9454](https://github.com/filecoin-project/lotus/pull/9454))
+- Implement and support [FIP0045 Decoupling Fil+ from Marketplace](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0045.md):
+ - fix: state: add datacap actor to actors registry ([filecoin-project/lotus#9476](https://github.com/filecoin-project/lotus/pull/9476))
+ - feat: actors: Integrate builtin-actors changes for FIP-0045 ([filecoin-project/lotus#9355](https://github.com/filecoin-project/lotus/pull/9355))
+ - feat: actors: Integrate datacap actor into lotus (#9348) ([filecoin-project/lotus#9348](https://github.com/filecoin-project/lotus/pull/9348))
+ - feat: cli: Add commands for listing allocations and removing expired allocations ([filecoin-project/lotus#9468](https://github.com/filecoin-project/lotus/pull/9468))
+ - feat: sealing pipeline: Prepare deal assigning logic for FIP-45 ([filecoin-project/lotus#9412](https://github.com/filecoin-project/lotus/pull/9412))
+ - feat: add API methods to get allocations and claims ([filecoin-project/lotus#9437](https://github.com/filecoin-project/lotus/pull/9437))
+- Implement and support [FIP0029 Beneficiary Address for Storage Providers](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0029.md)
+ - feat: api/cli: beneficiary withdraw api and cli #9296
+ - feat: api/cli: change beneficiary propose and confirm for actors and multisigs. #9307
+
+## Improvements
+- feat: wdpost: Add ability to only have single partition per msg for partitions with recovery sectors ([filecoin-project/lotus#9427](https://github.com/filecoin-project/lotus/pull/9427))
+- feat: API: support typed errors over RPC ([filecoin-project/lotus#9061](https://github.com/filecoin-project/lotus/pull/9061))
+- feat: refactor: remove NewestNetworkVersion ([filecoin-project/lotus#9351](https://github.com/filecoin-project/lotus/pull/9351))
+- chore: actors: Allow builtin-actors to return a map of methods (#9342) ([filecoin-project/lotus#9342](https://github.com/filecoin-project/lotus/pull/9342))
+
+## Dependencies
+- Update FFI ([filecoin-project/lotus#9484](https://github.com/filecoin-project/lotus/pull/9484))
+- chore: deps: update go-state-types and builtin-actors for v9 release ([filecoin-project/lotus#9485](https://github.com/filecoin-project/lotus/pull/9485))
+- deps: backport: #9455 ([filecoin-project/lotus#9463](https://github.com/filecoin-project/lotus/pull/9463))
+- Deps: Update go-fil-markets to 1.24.0-v17 ([filecoin-project/lotus#9450](https://github.com/filecoin-project/lotus/pull/9450))
+- github.com/filecoin-project/go-jsonrpc (v0.1.7 -> v0.1.8)
+- github.com/filecoin-project/go-state-types (v0.1.12-beta -> v0.9.0):
+
+## Others
+- fix: upgrade: no splash banner for nv17 :( ([filecoin-project/lotus#9486](https://github.com/filecoin-project/lotus/pull/9486))
+- chore: build: add calib upgrade param for shark ([filecoin-project/lotus#9483](https://github.com/filecoin-project/lotus/pull/9483))
+- chore: update butterfly artifacts ([filecoin-project/lotus#9467](https://github.com/filecoin-project/lotus/pull/9467))
+- chore: butterfly: update assets ([filecoin-project/lotus#9462](https://github.com/filecoin-project/lotus/pull/9462))
+- Delete lotus-pond (#9352) ([filecoin-project/lotus#9352](https://github.com/filecoin-project/lotus/pull/9352))
+- build: set version to v1.18.0-dev
+
+## lotus-market EOL notice
+
+As mentioned in [lotus v1.17.0 release notes](https://github.com/filecoin-project/lotus/releases/tag/v1.17.0), markets related features, enhancements and fixes is now lower priority for Lotus. We recommend our users to migrate to other deal making focused software, like [boost](https://boost.filecoin.io/) as soon as possible. That being said, the lotus maintainers will be:
+- Lotus maintainers will stop supporting lotus-market subcomponent/**storage** deal making related issues or enhancements on Jan 31, 2023.
+- In Q2 2023, we will be deprecating/removing lotus-market related code from this repository.
+If you have any questions or concerns, please raise them in [Lotus discussion](https://github.com/filecoin-project/lotus/discussions/categories/market)!
+
+
+## Contributors
+
+| Contributor | Commits | Lines ± | Files Changed |
+|-------------|---------|---------|---------------|
+| @geoff-vball | 73 | +14533/-19712 | 509 |
+| @arajasek | 16 | +2230/-303 | 49 |
+| @arajasek | 29 | +701/-297 | 117 |
+| @magik6k | 5 | +429/-135 | 45 |
+| @Frrist | 1 | +246/-203 | 25 |
+| @stebalien | 2 | +323/-2 | 6 |
+| @shrenujbansal | 3 | +176/-61 | 10 |
+| @ZenGround0 | 2 | +78/-38 | 5 |
+| @jennijuju | 8 | +97/-18 | 16 |
+| @simlecode | 5 | +18/-9 | 11 |
+| Kevin Li | 1 | +7/-0 | 1 |
+| @zenground0 | 2 | +3/-3 | 3 |
+| @jennijuju | 1 | +3/-3 | 2 |
+| Rod Vagg | 1 | +3/-2 | 2 |
+| @jennijuju | 1 | +2/-2 | 2 |
+| Peter Rabbitson | 1 | +3/-0 | 1 |
+| Jakub Sztandera | 1 | +1/-1 | 1 |
+
+# v1.17.2 / 2022-10-05
+
+This is an OPTIONAL release of Lotus. This feature release introduces new sector number management APIs in Lotus that enables all the Sealing-as-a-Service and Lotus interactions needed to function. The default propagation delay setting for storage providers has also been changed, as well as numerous other features and enhancements. Check out the sub-bullet points in the feature and enhancement section to get a short description about each feature and enhancements.
+
+### Highlights
+
+🦭 **SaaS** 🦭
+New sector management APIs makes it possible to import partially sealed sectors into Lotus. This release implements all SaaS<->Lotus interactions needed for such services to work. Deep dive into the new APIs here: https://github.com/filecoin-project/lotus/discussions/9079#discussioncomment-3652044
+
+⏳ **Propagation delay** ⌛️
+In v1.17.2 the default PropagationDelay has been raised from 6 seconds -> 10 seconds, and you can tune this yourself with the `PROPAGATION_DELAY_SECS` environment variable. This means you will now wait for 10 seconds for other blocks to arrive from the network before computing a winningPoSt (if eligible). In your `lotus-miner` logs that means you will see this "baseDeltaSeconds": 10 as default.
+
+⚠️ **Please note that Lotus v1.17.2 will require a Go-version of v1.18.1 or higher!**
+
+## New features
+- feat: sealing: Partially sealed sector import ([filecoin-project/lotus#9210](https://github.com/filecoin-project/lotus/pull/9210))
+ - Implements support for importing (partially) sealed sectors which is needed for enabling external sealing services.
+- feat: sealing: Use bitfields to manage sector numbers ([filecoin-project/lotus#9183](https://github.com/filecoin-project/lotus/pull/9183))
+ - Needed for Sealing-as-a-Service. Move sector number assigning logic to use stored bitfields instead of stored counters. Makes it possible to reserve ranges of sector numbers, see the sector assigner state and view sector number reservations.
+- feat: env: propagation delay ([filecoin-project/lotus#9290](https://github.com/filecoin-project/lotus/pull/9290))
+ - The default propagation delay is raised to 10 seconds from 6 seconds. Ability to set it yourself with the `PROPAGATION_DELAY_SECS` environment variable.
+- feat: cli: lotus info cmd ([filecoin-project/lotus#9233](https://github.com/filecoin-project/lotus/pull/9233))
+ - A new `lotus info` command that prints useful node information in one place.
+- feat: proving: Introduce manual sector fault recovery (#9144) ([filecoin-project/lotus#9144](https://github.com/filecoin-project/lotus/pull/9144))
+ - Allow users to declare fault recovery messages manually with the `lotus-miner proving recover-faults` command, rather than waiting for it to happen automatically before windowPost.
+- feat: api: Reintroduce StateActorManifestCID ([filecoin-project/lotus#9201](https://github.com/filecoin-project/lotus/pull/9201))
+ - Adds ability to retrieve the Actor Manifest CID through the api.
+- feat: message: Add uuid to mpool message sent to chain node from miner ([filecoin-project/lotus#9174](https://github.com/filecoin-project/lotus/pull/9174))
+ - Adds a UUID to each message sent by the `lotus-miner` to the daemon. A requirement needed for https://github.com/filecoin-project/lotus/issues/9130
+- feat: message: Add retries to mpool push message from lotus-miner ([filecoin-project/lotus#9177](https://github.com/filecoin-project/lotus/pull/9177))
+ - Retries to mpool push message API in case of unavailability of the lotus chain node.
+
+**Network 17 related features :**
+- feat: network: add nv17 and integrate the corresponding go state type ([filecoin-project/lotus#9267](https://github.com/filecoin-project/lotus/pull/9267))
+- feat: cli: print beneficiary info in state miner-info ([filecoin-project/lotus#9308](https://github.com/filecoin-project/lotus/pull/9308))
+- feat: api/cli: change beneficiary propose and confirm for actors and multisigs. ([filecoin-project/lotus#9307](https://github.com/filecoin-project/lotus/pull/9307))
+- feat: api/cli: beneficiary withdraw api and cli ([filecoin-project/lotus#9296](https://github.com/filecoin-project/lotus/pull/9296))
+
+## Enhancements
+- feat: sectors renew --only-cc ([filecoin-project/lotus#9184](https://github.com/filecoin-project/lotus/pull/9184))
+ - Exlude extending deal-related sectors with the `--only-cc` option when using the `lotus-miner sectors renew`
+- feat: miner: display updated & update-cache for storage list ([filecoin-project/lotus#9323](https://github.com/filecoin-project/lotus/pull/9323))
+ - Show amount of `updated` & `update-cache` sectors in each storage path in the `lotus-miner storage list` output
+- feat: add descriptive errors to markets event handler ([filecoin-project/lotus#9326](https://github.com/filecoin-project/lotus/pull/9326))
+ - More descriptive market error logs
+- feat: cli: Add option to terminate sectors from worker address ([filecoin-project/lotus#9291](https://github.com/filecoin-project/lotus/pull/9291))
+ - Adds a flag to allow either owner address or worker address to send terminate sectors message.
+- fix: cli: actor-cids cli command now defaults to current network ([filecoin-project/lotus#9321](https://github.com/filecoin-project/lotus/pull/9321))
+ - Makes the command defaults to the current network.
+- fix: ux: Output bytes in `lotus client commP` cmd ([filecoin-project/lotus#9189](https://github.com/filecoin-project/lotus/pull/9189))
+ - Adds an additional line that outputs bytes in the `lotus client commP` command.
+- fix: sealing: Add information on what worker a job was assigned to in logs ([filecoin-project/lotus#9151](https://github.com/filecoin-project/lotus/pull/9151))
+ - Adds the worker hostname into the assignment logs.
+- refactor: sealing pipeline: Remove useless storage adapter code ([filecoin-project/lotus#9142](https://github.com/filecoin-project/lotus/pull/9142)
+ - Remove proxy code in `storage/miner.go` / `storage/miner_sealing.go`, call the pipeline directly instead.
+
+## Bug fixes
+- fix: ffiwrapper: Close readers in AddPiece ([filecoin-project/lotus#9328](https://github.com/filecoin-project/lotus/pull/9328))
+- fix: sealing: Drop unused PreCommitInfo from pipeline.SectorInfo ([filecoin-project/lotus#9325](https://github.com/filecoin-project/lotus/pull/9325))
+- fix: cli: fix panic in `lotus-miner actor control list` ([filecoin-project/lotus#9241](https://github.com/filecoin-project/lotus/pull/9241))
+- fix: sealing: Abort upgrades in sectors with no deals ([filecoin-project/lotus#9310](https://github.com/filecoin-project/lotus/pull/9310))
+- fix: sealing: Make DataCid resource env vars make more sense ([filecoin-project/lotus#9231](https://github.com/filecoin-project/lotus/pull/9231))
+- fix: cli: Option to specify --from msg sender ([filecoin-project/lotus#9237](https://github.com/filecoin-project/lotus/pull/9237))
+- fix: ux: better ledger rejection error ([filecoin-project/lotus#9242](https://github.com/filecoin-project/lotus/pull/9242))
+- fix: ux: msg receipt for actor withdrawal ([filecoin-project/lotus#9155](https://github.com/filecoin-project/lotus/pull/9155))
+- fix: ux: exclude negative available balance from spendable amount ([filecoin-project/lotus#9182](https://github.com/filecoin-project/lotus/pull/9182))
+- fix: sealing: Avoid panicking in handleUpdateActivating on startup ([filecoin-project/lotus#9331](https://github.com/filecoin-project/lotus/pull/9331))
+- fix: api: DataCid - ensure reader is closed ([filecoin-project/lotus#9230](https://github.com/filecoin-project/lotus/pull/9230))
+- fix: verifreg: serialize RmDcProposalID as int, not tuple ([filecoin-project/lotus#9206](https://github.com/filecoin-project/lotus/pull/9206))
+- fix: api: Ignore uuid check for messages with uuid not set ([filecoin-project/lotus#9303](https://github.com/filecoin-project/lotus/pull/9303))
+- fix: cgroupV1: memory.memsw.usage_in_bytes: no such file or directory ([filecoin-project/lotus#9202](https://github.com/filecoin-project/lotus/pull/9202))
+- fix: miner: init miner's with 32GiB sectors by default ([filecoin-project/lotus#9364](https://github.com/filecoin-project/lotus/pull/9364))
+- fix: worker: Close all storage paths on worker shutdown ([filecoin-project/lotus#9153](https://github.com/filecoin-project/lotus/pull/9153))
+- fix: build: set PropagationDelaySecs correctly ([filecoin-project/lotus#9358](https://github.com/filecoin-project/lotus/pull/9358))
+- fix: renew --only-cc with sectorfile ([filecoin-project/lotus#9428](https://github.com/filecoin-project/lotus/pull/9428))
+
+## Dependency updates
+- github.com/filecoin-project/go-fil-markets (v1.23.1 -> v1.24.0)
+- github.com/filecoin-project/go-jsonrpc (v0.1.5 -> v0.1.7)
+- github.com/filecoin-project/go-state-types (v0.1.10 -> v0.1.12-beta)
+- github.com/filecoin-project/go-commp-utils/nonffi (null -> v0.0.0-20220905160352-62059082a837)
+- deps: go-libp2p-pubsub v0.8.0 ([filecoin-project/lotus#9229](https://github.com/filecoin-project/lotus/pull/9229))
+- deps: libp2p v0.22 ([filecoin-project/lotus#9216](https://github.com/filecoin-project/lotus/pull/9216))
+- deps: Use latest cbor-gen ([filecoin-project/lotus#9335](https://github.com/filecoin-project/lotus/pull/9335))
+- chore: update bitswap and some libp2p packages ([filecoin-project/lotus#9279](https://github.com/filecoin-project/lotus/pull/9279))
+
+## Others
+- chore: merge releases into master after v1.17.1 release ([filecoin-project/lotus#9283](https://github.com/filecoin-project/lotus/pull/9283))
+- chore: docs: Fix dead links to docs.filecoin.io ([filecoin-project/lotus#9304](https://github.com/filecoin-project/lotus/pull/9304))
+- chore: deps: update FFI ([filecoin-project/lotus#9330](https://github.com/filecoin-project/lotus/pull/9330))
+- chore: seed: add cmd for adding signers to rkh to genesis ([filecoin-project/lotus#9198](https://github.com/filecoin-project/lotus/pull/9198))
+- chore: fix typo in comment ([filecoin-project/lotus#9161](https://github.com/filecoin-project/lotus/pull/9161))
+- chore: cli: cleanup and standardize cli ([filecoin-project/lotus#9317](https://github.com/filecoin-project/lotus/pull/9317))
+- chore: versioning: Bump version to v1.17.2-dev ([filecoin-project/lotus#9147](https://github.com/filecoin-project/lotus/pull/9147))
+- chore: release: v1.17.2-rc1 ([filecoin-project/lotus#9339](https://github.com/filecoin-project/lotus/pull/9339))
+- feat: shed: add a --max-size flag to vlog2car ([filecoin-project/lotus#9212](https://github.com/filecoin-project/lotus/pull/9212))
+- fix: docsgen: revert rename of API Name to Num ([filecoin-project/lotus#9315](https://github.com/filecoin-project/lotus/pull/9315))
+- fix: ffi: Revert accidental filecoin-ffi downgrade from #9144 ([filecoin-project/lotus#9277](https://github.com/filecoin-project/lotus/pull/9277))
+- fix: miner: Call SyncBasefeeCheck from `lotus info` ([filecoin-project/lotus#9281](https://github.com/filecoin-project/lotus/pull/9281))
+- fix: mock sealer: grab lock in ReadPiece ([filecoin-project/lotus#9207](https://github.com/filecoin-project/lotus/pull/9207))
+- refactor: use `os.ReadDir` for lightweight directory reading ([filecoin-project/lotus#9282](https://github.com/filecoin-project/lotus/pull/9282))
+- tests: cli: Don't panic with no providers in client retrieve ([filecoin-project/lotus#9232](https://github.com/filecoin-project/lotus/pull/9232))
+- build: artifacts: butterfly ([filecoin-project/lotus#9027](https://github.com/filecoin-project/lotus/pull/9027))
+- build: Use lotus snap (and fix typo) for packer builds ([filecoin-project/lotus#9152](https://github.com/filecoin-project/lotus/pull/9152))
+- build: Update xcode version for macos builds ([filecoin-project/lotus#9170](https://github.com/filecoin-project/lotus/pull/9170))
+- ci: build: Snap daemon autorun disable ([filecoin-project/lotus#9167](https://github.com/filecoin-project/lotus/pull/9167))
+- ci: Use golang 1.18.1 to build appimage ([filecoin-project/lotus#9389](https://github.com/filecoin-project/lotus/pull/9389))
+- ci: Don't publish new homebrew releases for RC builds ([filecoin-project/lotus#9350](https://github.com/filecoin-project/lotus/pull/9350))
+- Merge branch 'deps/go-libp2p-v0.21'
+
+Contributors
+
+| Contributor | Commits | Lines ± | Files Changed |
+|-------------|---------|---------|---------------|
+| Aayush Rajasekaran | 8 | +23010/-2122 | 109 |
+| Aayush | 15 | +6168/-2679 | 360 |
+| Łukasz Magiera | 69 | +6462/-2137 | 606 |
+| Geoff Stuart | 19 | +3080/-1177 | 342 |
+| Marco Munizaga | 16 | +543/-424 | 41 |
+| Shrenuj Bansal | 30 | +485/-419 | 88 |
+| LexLuthr | 3 | +498/-12 | 19 |
+| Phi | 15 | +330/-70 | 17 |
+| Jennifer Wang | 7 | +132/-12 | 11 |
+| TippyFlitsUK | 1 | +43/-45 | 12 |
+| Steven Allen | 1 | +18/-28 | 2 |
+| Frrist | 1 | +19/-11 | 2 |
+| Eng Zer Jun | 1 | +14/-11 | 6 |
+| Dirk McCormick | 2 | +23/-1 | 3 |
+| Ian Davis | 3 | +7/-9 | 3 |
+| Masih H. Derkani | 1 | +11/-0 | 1 |
+| Anton Evangelatov | 1 | +11/-0 | 1 |
+| Yu | 2 | +4/-4 | 5 |
+| Hannah Howard | 1 | +4/-4 | 1 |
+| Phi-rjan | 1 | +1/-2 | 1 |
+| Jiaying Wang | 1 | +3/-0 | 1 |
+| nujz | 1 | +1/-1 | 1 |
+| Rob Quist | 1 | +1/-1 | 1 |
+
+# v1.17.1 / 2022-09-06
+
+This is an optional release of Lotus. This release introduces the [Splitstore v2 - beta](https://github.com/filecoin-project/lotus/blob/master/blockstore/splitstore/README.md)(beta). Splitstore aims to reduce the node performance impact that's caused by the Filecoin's very large, and continuously growing datastore. Splitstore v2 introduces the coldstore auto prune/GC feature & some improvements for the hotstore. We welcome all lotus users to join the early testers and try the new Splitstore out, you can leave any feedback or report issues in [this discussion](https://github.com/filecoin-project/lotus/discussions/9179) or create an issue. As always, multiple small bug fixes, new features & improvements are also included in this release.
+
+
+## New features
+
+- feat:chain:splitstore auto prune ([filecoin-project/lotus#9123](https://github.com/filecoin-project/lotus/pull/9123))
+ - Trigger SplitStore chain prune on head events. [Link to the documentation](https://lotus.filecoin.io/lotus/manage/chain-management/#cold-store-garbage-collection)
+- feat:chain:splitstore chain prune ([filecoin-project/lotus#9056](https://github.com/filecoin-project/lotus/pull/9056))
+ - Adds `chain prune` command to trigger manual garbage collection. [Link to the documentation](https://lotus.filecoin.io/lotus/manage/chain-management/#cold-store-garbage-collection)
+- feat: storage: Path type filters ([filecoin-project/lotus#9013](https://github.com/filecoin-project/lotus/pull/9013))
+ - Adds new fields to `sectorstore.json` to allow file type filtering. [Link to the documentation](https://lotus.filecoin.io/storage-providers/operate/custom-storage-layout/#filter-sector-types-1)
+- feat: sealing: storage redeclare/detach ([filecoin-project/lotus#9032](https://github.com/filecoin-project/lotus/pull/9032))
+ - Adds new Lotus commands to detach and redeclare storage paths. [Link to the documentation](https://lotus.filecoin.io/storage-providers/operate/custom-storage-layout/#detach-storage-paths)
+- feat: worker: Add stop cmd for lotus worker ([filecoin-project/lotus#9101](https://github.com/filecoin-project/lotus/pull/9101))
+ - Adds new `lotus-worker stop` command. [Link to the documentation](https://lotus.filecoin.io/storage-providers/seal-workers/seal-workers/#stop-the-worker)
+- feat: market: Add lotus-shed cmd to get total active deal storage ([filecoin-project/lotus#9113](https://github.com/filecoin-project/lotus/pull/9113))
+ - `get-deals-total-storage` - View the total storage available in all active market deals
+- feat: wdpost: Envvar for limiting recovering sectors ([filecoin-project/lotus#9106](https://github.com/filecoin-project/lotus/pull/9106))
+ - Adds new envvar to limit the number of sectors declared in the recover message
+
+
+## Improvements
+
+- feat: sealing: Allow overriding worker hostname ([filecoin-project/lotus#9116](https://github.com/filecoin-project/lotus/pull/9116))
+- feat: build: run fiximports on make actors-gen ([filecoin-project/lotus#9114](https://github.com/filecoin-project/lotus/pull/9114))
+- feat: FVM: always enable tracing for user-triggered executions ([filecoin-project/lotus#9036](https://github.com/filecoin-project/lotus/pull/9036))
+- feat: miner cli: proving deadline command enchantments ([filecoin-project/lotus#9109](https://github.com/filecoin-project/lotus/pull/9109))
+- FVM: Use MaxInt64 for Implicit Message gas limits ([filecoin-project/lotus#9037](https://github.com/filecoin-project/lotus/pull/9037))
+- lotus shed addr decode
+- push lotus-gateway to docker hub ([filecoin-project/lotus#8969](https://github.com/filecoin-project/lotus/pull/8969))
+- Review Response
+- test: net: net and conngater tests ([filecoin-project/lotus#8084](https://github.com/filecoin-project/lotus/pull/8084))
+- Update FFI ([filecoin-project/lotus#9139](https://github.com/filecoin-project/lotus/pull/9139))
+
+## Bug Fixes
+
+- backport: 9153: detach storage on worker shutdown ([filecoin-project/lotus#9127](https://github.com/filecoin-project/lotus/pull/9165))
+- fix makegen
+- fix: build: use GOCC when building lotus-fountain ([filecoin-project/lotus#9127](https://github.com/filecoin-project/lotus/pull/9127))
+- fix: ci: Forgot a .sh on the end of a the new publish script ([filecoin-project/lotus#9088](https://github.com/filecoin-project/lotus/pull/9088))
+- fix: cli: ./lotus-miner actor control list, if the owner is not account ([filecoin-project/lotus#9072](https://github.com/filecoin-project/lotus/pull/9072))
+- fix: deps: update FFI to fix a slow memory leak ([filecoin-project/lotus#9042](https://github.com/filecoin-project/lotus/pull/9042))
+- fix: FVM: record message applied metrics ([filecoin-project/lotus#9052](https://github.com/filecoin-project/lotus/pull/9052))
+- fix: gas: estimate gas with a zero base-fee ([filecoin-project/lotus#8991](https://github.com/filecoin-project/lotus/pull/8991))
+- fix: post: restrict recoveries per deadline ([filecoin-project/lotus#9111](https://github.com/filecoin-project/lotus/pull/9111))
+- fix: sealing: Workaround for sealing bug ([filecoin-project/lotus#9043](https://github.com/filecoin-project/lotus/pull/9043))
+- fix: storage: don't panic in getCommitCutoff when precommit is not found ([filecoin-project/lotus#9141](https://github.com/filecoin-project/lotus/pull/9141))
+- fix: test: deflake TestQuotePriceForUnsealedRetrieval ([filecoin-project/lotus#9084](https://github.com/filecoin-project/lotus/pull/9084))
+
+## Dependency Updates
+
+- github.com/multiformats/go-multibase (v0.0.3 -> v0.1.1)
+
+## Others
+
+- chore: ci: Update xcode version for macos builds ([filecoin-project/lotus#9164)](https://github.com/filecoin-project/lotus/pull/9164))
+- Merge branch 'docs/ysrotciv-desc'
+- Merge branch 'feat/f8-worker-env'
+- Merge branch 'LexLuthr-feat/minerWithdrawBalanceAPI'
+- Merge branch 'LexLuthr-feat/SchedRemoveRequest'
+- base256emoji ([filecoin-project/lotus#9038)](https://github.com/filecoin-project/lotus/pull/9038))
+- chore: interop: update interop assets ([filecoin-project/lotus#9093)](https://github.com/filecoin-project/lotus/pull/9093))
+- chore: merge: releases (v1.17.0) to master ([filecoin-project/lotus#9146)](https://github.com/filecoin-project/lotus/pull/9146))
+- chore: sealer: Fixup typos ([filecoin-project/lotus#9040)](https://github.com/filecoin-project/lotus/pull/9040))
+- chore:docs:remove readme reference to deprecated specs-actors ([filecoin-project/lotus#8984)](https://github.com/filecoin-project/lotus/pull/8984))
+- ci : Change default shell options for snapcraft publish ([filecoin-project/lotus#9122)](https://github.com/filecoin-project/lotus/pull/9122))
+- ci: More tweaks to snapcraft release process ([filecoin-project/lotus#9090)](https://github.com/filecoin-project/lotus/pull/9090))
+- ci: Publish to both lotus and lotus-filecoin for snap ([filecoin-project/lotus#9119)](https://github.com/filecoin-project/lotus/pull/9119))
+- ci: Run snap builds for lotus and lotus-filecoin in parallel ([filecoin-project/lotus#9133)](https://github.com/filecoin-project/lotus/pull/9133))
+- ci: Switches goreleaser notes back to default (keep-existing) ([filecoin-project/lotus#9120)](https://github.com/filecoin-project/lotus/pull/9120))
+- ci: update snapcraft and release flow logic ([filecoin-project/lotus#8994)](https://github.com/filecoin-project/lotus/pull/8994))
+- ci: Use goreleaser to build macos universal binaries (including M1 macs) ([filecoin-project/lotus#9096)](https://github.com/filecoin-project/lotus/pull/9096))
+- ci:testing:remove codecov ([filecoin-project/lotus#9062)](https://github.com/filecoin-project/lotus/pull/9062))
+
+
+Contributors
+
+| Contributor | Commits | Lines ± | Files Changed |
+|-------------|---------|---------|---------------|
+| Łukasz Magiera | 34 | +2329/-317 | 163 |
+| ZenGround0 | 2 | +1527/-89 | 38 |
+| Ian Davis | 14 | +751/-232 | 30 |
+| LexLuthr | 17 | +480/-225 | 63 |
+| TheMenko | 4 | +323/-61 | 5 |
+| Aayush | 10 | +285/-92 | 30 |
+| beck | 3 | +143/-93 | 3 |
+| Steven Allen | 4 | +95/-75 | 9 |
+| zenground0 | 5 | +44/-116 | 9 |
+| Shrenuj Bansal | 7 | +136/-7 | 16 |
+| Patrick Deuse | 3 | +76/-57 | 3 |
+| Jennifer Wang | 3 | +6/-52 | 11 |
+| zl | 2 | +20/-16 | 2 |
+| Aayush Rajasekaran | 2 | +6/-6 | 2 |
+| Clint Armstrong | 1 | +7/-3 | 1 |
+| Cory Schwartz | 2 | +9/-0 | 2 |
+| Jorropo | 1 | +3/-2 | 2 |
+| Geoff Stuart | 1 | +5/-0 | 1 |
+| Frank Y | 1 | +2/-2 | 2 |
+| Aloxaf | 1 | +2/-2 | 1 |
+
+
+# Lotus changelog
+
# v1.17.0 / 2022-08-02
This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes.
@@ -1336,7 +1724,7 @@ storage providers and clients.
## Highlights
- 🌟🌟🌟 Introduce Dagstore and CARv2 for deal-making (#6671) ([filecoin-project/lotus#6671](https://github.com/filecoin-project/lotus/pull/6671))
- - **[lotus miner markets' Dagstore](https://docs.filecoin.io/mine/lotus/dagstore/#conceptual-overview)** is a
+ - **[lotus miner markets' Dagstore](https://lotus.filecoin.io/storage-providers/operate/dagstore/)** is a
component of the `markets` subsystem in lotus-miner. It is a sharded store to hold large IPLD graphs efficiently,
packaged as location-transparent attachable CAR files and it replaces the former Badger staging blockstore. It
is designed to provide high efficiency and throughput, and minimize resource utilization during deal-making operations.
@@ -1344,18 +1732,18 @@ storage providers and clients.
blockstores, which are served as the direct medium for data exchanges in markets for both storage and retrieval
deal making without requiring intermediate buffers.
- In the future, lotus will leverage and interact with Dagstore a lot for new features and improvements for deal
- making, therefore, it's highly recommended to lotus users to go through [Lotus Miner: About the markets dagstore](https://docs.filecoin.io/mine/lotus/dagstore/#conceptual-overview) thoroughly to learn more about Dagstore's
+ making, therefore, it's highly recommended to lotus users to go through [Lotus Miner: About the markets dagstore](https://lotus.filecoin.io/storage-providers/operate/dagstore/) thoroughly to learn more about Dagstore's
conceptual overview, terminology, directory structure, configuration and so on.
- **Note**:
- When you first start your lotus-miner or market subsystem with this release, a one-time/first-time **dagstore migration** will be triggered which replaces the former Badger staging blockstore with dagstore. We highly
- recommend storage providers to read this [section](https://docs.filecoin.io/mine/lotus/dagstore/#first-time-migration) to learn more about
+ recommend storage providers to read this [section](https://lotus.filecoin.io/storage-providers/operate/dagstore/#first-time-migration) to learn more about
what the process does, what to expect and how monitor it.
- It is highly recommended to **wait all ongoing data transfer to finish or cancel inbound storage deals that
are still transferring**, using the `lotus-miner data-transfers cancel` command before upgrade your market nodes. Reason being that the new dagstore changes attributes in the internal deal state objects, and the paths to the staging CARs where the deal data was being placed will be lost.
- ‼️Having your dags initialized will become important in the near feature for you to provide a better storage
and retrieval service. We'd suggest you to start [forced bulk initialization] soon if possible as this process
places relatively high IP workload on your storage system and is better to be carried out gradually and over a
- longer timeframe. Read how to do properly perform a force bulk initialization [here](https://docs.filecoin.io/mine/lotus/dagstore/#forcing-bulk-initialization).
+ longer timeframe. Read how to do properly perform a force bulk initialization [here](https://lotus.filecoin.io/storage-providers/operate/dagstore/#forcing-bulk-initialization).
- ⏮ Rollback Alert(from v1.11.2-rcX to any version lower): If a storages deal is initiated with M1/v1.11.2(-rcX)
release, it needs to get to the `StorageDealAwaitingPrecommit` state before you can do a version rollback or the markets process may panic.
- 💙 **Special thanks to [MinerX fellows for testing and providing valuable feedbacks](https://github.com/filecoin-project/lotus/discussions/6852) for Dagstore in the past month!**
@@ -1485,8 +1873,8 @@ Contributors
This is a **highly recommended** but optional Lotus v1.11.1 release that introduces many deal making and datastore improvements and new features along with other bug fixes.
## Highlights
-- ⭐️⭐️⭐️[**lotus-miner market subsystem**](https://docs.filecoin.io/mine/lotus/split-markets-miners/#frontmatter-title) is introduced in this release! It is **highly recommended** for storage providers to run markets processes on a separate machine! Doing so, only this machine needs to exposes public ports for deal making. This also means that the other miner operations can now be completely isolated by from the deal making processes and storage providers can stop and restarts the markets process without affecting an ongoing Winning/Window PoSt!
- - More details on the concepts, architecture and how to split the market process can be found [here](https://docs.filecoin.io/mine/lotus/split-markets-miners/#concepts).
+- ⭐️⭐️⭐️[**lotus-miner market subsystem**](https://lotus.filecoin.io/storage-providers/advanced-configurations/split-markets-miners/) is introduced in this release! It is **highly recommended** for storage providers to run markets processes on a separate machine! Doing so, only this machine needs to exposes public ports for deal making. This also means that the other miner operations can now be completely isolated by from the deal making processes and storage providers can stop and restarts the markets process without affecting an ongoing Winning/Window PoSt!
+ - More details on the concepts, architecture and how to split the market process can be found [here](https://lotus.filecoin.io/storage-providers/advanced-configurations/split-markets-miners/#concepts).
- Base on your system setup(running on separate machines, same machine and so on), please see the suggested practice by community members [here](https://github.com/filecoin-project/lotus/discussions/7047#discussion-3515335).
- Note: if you are running lotus-worker on a different machine, you will need to set `MARKETS_API_INFO` for certain CLI to work properly. This will be improved by #7072.
- Huge thanks to MinerX fellows for [helping testing the implementation, reporting the issues so they were fixed by now and providing feedbacks](https://github.com/filecoin-project/lotus/discussions/6861) to user docs in the past three weeks!
@@ -1496,7 +1884,7 @@ This is a **highly recommended** but optional Lotus v1.11.1 release that introd
- `AvailableBalanceBuffer`: minimum available balance to keep in the miner actor before sending it with messages, default is 0FIL.
- `DisableCollateralFallback`: whether to send collateral with messages even if there is no available balance in the miner actor, default is `false`.
- Config for deal publishing control addresses ([filecoin-project/lotus#6697](https://github.com/filecoin-project/lotus/pull/6697))
- - Set `DealPublishControl` to set the wallet used for sending `PublishStorageDeals` messages, instructions [here](https://docs.filecoin.io/mine/lotus/miner-addresses/#control-addresses).
+ - Set `DealPublishControl` to set the wallet used for sending `PublishStorageDeals` messages, instructions [here](https://lotus.filecoin.io/storage-providers/operate/addresses/#control-addresses).
- Config UX improvements ([filecoin-project/lotus#6848](https://github.com/filecoin-project/lotus/pull/6848))
- You can now preview the the default and updated node config by running `lotus/lotus-miner config default/updated`
@@ -1925,7 +2313,7 @@ Note that this release is built on top of Lotus v1.9.0. Enterprising users can u
FIPs [0008](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0008.md) and [0013](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0013.md) combine to allow for a significant increase in the rate of onboarding storage on the Filecoin network. This aims to lead to more useful data being stored on the network, reduced network congestion, and lower network base fee.
-**Check out the documentation [here](https://docs.filecoin.io/mine/lotus/miner-configuration/#precommitsectorsbatch) for details on the new Lotus miner sealing config options, [here](https://docs.filecoin.io/mine/lotus/miner-configuration/#fees-section) for fee config options, and explanations of the new features.**
+**Check out the documentation [here]((https://lotus.filecoin.io/storage-providers/advanced-configurations/sealing/#precommitsectorsbatch) for details on the new Lotus miner sealing config options, [here](https://lotus.filecoin.io/storage-providers/setup/configuration/#fees-section) for fee config options, and explanations of the new features.**
Note:
- We recommend to keep `PreCommitSectorsBatch` as 1.
@@ -1941,7 +2329,7 @@ Given these assumptions:
- We'd expect a network storage growth rate of around 530PiB per day. 😳 🎉 🥳 😅
- We'd expect network bandwidth dedicated to `SubmitWindowedPoSt` to grow by about 0.02% per day.
-- We'd expect the [state-tree](https://spec.filecoin.io/#section-systems.filecoin_vm.state_tree) (and therefore [snapshot](https://docs.filecoin.io/get-started/lotus/chain/#lightweight-snapshot)) size to grow by 1.16GiB per day.
+- We'd expect the [state-tree](https://spec.filecoin.io/#section-systems.filecoin_vm.state_tree) (and therefore [snapshot](https://lotus.filecoin.io/lotus/manage/chain-management/#lightweight-snapshot)) size to grow by 1.16GiB per day.
- Nearly all of the state-tree growth is expected to come from new sector metadata.
- We'd expect the daily lotus datastore growth rate to increase by about 10-15% (from current ~21GiB/day).
- Most "growth" of the lotus datastore is due to "churn", historical data that's no longer referenced by the latest state-tree.
@@ -1962,7 +2350,7 @@ Included in the HyperDrive upgrade is [FIP-0015](https://github.com/filecoin-pro
- Implement FIP-0015 ([filecoin-project/lotus#6361](https://github.com/filecoin-project/lotus/pull/6361))
- Integrate FIP0013 and FIP0008 ([filecoin-project/lotus#6235](https://github.com/filecoin-project/lotus/pull/6235))
- - [Configuration docs and cli examples](https://docs.filecoin.io/mine/lotus/miner-configuration/#precommitsectorsbatch)
+ - [Configuration docs and cli examples](https://lotus.filecoin.io/storage-providers/advanced-configurations/sealing/#precommitsectorsbatch)
- [cli docs](https://github.com/filecoin-project/lotus/blob/master/documentation/en/cli-lotus-miner.md#lotus-miner-sectors-batching)
- Introduce gas prices for aggregate verifications ([filecoin-project/lotus#6347](https://github.com/filecoin-project/lotus/pull/6347))
- Introduce v5 actors ([filecoin-project/lotus#6195](https://github.com/filecoin-project/lotus/pull/6195))
@@ -2280,7 +2668,7 @@ Note that this release does NOT set an upgrade epoch for v3 actors to take effec
- [#5309](https://github.com/filecoin-project/lotus/pull/5309) Batch multiple deals in one `PublishStorageMessages`
- [#5411](https://github.com/filecoin-project/lotus/pull/5411) Handle batch `PublishStorageDeals` message in sealing recovery
- [#5505](https://github.com/filecoin-project/lotus/pull/5505) Exclude expired deals from batching in `PublishStorageDeals` messages
- - Added `PublishMsgPeriod` and `MaxDealsPerPublishMsg` to miner `Dealmaking` [configuration](https://docs.filecoin.io/mine/lotus/miner-configuration/#dealmaking-section). See how they work [here](https://docs.filecoin.io/mine/lotus/miner-configuration/#publishing-several-deals-in-one-message).
+ - Added `PublishMsgPeriod` and `MaxDealsPerPublishMsg` to miner `Dealmaking` [configuration](https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#dealmaking-section). See how they work [here](https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#publishing-several-deals-in-one-message).
- [#5538](https://github.com/filecoin-project/lotus/pull/5538), [#5549](https://github.com/filecoin-project/lotus/pull/5549) Added a command to list pending deals and force publish messages.
- Run `lotus-miner market pending-publish`
- [#5428](https://github.com/filecoin-project/lotus/pull/5428) Moved waiting for `PublishStorageDeals` messages' receipt from markets to lotus
@@ -3633,4 +4021,4 @@ We are grateful for every contribution!
We are very excited to release **lotus** 0.1.0. This is our testnet release. To install lotus and join the testnet, please visit [lotu.sh](lotu.sh). Please file bug reports as [issues](https://github.com/filecoin-project/lotus/issues).
-A huge thank you to all contributors for this testnet release!
\ No newline at end of file
+A huge thank you to all contributors for this testnet release!
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..5c147e930
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,134 @@
+#####################################
+FROM golang:1.18.8-buster AS lotus-builder
+MAINTAINER Lotus Development Team
+
+RUN apt-get update && apt-get install -y ca-certificates build-essential clang ocl-icd-opencl-dev ocl-icd-libopencl1 jq libhwloc-dev
+
+ENV XDG_CACHE_HOME="/tmp"
+
+### taken from https://github.com/rust-lang/docker-rust/blob/master/1.63.0/buster/Dockerfile
+ENV RUSTUP_HOME=/usr/local/rustup \
+ CARGO_HOME=/usr/local/cargo \
+ PATH=/usr/local/cargo/bin:$PATH \
+ RUST_VERSION=1.63.0
+
+RUN set -eux; \
+ dpkgArch="$(dpkg --print-architecture)"; \
+ case "${dpkgArch##*-}" in \
+ amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='5cc9ffd1026e82e7fb2eec2121ad71f4b0f044e88bca39207b3f6b769aaa799c' ;; \
+ arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='e189948e396d47254103a49c987e7fb0e5dd8e34b200aa4481ecc4b8e41fb929' ;; \
+ *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \
+ esac; \
+ url="https://static.rust-lang.org/rustup/archive/1.25.1/${rustArch}/rustup-init"; \
+ wget "$url"; \
+ echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
+ chmod +x rustup-init; \
+ ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
+ rm rustup-init; \
+ chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
+ rustup --version; \
+ cargo --version; \
+ rustc --version;
+
+COPY ./ /opt/filecoin
+WORKDIR /opt/filecoin
+
+### make configurable filecoin-ffi build
+ARG FFI_BUILD_FROM_SOURCE=0
+ENV FFI_BUILD_FROM_SOURCE=${FFI_BUILD_FROM_SOURCE}
+
+RUN make clean deps
+
+ARG RUSTFLAGS=""
+ARG GOFLAGS=""
+
+RUN make buildall
+
+#####################################
+FROM ubuntu:20.04 AS lotus-base
+MAINTAINER Lotus Development Team
+
+# Base resources
+COPY --from=lotus-builder /etc/ssl/certs /etc/ssl/certs
+COPY --from=lotus-builder /lib/*/libdl.so.2 /lib/
+COPY --from=lotus-builder /lib/*/librt.so.1 /lib/
+COPY --from=lotus-builder /lib/*/libgcc_s.so.1 /lib/
+COPY --from=lotus-builder /lib/*/libutil.so.1 /lib/
+COPY --from=lotus-builder /usr/lib/*/libltdl.so.7 /lib/
+COPY --from=lotus-builder /usr/lib/*/libnuma.so.1 /lib/
+COPY --from=lotus-builder /usr/lib/*/libhwloc.so.5 /lib/
+COPY --from=lotus-builder /usr/lib/*/libOpenCL.so.1 /lib/
+
+RUN useradd -r -u 532 -U fc \
+ && mkdir -p /etc/OpenCL/vendors \
+ && echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd
+
+#####################################
+FROM lotus-base AS lotus
+MAINTAINER Lotus Development Team
+
+COPY --from=lotus-builder /opt/filecoin/lotus /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-shed /usr/local/bin/
+COPY scripts/docker-lotus-entrypoint.sh /
+
+ARG DOCKER_LOTUS_IMPORT_SNAPSHOT https://snapshots.mainnet.filops.net/minimal/latest
+ENV DOCKER_LOTUS_IMPORT_SNAPSHOT ${DOCKER_LOTUS_IMPORT_SNAPSHOT}
+ENV FILECOIN_PARAMETER_CACHE /var/tmp/filecoin-proof-parameters
+ENV LOTUS_PATH /var/lib/lotus
+ENV DOCKER_LOTUS_IMPORT_WALLET ""
+
+RUN mkdir /var/lib/lotus /var/tmp/filecoin-proof-parameters
+RUN chown fc: /var/lib/lotus /var/tmp/filecoin-proof-parameters
+
+VOLUME /var/lib/lotus
+VOLUME /var/tmp/filecoin-proof-parameters
+
+USER fc
+
+EXPOSE 1234
+
+ENTRYPOINT ["/docker-lotus-entrypoint.sh"]
+
+CMD ["-help"]
+
+#####################################
+FROM lotus-base AS lotus-all-in-one
+
+ENV FILECOIN_PARAMETER_CACHE /var/tmp/filecoin-proof-parameters
+ENV LOTUS_MINER_PATH /var/lib/lotus-miner
+ENV LOTUS_PATH /var/lib/lotus
+ENV LOTUS_WORKER_PATH /var/lib/lotus-worker
+ENV WALLET_PATH /var/lib/lotus-wallet
+
+COPY --from=lotus-builder /opt/filecoin/lotus /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-seed /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-shed /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-wallet /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-gateway /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-miner /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-worker /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-stats /usr/local/bin/
+COPY --from=lotus-builder /opt/filecoin/lotus-fountain /usr/local/bin/
+
+RUN mkdir /var/tmp/filecoin-proof-parameters
+RUN mkdir /var/lib/lotus
+RUN mkdir /var/lib/lotus-miner
+RUN mkdir /var/lib/lotus-worker
+RUN mkdir /var/lib/lotus-wallet
+RUN chown fc: /var/tmp/filecoin-proof-parameters
+RUN chown fc: /var/lib/lotus
+RUN chown fc: /var/lib/lotus-miner
+RUN chown fc: /var/lib/lotus-worker
+RUN chown fc: /var/lib/lotus-wallet
+
+
+VOLUME /var/tmp/filecoin-proof-parameters
+VOLUME /var/lib/lotus
+VOLUME /var/lib/lotus-miner
+VOLUME /var/lib/lotus-worker
+VOLUME /var/lib/lotus-wallet
+
+EXPOSE 1234
+EXPOSE 2345
+EXPOSE 3456
+EXPOSE 1777
diff --git a/Dockerfile.lotus b/Dockerfile.lotus
index 2f139a3c4..2278e8511 100644
--- a/Dockerfile.lotus
+++ b/Dockerfile.lotus
@@ -1,30 +1,47 @@
-FROM golang:1.18.1-buster AS builder-deps
+##### DEPRECATED
+
+FROM golang:1.18.8-buster AS builder-deps
MAINTAINER Lotus Development Team
RUN apt-get update && apt-get install -y ca-certificates build-essential clang ocl-icd-opencl-dev ocl-icd-libopencl1 jq libhwloc-dev
-ARG RUST_VERSION=nightly
ENV XDG_CACHE_HOME="/tmp"
+### taken from https://github.com/rust-lang/docker-rust/blob/master/1.63.0/buster/Dockerfile
ENV RUSTUP_HOME=/usr/local/rustup \
CARGO_HOME=/usr/local/cargo \
- PATH=/usr/local/cargo/bin:$PATH
+ PATH=/usr/local/cargo/bin:$PATH \
+ RUST_VERSION=1.63.0
-RUN wget "https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init"; \
+RUN set -eux; \
+ dpkgArch="$(dpkg --print-architecture)"; \
+ case "${dpkgArch##*-}" in \
+ amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='5cc9ffd1026e82e7fb2eec2121ad71f4b0f044e88bca39207b3f6b769aaa799c' ;; \
+ arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='e189948e396d47254103a49c987e7fb0e5dd8e34b200aa4481ecc4b8e41fb929' ;; \
+ *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \
+ esac; \
+ url="https://static.rust-lang.org/rustup/archive/1.25.1/${rustArch}/rustup-init"; \
+ wget "$url"; \
+ echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
chmod +x rustup-init; \
- ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION; \
+ ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
rm rustup-init; \
chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
rustup --version; \
cargo --version; \
rustc --version;
-
+### end rust
FROM builder-deps AS builder-local
MAINTAINER Lotus Development Team
COPY ./ /opt/filecoin
WORKDIR /opt/filecoin
+
+### make configurable filecoin-ffi build
+ARG FFI_BUILD_FROM_SOURCE=0
+ENV FFI_BUILD_FROM_SOURCE=${FFI_BUILD_FROM_SOURCE}
+
RUN make clean deps
@@ -52,14 +69,14 @@ MAINTAINER Lotus Development Team
# Base resources
COPY --from=builder /etc/ssl/certs /etc/ssl/certs
-COPY --from=builder /lib/x86_64-linux-gnu/libdl.so.2 /lib/
-COPY --from=builder /lib/x86_64-linux-gnu/librt.so.1 /lib/
-COPY --from=builder /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/
-COPY --from=builder /lib/x86_64-linux-gnu/libutil.so.1 /lib/
-COPY --from=builder /usr/lib/x86_64-linux-gnu/libltdl.so.7 /lib/
-COPY --from=builder /usr/lib/x86_64-linux-gnu/libnuma.so.1 /lib/
-COPY --from=builder /usr/lib/x86_64-linux-gnu/libhwloc.so.5 /lib/
-COPY --from=builder /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /lib/
+COPY --from=builder /lib/*/libdl.so.2 /lib/
+COPY --from=builder /lib/*/librt.so.1 /lib/
+COPY --from=builder /lib/*/libgcc_s.so.1 /lib/
+COPY --from=builder /lib/*/libutil.so.1 /lib/
+COPY --from=builder /usr/lib/*/libltdl.so.7 /lib/
+COPY --from=builder /usr/lib/*/libnuma.so.1 /lib/
+COPY --from=builder /usr/lib/*/libhwloc.so.5 /lib/
+COPY --from=builder /usr/lib/*/libOpenCL.so.1 /lib/
RUN useradd -r -u 532 -U fc \
&& mkdir -p /etc/OpenCL/vendors \
diff --git a/GO_VERSION_MIN b/GO_VERSION_MIN
new file mode 100644
index 000000000..1a31d398c
--- /dev/null
+++ b/GO_VERSION_MIN
@@ -0,0 +1 @@
+1.18.8
diff --git a/Makefile b/Makefile
index cee3e8d36..43c362b86 100644
--- a/Makefile
+++ b/Makefile
@@ -8,9 +8,11 @@ unexport GOFLAGS
GOCC?=go
GOVERSION:=$(shell $(GOCC) version | tr ' ' '\n' | grep go1 | sed 's/^go//' | awk -F. '{printf "%d%03d%03d", $$1, $$2, $$3}')
-ifeq ($(shell expr $(GOVERSION) \< 1018001), 1)
+GOVERSIONMIN:=$(shell cat GO_VERSION_MIN | awk -F. '{printf "%d%03d%03d", $$1, $$2, $$3}')
+
+ifeq ($(shell expr $(GOVERSION) \< $(GOVERSIONMIN)), 1)
$(warning Your Golang version is go$(shell expr $(GOVERSION) / 1000000).$(shell expr $(GOVERSION) % 1000000 / 1000).$(shell expr $(GOVERSION) % 1000))
-$(error Update Golang to version to at least 1.18.1)
+$(error Update Golang to version to at least $(shell cat GO_VERSION_MIN))
endif
# git modules that need to be loaded
@@ -64,7 +66,7 @@ CLEAN+=build/.update-modules
deps: $(BUILD_DEPS)
.PHONY: deps
-build-devnets: build lotus-seed lotus-shed lotus-wallet lotus-gateway lotus-fountain lotus-stats
+build-devnets: build lotus-seed lotus-shed
.PHONY: build-devnets
debug: GOFLAGS+=-tags=debug
@@ -160,18 +162,6 @@ benchmarks:
@curl -X POST 'http://benchmark.kittyhawk.wtf/benchmark' -d '@bench.json' -u "${benchmark_http_cred}"
.PHONY: benchmarks
-lotus-pond: 2k
- $(GOCC) build -o lotus-pond ./lotuspond
-.PHONY: lotus-pond
-BINS+=lotus-pond
-
-lotus-pond-front:
- (cd lotuspond/front && npm i && CI=false npm run build)
-.PHONY: lotus-pond-front
-
-lotus-pond-app: lotus-pond-front lotus-pond
-.PHONY: lotus-pond-app
-
lotus-fountain:
rm -f lotus-fountain
$(GOCC) build $(GOFLAGS) -o lotus-fountain ./cmd/lotus-fountain
@@ -299,9 +289,6 @@ type-gen: api-gen
$(GOCC) generate -x ./...
goimports -w api/
-method-gen: api-gen
- (cd ./lotuspond/front/src/chain && $(GOCC) run ./methodgen.go)
-
actors-code-gen:
$(GOCC) run ./gen/inline-gen . gen/inlinegen-data.json
$(GOCC) run ./chain/actors/agen
@@ -367,7 +354,7 @@ docsgen-openrpc-gateway: docsgen-openrpc-bin
fiximports:
./scripts/fiximports
-gen: actors-code-gen type-gen method-gen cfgdoc-gen docsgen api-gen circleci bundle-gen fiximports
+gen: actors-code-gen type-gen cfgdoc-gen docsgen api-gen circleci bundle-gen fiximports
@echo ">>> IF YOU'VE MODIFIED THE CLI OR CONFIG, REMEMBER TO ALSO MAKE docsgen-cli"
.PHONY: gen
@@ -379,7 +366,7 @@ snap: lotus lotus-miner lotus-worker
# separate from gen because it needs binaries
docsgen-cli: lotus lotus-miner lotus-worker
- python ./scripts/generate-lotus-cli.py
+ python3 ./scripts/generate-lotus-cli.py
./lotus config default > documentation/en/default-lotus-config.toml
./lotus-miner config default > documentation/en/default-lotus-miner-config.toml
.PHONY: docsgen-cli
diff --git a/README.md b/README.md
index 0b3062520..76cac2c7e 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
@@ -10,7 +10,7 @@
-
+
@@ -67,14 +67,14 @@ Fedora:
sudo dnf -y install gcc make git bzr jq pkgconfig mesa-libOpenCL mesa-libOpenCL-devel opencl-headers ocl-icd ocl-icd-devel clang llvm wget hwloc hwloc-devel
```
-For other distributions you can find the required dependencies [here.](https://docs.filecoin.io/get-started/lotus/installation/#system-specific) For instructions specific to macOS, you can find them [here.](https://docs.filecoin.io/get-started/lotus/installation/#macos)
+For other distributions you can find the required dependencies [here.](https://lotus.filecoin.io/lotus/install/prerequisites/#supported-platforms) For instructions specific to macOS, you can find them [here.](https://lotus.filecoin.io/lotus/install/macos/)
#### Go
-To build Lotus, you need a working installation of [Go 1.18.1 or higher](https://golang.org/dl/):
+To build Lotus, you need a working installation of [Go 1.18.8 or higher](https://golang.org/dl/):
```bash
-wget -c https://golang.org/dl/go1.18.1.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
+wget -c https://golang.org/dl/go1.18.8.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
```
**TIP:**
@@ -101,7 +101,7 @@ Note: The default branch `master` is the dev branch where the latest new feature
2. To join mainnet, checkout the [latest release](https://github.com/filecoin-project/lotus/releases).
- If you are changing networks from a previous Lotus installation or there has been a network reset, read the [Switch networks guide](https://docs.filecoin.io/get-started/lotus/switch-networks/) before proceeding.
+ If you are changing networks from a previous Lotus installation or there has been a network reset, read the [Switch networks guide](https://lotus.filecoin.io/lotus/manage/switch-networks/) before proceeding.
For networks other than mainnet, look up the current branch or tag/commit for the network you want to join in the [Filecoin networks dashboard](https://network.filecoin.io), then build Lotus for your specific network below.
@@ -113,8 +113,8 @@ Note: The default branch `master` is the dev branch where the latest new feature
Currently, the latest code on the _master_ branch corresponds to mainnet.
-3. If you are in China, see "[Lotus: tips when running in China](https://docs.filecoin.io/get-started/lotus/tips-running-in-china/)".
-4. This build instruction uses the prebuilt proofs binaries. If you want to build the proof binaries from source check the [complete instructions](https://docs.filecoin.io/get-started/lotus/installation/#build-and-install-lotus). Note, if you are building the proof binaries from source, [installing rustup](https://docs.filecoin.io/get-started/lotus/installation/#rustup) is also needed.
+3. If you are in China, see "[Lotus: tips when running in China](https://lotus.filecoin.io/lotus/configure/nodes-in-china/)".
+4. This build instruction uses the prebuilt proofs binaries. If you want to build the proof binaries from source check the [complete instructions](https://lotus.filecoin.io/lotus/install/prerequisites/). Note, if you are building the proof binaries from source, [installing rustup](https://lotus.filecoin.io/lotus/install/linux/#rustup) is also needed.
5. Build and install Lotus:
@@ -129,9 +129,9 @@ Note: The default branch `master` is the dev branch where the latest new feature
This will put `lotus`, `lotus-miner` and `lotus-worker` in `/usr/local/bin`.
- `lotus` will use the `$HOME/.lotus` folder by default for storage (configuration, chain data, wallets, etc). See [advanced options](https://docs.filecoin.io/get-started/lotus/configuration-and-advanced-usage/) for information on how to customize the Lotus folder.
+ `lotus` will use the `$HOME/.lotus` folder by default for storage (configuration, chain data, wallets, etc). See [advanced options](https://lotus.filecoin.io/lotus/configure/defaults/#environment-variables) for information on how to customize the Lotus folder.
-6. You should now have Lotus installed. You can now [start the Lotus daemon and sync the chain](https://docs.filecoin.io/get-started/lotus/installation/#start-the-lotus-daemon-and-sync-the-chain).
+6. You should now have Lotus installed. You can now [start the Lotus daemon and sync the chain](https://lotus.filecoin.io/lotus/install/linux/#start-the-lotus-daemon-and-sync-the-chain).
## License
diff --git a/api/api_common.go b/api/api_common.go
index 73a0c984c..2a887a26a 100644
--- a/api/api_common.go
+++ b/api/api_common.go
@@ -3,6 +3,7 @@ package api
import (
"context"
"fmt"
+ "time"
"github.com/google/uuid"
@@ -49,6 +50,9 @@ type Common interface {
// trigger graceful shutdown
Shutdown(context.Context) error //perm:admin
+ // StartTime returns node start time
+ StartTime(context.Context) (time.Time, error) //perm:read
+
// Session returns a random UUID of api provider session
Session(context.Context) (uuid.UUID, error) //perm:read
diff --git a/api/api_errors.go b/api/api_errors.go
new file mode 100644
index 000000000..fd157be5f
--- /dev/null
+++ b/api/api_errors.go
@@ -0,0 +1,42 @@
+package api
+
+import (
+ "errors"
+ "reflect"
+
+ "github.com/filecoin-project/go-jsonrpc"
+)
+
+const (
+ EOutOfGas = iota + jsonrpc.FirstUserCode
+ EActorNotFound
+)
+
+type ErrOutOfGas struct{}
+
+func (e *ErrOutOfGas) Error() string {
+ return "call ran out of gas"
+}
+
+type ErrActorNotFound struct{}
+
+func (e *ErrActorNotFound) Error() string {
+ return "actor not found"
+}
+
+var RPCErrors = jsonrpc.NewErrors()
+
+func ErrorIsIn(err error, errorTypes []error) bool {
+ for _, etype := range errorTypes {
+ tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface()
+ if errors.As(err, tmp) {
+ return true
+ }
+ }
+ return false
+}
+
+func init() {
+ RPCErrors.Register(EOutOfGas, new(*ErrOutOfGas))
+ RPCErrors.Register(EActorNotFound, new(*ErrActorNotFound))
+}
diff --git a/api/api_full.go b/api/api_full.go
index 2c98eaa53..0c281c12d 100644
--- a/api/api_full.go
+++ b/api/api_full.go
@@ -6,6 +6,7 @@ import (
"fmt"
"time"
+ "github.com/google/uuid"
blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
"github.com/libp2p/go-libp2p/core/peer"
@@ -17,9 +18,10 @@ import (
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- "github.com/filecoin-project/go-state-types/builtin/v8/market"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
abinetwork "github.com/filecoin-project/go-state-types/network"
@@ -527,6 +529,17 @@ type FullNode interface {
StateMarketDeals(context.Context, types.TipSetKey) (map[string]*MarketDeal, error) //perm:read
// StateMarketStorageDeal returns information about the indicated deal
StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*MarketDeal, error) //perm:read
+ // StateGetAllocationForPendingDeal returns the allocation for a given deal ID of a pending deal. Returns nil if
+ // pending allocation is not found.
+ StateGetAllocationForPendingDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
+ // StateGetAllocation returns the allocation for a given address and allocation ID.
+ StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifregtypes.AllocationId, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
+ // StateGetAllocations returns the all the allocations for a given client.
+ StateGetAllocations(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read
+ // StateGetClaim returns the claim for a given address and claim ID.
+ StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifregtypes.ClaimId, tsk types.TipSetKey) (*verifregtypes.Claim, error) //perm:read
+ // StateGetClaims returns the all the claims for a given provider.
+ StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) //perm:read
// StateComputeDataCID computes DataCID from a set of on-chain deals
StateComputeDataCID(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) //perm:read
// StateLookupID retrieves the ID address of the given address
@@ -751,6 +764,9 @@ type FullNode interface {
// LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that
// the path specified when calling CreateBackup is within the base path
CreateBackup(ctx context.Context, fpath string) error //perm:admin
+
+ RaftState(ctx context.Context) (*RaftStateData, error) //perm:read
+ RaftLeader(ctx context.Context) (peer.ID, error) //perm:read
}
type StorageAsk struct {
@@ -1000,8 +1016,12 @@ type RetrievalOrder struct {
Client address.Address
Miner address.Address
MinerPeer *retrievalmarket.RetrievalPeer
+
+ RemoteStore *RemoteStoreID `json:"RemoteStore,omitempty"`
}
+type RemoteStoreID = uuid.UUID
+
type InvocResult struct {
MsgCid cid.Cid
Msg *types.Message
diff --git a/api/api_gateway.go b/api/api_gateway.go
index 7d84e807c..b95299493 100644
--- a/api/api_gateway.go
+++ b/api/api_gateway.go
@@ -8,7 +8,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/dline"
apitypes "github.com/filecoin-project/lotus/api/types"
diff --git a/api/api_storage.go b/api/api_storage.go
index 4d05419d6..051206787 100644
--- a/api/api_storage.go
+++ b/api/api_storage.go
@@ -17,8 +17,9 @@ import (
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/market"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
abinetwork "github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/chain/actors/builtin"
@@ -54,6 +55,11 @@ type StorageMiner interface {
// and does not wait for message execution
ActorWithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) //perm:admin
+ // BeneficiaryWithdrawBalance allows the beneficiary of a miner to withdraw balance from miner actor
+ // Specify amount as "0" to withdraw full balance. This method returns a message CID
+ // and does not wait for message execution
+ BeneficiaryWithdrawBalance(context.Context, abi.TokenAmount) (cid.Cid, error) //perm:admin
+
MiningBase(context.Context) (*types.TipSet, error) //perm:read
ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]miner.SubmitWindowedPoStParams, error) //perm:admin
@@ -139,6 +145,8 @@ type StorageMiner interface {
// SectorNumFree drops a sector reservation
SectorNumFree(ctx context.Context, name string) error //perm:admin
+ SectorReceive(ctx context.Context, meta RemoteSectorMeta) error //perm:admin
+
// WorkerConnect tells the node to connect to workers RPC
WorkerConnect(context.Context, string) error //perm:admin retry:true
WorkerStats(context.Context) (map[uuid.UUID]storiface.WorkerStats, error) //perm:admin
@@ -161,6 +169,7 @@ type StorageMiner interface {
ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error //perm:admin retry:true
+ ReturnDownloadSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true
// SealingSchedDiag dumps internal sealing scheduler state
@@ -311,7 +320,7 @@ type StorageMiner interface {
// the path specified when calling CreateBackup is within the base path
CreateBackup(ctx context.Context, fpath string) error //perm:admin
- CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin
+ CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef) (map[abi.SectorNumber]string, error) //perm:admin
ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv abinetwork.Version) ([]builtin.PoStProof, error) //perm:read
@@ -408,6 +417,10 @@ func (st *SealSeed) Equals(ost *SealSeed) bool {
type SectorState string
+func (s *SectorState) String() string {
+ return string(*s)
+}
+
type AddrUse int
const (
@@ -499,3 +512,109 @@ type NumAssignerMeta struct {
Next abi.SectorNumber
}
+
+type RemoteSectorMeta struct {
+ ////////
+ // BASIC SECTOR INFORMATION
+
+ // State specifies the first state the sector will enter after being imported
+ // Must be one of the following states:
+ // * Packing
+ // * GetTicket
+ // * PreCommitting
+ // * SubmitCommit
+ // * Proving/Available
+ State SectorState
+
+ Sector abi.SectorID
+ Type abi.RegisteredSealProof
+
+ ////////
+ // SEALING METADATA
+ // (allows lotus to continue the sealing process)
+
+ // Required in Packing and later
+ Pieces []SectorPiece // todo better type?
+
+ // Required in PreCommitting and later
+ TicketValue abi.SealRandomness
+ TicketEpoch abi.ChainEpoch
+ PreCommit1Out storiface.PreCommit1Out // todo specify better
+
+ CommD *cid.Cid
+ CommR *cid.Cid // SectorKey
+
+ // Required in SubmitCommit and later
+ PreCommitInfo *miner.SectorPreCommitInfo
+ PreCommitDeposit *big.Int
+ PreCommitMessage *cid.Cid
+ PreCommitTipSet types.TipSetKey
+
+ SeedValue abi.InteractiveSealRandomness
+ SeedEpoch abi.ChainEpoch
+
+ CommitProof []byte
+
+ // Required in Proving/Available
+ CommitMessage *cid.Cid
+
+ // Optional sector metadata to import
+ Log []SectorLog
+
+ ////////
+ // SECTOR DATA SOURCE
+
+ // Sector urls - lotus will use those for fetching files into local storage
+
+ // Required in all states
+ DataUnsealed *storiface.SectorLocation
+
+ // Required in PreCommitting and later
+ DataSealed *storiface.SectorLocation
+ DataCache *storiface.SectorLocation
+
+ ////////
+ // SEALING SERVICE HOOKS
+
+ // URL
+ // RemoteCommit1Endpoint is an URL of POST endpoint which lotus will call requesting Commit1 (seal_commit_phase1)
+ // request body will be json-serialized RemoteCommit1Params struct
+ RemoteCommit1Endpoint string
+
+ // RemoteCommit2Endpoint is an URL of POST endpoint which lotus will call requesting Commit2 (seal_commit_phase2)
+ // request body will be json-serialized RemoteCommit2Params struct
+ RemoteCommit2Endpoint string
+
+ // RemoteSealingDoneEndpoint is called after the sector exists the sealing pipeline
+ // request body will be json-serialized RemoteSealingDoneParams struct
+ RemoteSealingDoneEndpoint string
+}
+
+type RemoteCommit1Params struct {
+ Ticket, Seed []byte
+
+ Unsealed cid.Cid
+ Sealed cid.Cid
+
+ ProofType abi.RegisteredSealProof
+}
+
+type RemoteCommit2Params struct {
+ Sector abi.SectorID
+ ProofType abi.RegisteredSealProof
+
+ // todo spec better
+ Commit1Out storiface.Commit1Out
+}
+
+type RemoteSealingDoneParams struct {
+ // Successful is true if the sector has entered state considered as "successfully sealed"
+ Successful bool
+
+ // State is the state the sector has entered
+ // For example "Proving" / "Removing"
+ State string
+
+ // Optional commit message CID
+ CommitMessage *cid.Cid
+}
diff --git a/api/api_test.go b/api/api_test.go
index c03216365..1316d9fa4 100644
--- a/api/api_test.go
+++ b/api/api_test.go
@@ -12,6 +12,9 @@ import (
"testing"
"github.com/stretchr/testify/require"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-jsonrpc"
)
func goCmd() string {
@@ -124,3 +127,18 @@ func TestPermTags(t *testing.T) {
_ = PermissionedStorMinerAPI(&StorageMinerStruct{})
_ = PermissionedWorkerAPI(&WorkerStruct{})
}
+
+func TestRetryErrorIsInTrue(t *testing.T) {
+ errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
+ require.True(t, ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry))
+}
+
+func TestRetryErrorIsInFalse(t *testing.T) {
+ errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
+ require.False(t, ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry))
+}
+
+func TestRetryWrappedErrorIsInTrue(t *testing.T) {
+ errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
+ require.True(t, ErrorIsIn(xerrors.Errorf("wrapped: %w", &jsonrpc.RPCConnectionError{}), errorsToRetry))
+}
diff --git a/api/api_worker.go b/api/api_worker.go
index 609cb4271..197ca898d 100644
--- a/api/api_worker.go
+++ b/api/api_worker.go
@@ -39,16 +39,17 @@ type Worker interface {
SealPreCommit2(ctx context.Context, sector storiface.SectorRef, pc1o storiface.PreCommit1Out) (storiface.CallID, error) //perm:admin
SealCommit1(ctx context.Context, sector storiface.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storiface.SectorCids) (storiface.CallID, error) //perm:admin
SealCommit2(ctx context.Context, sector storiface.SectorRef, c1o storiface.Commit1Out) (storiface.CallID, error) //perm:admin
- FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) //perm:admin
- FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) //perm:admin
+ FinalizeSector(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) //perm:admin
+ FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) //perm:admin
ReplicaUpdate(ctx context.Context, sector storiface.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin
ProveReplicaUpdate1(ctx context.Context, sector storiface.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin
ProveReplicaUpdate2(ctx context.Context, sector storiface.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storiface.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin
GenerateSectorKeyFromData(ctx context.Context, sector storiface.SectorRef, commD cid.Cid) (storiface.CallID, error) //perm:admin
- ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) (storiface.CallID, error) //perm:admin
+ ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) //perm:admin
MoveStorage(ctx context.Context, sector storiface.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin
UnsealPiece(context.Context, storiface.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin
Fetch(context.Context, storiface.SectorRef, storiface.SectorFileType, storiface.PathType, storiface.AcquireMode) (storiface.CallID, error) //perm:admin
+ DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) //perm:admin
GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error) //perm:admin
GenerateWindowPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, partitionIdx int, randomness abi.PoStRandomness) (storiface.WindowPoStResult, error) //perm:admin
diff --git a/api/cbor_gen.go b/api/cbor_gen.go
index 66655fd75..efa1cd1a1 100644
--- a/api/cbor_gen.go
+++ b/api/cbor_gen.go
@@ -13,8 +13,8 @@ import (
xerrors "golang.org/x/xerrors"
abi "github.com/filecoin-project/go-state-types/abi"
- market "github.com/filecoin-project/go-state-types/builtin/v8/market"
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ market "github.com/filecoin-project/go-state-types/builtin/v9/market"
)
var _ = xerrors.Errorf
@@ -1005,6 +1005,129 @@ func (t *PieceDealInfo) UnmarshalCBOR(r io.Reader) (err error) {
return nil
}
+func (t *SectorPiece) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write([]byte{162}); err != nil {
+ return err
+ }
+
+ // t.Piece (abi.PieceInfo) (struct)
+ if len("Piece") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"Piece\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Piece"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("Piece")); err != nil {
+ return err
+ }
+
+ if err := t.Piece.MarshalCBOR(cw); err != nil {
+ return err
+ }
+
+ // t.DealInfo (api.PieceDealInfo) (struct)
+ if len("DealInfo") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"DealInfo\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealInfo"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("DealInfo")); err != nil {
+ return err
+ }
+
+ if err := t.DealInfo.MarshalCBOR(cw); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (t *SectorPiece) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = SectorPiece{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajMap {
+ return fmt.Errorf("cbor input should be of type map")
+ }
+
+ if extra > cbg.MaxLength {
+ return fmt.Errorf("SectorPiece: map struct too large (%d)", extra)
+ }
+
+ var name string
+ n := extra
+
+ for i := uint64(0); i < n; i++ {
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ name = string(sval)
+ }
+
+ switch name {
+ // t.Piece (abi.PieceInfo) (struct)
+ case "Piece":
+
+ {
+
+ if err := t.Piece.UnmarshalCBOR(cr); err != nil {
+ return xerrors.Errorf("unmarshaling t.Piece: %w", err)
+ }
+
+ }
+ // t.DealInfo (api.PieceDealInfo) (struct)
+ case "DealInfo":
+
+ {
+
+ b, err := cr.ReadByte()
+ if err != nil {
+ return err
+ }
+ if b != cbg.CborNull[0] {
+ if err := cr.UnreadByte(); err != nil {
+ return err
+ }
+ t.DealInfo = new(PieceDealInfo)
+ if err := t.DealInfo.UnmarshalCBOR(cr); err != nil {
+ return xerrors.Errorf("unmarshaling t.DealInfo pointer: %w", err)
+ }
+ }
+
+ }
+
+ default:
+ // Field doesn't exist on this type, so ignore it
+ cbg.ScanForLinks(r, func(cid.Cid) {})
+ }
+ }
+
+ return nil
+}
func (t *DealSchedule) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
diff --git a/api/client/client.go b/api/client/client.go
index 669c58f27..32583097e 100644
--- a/api/client/client.go
+++ b/api/client/client.go
@@ -19,7 +19,7 @@ import (
func NewCommonRPCV0(ctx context.Context, addr string, requestHeader http.Header) (api.CommonNet, jsonrpc.ClientCloser, error) {
var res v0api.CommonNetStruct
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
- api.GetInternalStructs(&res), requestHeader)
+ api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors))
return &res, closer, err
}
@@ -29,7 +29,7 @@ func NewFullNodeRPCV0(ctx context.Context, addr string, requestHeader http.Heade
var res v0api.FullNodeStruct
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
- api.GetInternalStructs(&res), requestHeader)
+ api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors))
return &res, closer, err
}
@@ -38,7 +38,7 @@ func NewFullNodeRPCV0(ctx context.Context, addr string, requestHeader http.Heade
func NewFullNodeRPCV1(ctx context.Context, addr string, requestHeader http.Header) (api.FullNode, jsonrpc.ClientCloser, error) {
var res v1api.FullNodeStruct
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
- api.GetInternalStructs(&res), requestHeader)
+ api.GetInternalStructs(&res), requestHeader, jsonrpc.WithErrors(api.RPCErrors))
return &res, closer, err
}
@@ -72,6 +72,7 @@ func NewStorageMinerRPCV0(ctx context.Context, addr string, requestHeader http.H
api.GetInternalStructs(&res), requestHeader,
append([]jsonrpc.Option{
rpcenc.ReaderParamEncoder(pushUrl),
+ jsonrpc.WithErrors(api.RPCErrors),
}, opts...)...)
return &res, closer, err
@@ -90,6 +91,7 @@ func NewWorkerRPCV0(ctx context.Context, addr string, requestHeader http.Header)
rpcenc.ReaderParamEncoder(pushUrl),
jsonrpc.WithNoReconnect(),
jsonrpc.WithTimeout(30*time.Second),
+ jsonrpc.WithErrors(api.RPCErrors),
)
return &res, closer, err
@@ -101,7 +103,7 @@ func NewGatewayRPCV1(ctx context.Context, addr string, requestHeader http.Header
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
api.GetInternalStructs(&res),
requestHeader,
- opts...,
+ append(opts, jsonrpc.WithErrors(api.RPCErrors))...,
)
return &res, closer, err
@@ -113,7 +115,7 @@ func NewGatewayRPCV0(ctx context.Context, addr string, requestHeader http.Header
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
api.GetInternalStructs(&res),
requestHeader,
- opts...,
+ append(opts, jsonrpc.WithErrors(api.RPCErrors))...,
)
return &res, closer, err
@@ -124,6 +126,7 @@ func NewWalletRPCV0(ctx context.Context, addr string, requestHeader http.Header)
closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin",
api.GetInternalStructs(&res),
requestHeader,
+ jsonrpc.WithErrors(api.RPCErrors),
)
return &res, closer, err
diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go
index 40b6e6078..efb90c533 100644
--- a/api/docgen/docgen.go
+++ b/api/docgen/docgen.go
@@ -6,6 +6,7 @@ import (
"go/ast"
"go/parser"
"go/token"
+ "net/http"
"path/filepath"
"reflect"
"strings"
@@ -23,6 +24,8 @@ import (
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/core/protocol"
"github.com/multiformats/go-multiaddr"
+ "golang.org/x/text/cases"
+ "golang.org/x/text/language"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-bitfield"
@@ -31,6 +34,7 @@ import (
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
@@ -136,7 +140,15 @@ func init() {
addExample(&textSelExample)
addExample(&apiSelExample)
addExample(network.ReachabilityPublic)
- addExample(build.NewestNetworkVersion)
+ addExample(build.TestNetworkVersion)
+ allocationId := verifreg.AllocationId(0)
+ addExample(allocationId)
+ addExample(&allocationId)
+ addExample(map[verifreg.AllocationId]verifreg.Allocation{})
+ claimId := verifreg.ClaimId(0)
+ addExample(claimId)
+ addExample(&claimId)
+ addExample(map[verifreg.ClaimId]verifreg.Claim{})
addExample(map[string]int{"name": 42})
addExample(map[string]time.Time{"name": time.Unix(1615243938, 0).UTC()})
addExample(&types.ExecutionTrace{
@@ -339,7 +351,23 @@ func init() {
addExample(map[string]bitfield.BitField{
"": bitfield.NewFromSet([]uint64{5, 6, 7, 10}),
})
+ addExample(&api.RaftStateData{
+ NonceMap: make(map[address.Address]uint64),
+ MsgUuids: make(map[uuid.UUID]*types.SignedMessage),
+ })
+ addExample(http.Header{
+ "Authorization": []string{"Bearer ey.."},
+ })
+
+ addExample(map[storiface.SectorFileType]storiface.SectorLocation{
+ storiface.FTSealed: {
+ Local: false,
+ URL: "https://example.com/sealingservice/sectors/s-f0123-12345",
+ Headers: nil,
+ },
+ })
+ addExample(&uuid.UUID{})
}
func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) {
@@ -430,7 +458,8 @@ func exampleStruct(method string, t, parent reflect.Type) interface{} {
if f.Type == parent {
continue
}
- if strings.Title(f.Name) == f.Name {
+ caser := cases.Title(language.English)
+ if caser.String(f.Name) == f.Name {
ns.Elem().Field(i).Set(reflect.ValueOf(ExampleValue(method, f.Type, t)))
}
}
diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go
index 2640d6032..b5bf2bfea 100644
--- a/api/mocks/mock_full.go
+++ b/api/mocks/mock_full.go
@@ -26,8 +26,9 @@ import (
auth "github.com/filecoin-project/go-jsonrpc/auth"
abi "github.com/filecoin-project/go-state-types/abi"
big "github.com/filecoin-project/go-state-types/big"
- miner "github.com/filecoin-project/go-state-types/builtin/v8/miner"
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ miner "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifreg "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
crypto "github.com/filecoin-project/go-state-types/crypto"
dline "github.com/filecoin-project/go-state-types/dline"
network "github.com/filecoin-project/go-state-types/network"
@@ -2243,6 +2244,36 @@ func (mr *MockFullNodeMockRecorder) PaychVoucherSubmit(arg0, arg1, arg2, arg3, a
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherSubmit", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherSubmit), arg0, arg1, arg2, arg3, arg4)
}
+// RaftLeader mocks base method.
+func (m *MockFullNode) RaftLeader(arg0 context.Context) (peer.ID, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "RaftLeader", arg0)
+ ret0, _ := ret[0].(peer.ID)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// RaftLeader indicates an expected call of RaftLeader.
+func (mr *MockFullNodeMockRecorder) RaftLeader(arg0 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RaftLeader", reflect.TypeOf((*MockFullNode)(nil).RaftLeader), arg0)
+}
+
+// RaftState mocks base method.
+func (m *MockFullNode) RaftState(arg0 context.Context) (*api.RaftStateData, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "RaftState", arg0)
+ ret0, _ := ret[0].(*api.RaftStateData)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// RaftState indicates an expected call of RaftState.
+func (mr *MockFullNodeMockRecorder) RaftState(arg0 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RaftState", reflect.TypeOf((*MockFullNode)(nil).RaftState), arg0)
+}
+
// Session mocks base method.
func (m *MockFullNode) Session(arg0 context.Context) (uuid.UUID, error) {
m.ctrl.T.Helper()
@@ -2272,6 +2303,21 @@ func (mr *MockFullNodeMockRecorder) Shutdown(arg0 interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0)
}
+// StartTime mocks base method.
+func (m *MockFullNode) StartTime(arg0 context.Context) (time.Time, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StartTime", arg0)
+ ret0, _ := ret[0].(time.Time)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StartTime indicates an expected call of StartTime.
+func (mr *MockFullNodeMockRecorder) StartTime(arg0 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockFullNode)(nil).StartTime), arg0)
+}
+
// StateAccountKey mocks base method.
func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) {
m.ctrl.T.Helper()
@@ -2348,10 +2394,10 @@ func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gom
}
// StateChangedActors mocks base method.
-func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.Actor, error) {
+func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.ActorV5, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "StateChangedActors", arg0, arg1, arg2)
- ret0, _ := ret[0].(map[string]types.Actor)
+ ret0, _ := ret[0].(map[string]types.ActorV5)
ret1, _ := ret[1].(error)
return ret0, ret1
}
@@ -2453,10 +2499,10 @@ func (mr *MockFullNodeMockRecorder) StateEncodeParams(arg0, arg1, arg2, arg3 int
}
// StateGetActor mocks base method.
-func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.Actor, error) {
+func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.ActorV5, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2)
- ret0, _ := ret[0].(*types.Actor)
+ ret0, _ := ret[0].(*types.ActorV5)
ret1, _ := ret[1].(error)
return ret0, ret1
}
@@ -2467,6 +2513,51 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{})
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2)
}
+// StateGetAllocation mocks base method.
+func (m *MockFullNode) StateGetAllocation(arg0 context.Context, arg1 address.Address, arg2 verifreg.AllocationId, arg3 types.TipSetKey) (*verifreg.Allocation, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetAllocation", arg0, arg1, arg2, arg3)
+ ret0, _ := ret[0].(*verifreg.Allocation)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetAllocation indicates an expected call of StateGetAllocation.
+func (mr *MockFullNodeMockRecorder) StateGetAllocation(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocation", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocation), arg0, arg1, arg2, arg3)
+}
+
+// StateGetAllocationForPendingDeal mocks base method.
+func (m *MockFullNode) StateGetAllocationForPendingDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*verifreg.Allocation, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetAllocationForPendingDeal", arg0, arg1, arg2)
+ ret0, _ := ret[0].(*verifreg.Allocation)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetAllocationForPendingDeal indicates an expected call of StateGetAllocationForPendingDeal.
+func (mr *MockFullNodeMockRecorder) StateGetAllocationForPendingDeal(arg0, arg1, arg2 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocationForPendingDeal", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocationForPendingDeal), arg0, arg1, arg2)
+}
+
+// StateGetAllocations mocks base method.
+func (m *MockFullNode) StateGetAllocations(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetAllocations", arg0, arg1, arg2)
+ ret0, _ := ret[0].(map[verifreg.AllocationId]verifreg.Allocation)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetAllocations indicates an expected call of StateGetAllocations.
+func (mr *MockFullNodeMockRecorder) StateGetAllocations(arg0, arg1, arg2 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocations", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocations), arg0, arg1, arg2)
+}
+
// StateGetBeaconEntry mocks base method.
func (m *MockFullNode) StateGetBeaconEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*types.BeaconEntry, error) {
m.ctrl.T.Helper()
@@ -2482,6 +2573,36 @@ func (mr *MockFullNodeMockRecorder) StateGetBeaconEntry(arg0, arg1 interface{})
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetBeaconEntry", reflect.TypeOf((*MockFullNode)(nil).StateGetBeaconEntry), arg0, arg1)
}
+// StateGetClaim mocks base method.
+func (m *MockFullNode) StateGetClaim(arg0 context.Context, arg1 address.Address, arg2 verifreg.ClaimId, arg3 types.TipSetKey) (*verifreg.Claim, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetClaim", arg0, arg1, arg2, arg3)
+ ret0, _ := ret[0].(*verifreg.Claim)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetClaim indicates an expected call of StateGetClaim.
+func (mr *MockFullNodeMockRecorder) StateGetClaim(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaim", reflect.TypeOf((*MockFullNode)(nil).StateGetClaim), arg0, arg1, arg2, arg3)
+}
+
+// StateGetClaims mocks base method.
+func (m *MockFullNode) StateGetClaims(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetClaims", arg0, arg1, arg2)
+ ret0, _ := ret[0].(map[verifreg.ClaimId]verifreg.Claim)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetClaims indicates an expected call of StateGetClaims.
+func (mr *MockFullNodeMockRecorder) StateGetClaims(arg0, arg1, arg2 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaims", reflect.TypeOf((*MockFullNode)(nil).StateGetClaims), arg0, arg1, arg2)
+}
+
// StateGetNetworkParams mocks base method.
func (m *MockFullNode) StateGetNetworkParams(arg0 context.Context) (*api.NetworkParams, error) {
m.ctrl.T.Helper()
diff --git a/api/proxy_gen.go b/api/proxy_gen.go
index 4c428d2b9..14d5c999d 100644
--- a/api/proxy_gen.go
+++ b/api/proxy_gen.go
@@ -24,8 +24,9 @@ import (
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
abinetwork "github.com/filecoin-project/go-state-types/network"
@@ -79,6 +80,8 @@ type CommonStruct struct {
Shutdown func(p0 context.Context) error `perm:"admin"`
+ StartTime func(p0 context.Context) (time.Time, error) `perm:"read"`
+
Version func(p0 context.Context) (APIVersion, error) `perm:"read"`
}
}
@@ -339,6 +342,10 @@ type FullNodeStruct struct {
PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"`
+ RaftLeader func(p0 context.Context) (peer.ID, error) `perm:"read"`
+
+ RaftState func(p0 context.Context) (*RaftStateData, error) `perm:"read"`
+
StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"`
StateActorCodeCIDs func(p0 context.Context, p1 abinetwork.Version) (map[string]cid.Cid, error) `perm:"read"`
@@ -365,8 +372,18 @@ type FullNodeStruct struct {
StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"`
+ StateGetAllocation func(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"`
+
+ StateGetAllocationForPendingDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"`
+
+ StateGetAllocations func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) `perm:"read"`
+
StateGetBeaconEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"`
+ StateGetClaim func(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) `perm:"read"`
+
+ StateGetClaims func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) `perm:"read"`
+
StateGetNetworkParams func(p0 context.Context) (*NetworkParams, error) `perm:"read"`
StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"`
@@ -664,7 +681,9 @@ type StorageMinerStruct struct {
ActorWithdrawBalance func(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) `perm:"admin"`
- CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"`
+ BeneficiaryWithdrawBalance func(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) `perm:"admin"`
+
+ CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef) (map[abi.SectorNumber]string, error) `perm:"admin"`
ComputeDataCid func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storiface.Data) (abi.PieceInfo, error) `perm:"admin"`
@@ -776,6 +795,8 @@ type StorageMinerStruct struct {
ReturnDataCid func(p0 context.Context, p1 storiface.CallID, p2 abi.PieceInfo, p3 *storiface.CallError) error `perm:"admin"`
+ ReturnDownloadSector func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"`
+
ReturnFetch func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"`
ReturnFinalizeReplicaUpdate func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"`
@@ -844,6 +865,8 @@ type StorageMinerStruct struct {
SectorPreCommitPending func(p0 context.Context) ([]abi.SectorID, error) `perm:"admin"`
+ SectorReceive func(p0 context.Context, p1 RemoteSectorMeta) error `perm:"admin"`
+
SectorRemove func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"`
SectorSetExpectedSealDuration func(p0 context.Context, p1 time.Duration) error `perm:"write"`
@@ -949,13 +972,15 @@ type WorkerStruct struct {
DataCid func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storiface.Data) (storiface.CallID, error) `perm:"admin"`
+ DownloadSectorData func(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) `perm:"admin"`
+
Enabled func(p0 context.Context) (bool, error) `perm:"admin"`
Fetch func(p0 context.Context, p1 storiface.SectorRef, p2 storiface.SectorFileType, p3 storiface.PathType, p4 storiface.AcquireMode) (storiface.CallID, error) `perm:"admin"`
- FinalizeReplicaUpdate func(p0 context.Context, p1 storiface.SectorRef, p2 []storiface.Range) (storiface.CallID, error) `perm:"admin"`
+ FinalizeReplicaUpdate func(p0 context.Context, p1 storiface.SectorRef) (storiface.CallID, error) `perm:"admin"`
- FinalizeSector func(p0 context.Context, p1 storiface.SectorRef, p2 []storiface.Range) (storiface.CallID, error) `perm:"admin"`
+ FinalizeSector func(p0 context.Context, p1 storiface.SectorRef) (storiface.CallID, error) `perm:"admin"`
GenerateSectorKeyFromData func(p0 context.Context, p1 storiface.SectorRef, p2 cid.Cid) (storiface.CallID, error) `perm:"admin"`
@@ -1154,6 +1179,17 @@ func (s *CommonStub) Shutdown(p0 context.Context) error {
return ErrNotSupported
}
+func (s *CommonStruct) StartTime(p0 context.Context) (time.Time, error) {
+ if s.Internal.StartTime == nil {
+ return *new(time.Time), ErrNotSupported
+ }
+ return s.Internal.StartTime(p0)
+}
+
+func (s *CommonStub) StartTime(p0 context.Context) (time.Time, error) {
+ return *new(time.Time), ErrNotSupported
+}
+
func (s *CommonStruct) Version(p0 context.Context) (APIVersion, error) {
if s.Internal.Version == nil {
return *new(APIVersion), ErrNotSupported
@@ -2441,6 +2477,28 @@ func (s *FullNodeStub) PaychVoucherSubmit(p0 context.Context, p1 address.Address
return *new(cid.Cid), ErrNotSupported
}
+func (s *FullNodeStruct) RaftLeader(p0 context.Context) (peer.ID, error) {
+ if s.Internal.RaftLeader == nil {
+ return *new(peer.ID), ErrNotSupported
+ }
+ return s.Internal.RaftLeader(p0)
+}
+
+func (s *FullNodeStub) RaftLeader(p0 context.Context) (peer.ID, error) {
+ return *new(peer.ID), ErrNotSupported
+}
+
+func (s *FullNodeStruct) RaftState(p0 context.Context) (*RaftStateData, error) {
+ if s.Internal.RaftState == nil {
+ return nil, ErrNotSupported
+ }
+ return s.Internal.RaftState(p0)
+}
+
+func (s *FullNodeStub) RaftState(p0 context.Context) (*RaftStateData, error) {
+ return nil, ErrNotSupported
+}
+
func (s *FullNodeStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) {
if s.Internal.StateAccountKey == nil {
return *new(address.Address), ErrNotSupported
@@ -2584,6 +2642,39 @@ func (s *FullNodeStub) StateGetActor(p0 context.Context, p1 address.Address, p2
return nil, ErrNotSupported
}
+func (s *FullNodeStruct) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ if s.Internal.StateGetAllocation == nil {
+ return nil, ErrNotSupported
+ }
+ return s.Internal.StateGetAllocation(p0, p1, p2, p3)
+}
+
+func (s *FullNodeStub) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ return nil, ErrNotSupported
+}
+
+func (s *FullNodeStruct) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ if s.Internal.StateGetAllocationForPendingDeal == nil {
+ return nil, ErrNotSupported
+ }
+ return s.Internal.StateGetAllocationForPendingDeal(p0, p1, p2)
+}
+
+func (s *FullNodeStub) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ return nil, ErrNotSupported
+}
+
+func (s *FullNodeStruct) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) {
+ if s.Internal.StateGetAllocations == nil {
+ return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported
+ }
+ return s.Internal.StateGetAllocations(p0, p1, p2)
+}
+
+func (s *FullNodeStub) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) {
+ return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported
+}
+
func (s *FullNodeStruct) StateGetBeaconEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) {
if s.Internal.StateGetBeaconEntry == nil {
return nil, ErrNotSupported
@@ -2595,6 +2686,28 @@ func (s *FullNodeStub) StateGetBeaconEntry(p0 context.Context, p1 abi.ChainEpoch
return nil, ErrNotSupported
}
+func (s *FullNodeStruct) StateGetClaim(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) {
+ if s.Internal.StateGetClaim == nil {
+ return nil, ErrNotSupported
+ }
+ return s.Internal.StateGetClaim(p0, p1, p2, p3)
+}
+
+func (s *FullNodeStub) StateGetClaim(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) {
+ return nil, ErrNotSupported
+}
+
+func (s *FullNodeStruct) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) {
+ if s.Internal.StateGetClaims == nil {
+ return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported
+ }
+ return s.Internal.StateGetClaims(p0, p1, p2)
+}
+
+func (s *FullNodeStub) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) {
+ return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported
+}
+
func (s *FullNodeStruct) StateGetNetworkParams(p0 context.Context) (*NetworkParams, error) {
if s.Internal.StateGetNetworkParams == nil {
return nil, ErrNotSupported
@@ -4036,14 +4149,25 @@ func (s *StorageMinerStub) ActorWithdrawBalance(p0 context.Context, p1 abi.Token
return *new(cid.Cid), ErrNotSupported
}
-func (s *StorageMinerStruct) CheckProvable(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) {
+func (s *StorageMinerStruct) BeneficiaryWithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) {
+ if s.Internal.BeneficiaryWithdrawBalance == nil {
+ return *new(cid.Cid), ErrNotSupported
+ }
+ return s.Internal.BeneficiaryWithdrawBalance(p0, p1)
+}
+
+func (s *StorageMinerStub) BeneficiaryWithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) {
+ return *new(cid.Cid), ErrNotSupported
+}
+
+func (s *StorageMinerStruct) CheckProvable(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef) (map[abi.SectorNumber]string, error) {
if s.Internal.CheckProvable == nil {
return *new(map[abi.SectorNumber]string), ErrNotSupported
}
- return s.Internal.CheckProvable(p0, p1, p2, p3)
+ return s.Internal.CheckProvable(p0, p1, p2)
}
-func (s *StorageMinerStub) CheckProvable(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) {
+func (s *StorageMinerStub) CheckProvable(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef) (map[abi.SectorNumber]string, error) {
return *new(map[abi.SectorNumber]string), ErrNotSupported
}
@@ -4652,6 +4776,17 @@ func (s *StorageMinerStub) ReturnDataCid(p0 context.Context, p1 storiface.CallID
return ErrNotSupported
}
+func (s *StorageMinerStruct) ReturnDownloadSector(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error {
+ if s.Internal.ReturnDownloadSector == nil {
+ return ErrNotSupported
+ }
+ return s.Internal.ReturnDownloadSector(p0, p1, p2)
+}
+
+func (s *StorageMinerStub) ReturnDownloadSector(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error {
+ return ErrNotSupported
+}
+
func (s *StorageMinerStruct) ReturnFetch(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error {
if s.Internal.ReturnFetch == nil {
return ErrNotSupported
@@ -5026,6 +5161,17 @@ func (s *StorageMinerStub) SectorPreCommitPending(p0 context.Context) ([]abi.Sec
return *new([]abi.SectorID), ErrNotSupported
}
+func (s *StorageMinerStruct) SectorReceive(p0 context.Context, p1 RemoteSectorMeta) error {
+ if s.Internal.SectorReceive == nil {
+ return ErrNotSupported
+ }
+ return s.Internal.SectorReceive(p0, p1)
+}
+
+func (s *StorageMinerStub) SectorReceive(p0 context.Context, p1 RemoteSectorMeta) error {
+ return ErrNotSupported
+}
+
func (s *StorageMinerStruct) SectorRemove(p0 context.Context, p1 abi.SectorNumber) error {
if s.Internal.SectorRemove == nil {
return ErrNotSupported
@@ -5510,6 +5656,17 @@ func (s *WorkerStub) DataCid(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 st
return *new(storiface.CallID), ErrNotSupported
}
+func (s *WorkerStruct) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) {
+ if s.Internal.DownloadSectorData == nil {
+ return *new(storiface.CallID), ErrNotSupported
+ }
+ return s.Internal.DownloadSectorData(p0, p1, p2, p3)
+}
+
+func (s *WorkerStub) DownloadSectorData(p0 context.Context, p1 storiface.SectorRef, p2 bool, p3 map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) {
+ return *new(storiface.CallID), ErrNotSupported
+}
+
func (s *WorkerStruct) Enabled(p0 context.Context) (bool, error) {
if s.Internal.Enabled == nil {
return false, ErrNotSupported
@@ -5532,25 +5689,25 @@ func (s *WorkerStub) Fetch(p0 context.Context, p1 storiface.SectorRef, p2 storif
return *new(storiface.CallID), ErrNotSupported
}
-func (s *WorkerStruct) FinalizeReplicaUpdate(p0 context.Context, p1 storiface.SectorRef, p2 []storiface.Range) (storiface.CallID, error) {
+func (s *WorkerStruct) FinalizeReplicaUpdate(p0 context.Context, p1 storiface.SectorRef) (storiface.CallID, error) {
if s.Internal.FinalizeReplicaUpdate == nil {
return *new(storiface.CallID), ErrNotSupported
}
- return s.Internal.FinalizeReplicaUpdate(p0, p1, p2)
+ return s.Internal.FinalizeReplicaUpdate(p0, p1)
}
-func (s *WorkerStub) FinalizeReplicaUpdate(p0 context.Context, p1 storiface.SectorRef, p2 []storiface.Range) (storiface.CallID, error) {
+func (s *WorkerStub) FinalizeReplicaUpdate(p0 context.Context, p1 storiface.SectorRef) (storiface.CallID, error) {
return *new(storiface.CallID), ErrNotSupported
}
-func (s *WorkerStruct) FinalizeSector(p0 context.Context, p1 storiface.SectorRef, p2 []storiface.Range) (storiface.CallID, error) {
+func (s *WorkerStruct) FinalizeSector(p0 context.Context, p1 storiface.SectorRef) (storiface.CallID, error) {
if s.Internal.FinalizeSector == nil {
return *new(storiface.CallID), ErrNotSupported
}
- return s.Internal.FinalizeSector(p0, p1, p2)
+ return s.Internal.FinalizeSector(p0, p1)
}
-func (s *WorkerStub) FinalizeSector(p0 context.Context, p1 storiface.SectorRef, p2 []storiface.Range) (storiface.CallID, error) {
+func (s *WorkerStub) FinalizeSector(p0 context.Context, p1 storiface.SectorRef) (storiface.CallID, error) {
return *new(storiface.CallID), ErrNotSupported
}
diff --git a/api/types.go b/api/types.go
index 683589ce1..5cbe0edef 100644
--- a/api/types.go
+++ b/api/types.go
@@ -17,6 +17,7 @@ import (
datatransfer "github.com/filecoin-project/go-data-transfer"
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
"github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/modules/dtypes"
@@ -58,6 +59,11 @@ type MessageSendSpec struct {
MsgUuid uuid.UUID
}
+type MpoolMessageWhole struct {
+ Msg *types.Message
+ Spec *MessageSendSpec
+}
+
// GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync
type GraphSyncDataTransfer struct {
// GraphSync request id for this transfer
@@ -295,6 +301,9 @@ type MinerInfo struct {
SectorSize abi.SectorSize
WindowPoStPartitionSectors uint64
ConsensusFaultElapsed abi.ChainEpoch
+ Beneficiary address.Address
+ BeneficiaryTerm *miner.BeneficiaryTerm
+ PendingBeneficiaryTerm *miner.PendingBeneficiaryChange
}
type NetworkParams struct {
@@ -327,4 +336,64 @@ type ForkUpgradeParams struct {
UpgradeHyperdriveHeight abi.ChainEpoch
UpgradeChocolateHeight abi.ChainEpoch
UpgradeOhSnapHeight abi.ChainEpoch
+ UpgradeSkyrHeight abi.ChainEpoch
+ UpgradeSharkHeight abi.ChainEpoch
+}
+
+type NonceMapType map[address.Address]uint64
+type MsgUuidMapType map[uuid.UUID]*types.SignedMessage
+
+type RaftStateData struct {
+ NonceMap NonceMapType
+ MsgUuids MsgUuidMapType
+}
+
+func (n *NonceMapType) MarshalJSON() ([]byte, error) {
+ marshalled := make(map[string]uint64)
+ for a, n := range *n {
+ marshalled[a.String()] = n
+ }
+ return json.Marshal(marshalled)
+}
+
+func (n *NonceMapType) UnmarshalJSON(b []byte) error {
+ unmarshalled := make(map[string]uint64)
+ err := json.Unmarshal(b, &unmarshalled)
+ if err != nil {
+ return err
+ }
+ *n = make(map[address.Address]uint64)
+ for saddr, nonce := range unmarshalled {
+ a, err := address.NewFromString(saddr)
+ if err != nil {
+ return err
+ }
+ (*n)[a] = nonce
+ }
+ return nil
+}
+
+func (m *MsgUuidMapType) MarshalJSON() ([]byte, error) {
+ marshalled := make(map[string]*types.SignedMessage)
+ for u, msg := range *m {
+ marshalled[u.String()] = msg
+ }
+ return json.Marshal(marshalled)
+}
+
+func (m *MsgUuidMapType) UnmarshalJSON(b []byte) error {
+ unmarshalled := make(map[string]*types.SignedMessage)
+ err := json.Unmarshal(b, &unmarshalled)
+ if err != nil {
+ return err
+ }
+ *m = make(map[uuid.UUID]*types.SignedMessage)
+ for suid, msg := range unmarshalled {
+ u, err := uuid.Parse(suid)
+ if err != nil {
+ return err
+ }
+ (*m)[u] = msg
+ }
+ return nil
}
diff --git a/api/v0api/full.go b/api/v0api/full.go
index cca358ada..ca1371794 100644
--- a/api/v0api/full.go
+++ b/api/v0api/full.go
@@ -14,8 +14,9 @@ import (
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
abinetwork "github.com/filecoin-project/go-state-types/network"
@@ -531,6 +532,16 @@ type FullNode interface {
StateMarketDeals(context.Context, types.TipSetKey) (map[string]*api.MarketDeal, error) //perm:read
// StateMarketStorageDeal returns information about the indicated deal
StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error) //perm:read
+ // StateGetAllocationForPendingDeal returns the allocation for a given deal ID of a pending deal.
+ StateGetAllocationForPendingDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
+ // StateGetAllocation returns the allocation for a given address and allocation ID.
+ StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifregtypes.AllocationId, tsk types.TipSetKey) (*verifregtypes.Allocation, error) //perm:read
+ // StateGetAllocations returns the all the allocations for a given client.
+ StateGetAllocations(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) //perm:read
+ // StateGetClaim returns the claim for a given address and claim ID.
+ StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifregtypes.ClaimId, tsk types.TipSetKey) (*verifregtypes.Claim, error) //perm:read
+ // StateGetClaims returns the all the claims for a given provider.
+ StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) //perm:read
// StateLookupID retrieves the ID address of the given address
StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read
// StateAccountKey returns the public key address of the given ID address
diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go
index ab374b59c..bd55917c7 100644
--- a/api/v0api/gateway.go
+++ b/api/v0api/gateway.go
@@ -8,7 +8,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/dline"
abinetwork "github.com/filecoin-project/go-state-types/network"
diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go
index b568fe156..b1a07dacc 100644
--- a/api/v0api/proxy_gen.go
+++ b/api/v0api/proxy_gen.go
@@ -16,8 +16,9 @@ import (
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
abinetwork "github.com/filecoin-project/go-state-types/network"
@@ -277,6 +278,16 @@ type FullNodeStruct struct {
StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"`
+ StateGetAllocation func(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"`
+
+ StateGetAllocationForPendingDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) `perm:"read"`
+
+ StateGetAllocations func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) `perm:"read"`
+
+ StateGetClaim func(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) `perm:"read"`
+
+ StateGetClaims func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) `perm:"read"`
+
StateGetNetworkParams func(p0 context.Context) (*api.NetworkParams, error) `perm:"read"`
StateGetRandomnessFromBeacon func(p0 context.Context, p1 crypto.DomainSeparationTag, p2 abi.ChainEpoch, p3 []byte, p4 types.TipSetKey) (abi.Randomness, error) `perm:"read"`
@@ -1793,6 +1804,61 @@ func (s *FullNodeStub) StateGetActor(p0 context.Context, p1 address.Address, p2
return nil, ErrNotSupported
}
+func (s *FullNodeStruct) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ if s.Internal.StateGetAllocation == nil {
+ return nil, ErrNotSupported
+ }
+ return s.Internal.StateGetAllocation(p0, p1, p2, p3)
+}
+
+func (s *FullNodeStub) StateGetAllocation(p0 context.Context, p1 address.Address, p2 verifregtypes.AllocationId, p3 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ return nil, ErrNotSupported
+}
+
+func (s *FullNodeStruct) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ if s.Internal.StateGetAllocationForPendingDeal == nil {
+ return nil, ErrNotSupported
+ }
+ return s.Internal.StateGetAllocationForPendingDeal(p0, p1, p2)
+}
+
+func (s *FullNodeStub) StateGetAllocationForPendingDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*verifregtypes.Allocation, error) {
+ return nil, ErrNotSupported
+}
+
+func (s *FullNodeStruct) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) {
+ if s.Internal.StateGetAllocations == nil {
+ return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported
+ }
+ return s.Internal.StateGetAllocations(p0, p1, p2)
+}
+
+func (s *FullNodeStub) StateGetAllocations(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.AllocationId]verifregtypes.Allocation, error) {
+ return *new(map[verifregtypes.AllocationId]verifregtypes.Allocation), ErrNotSupported
+}
+
+func (s *FullNodeStruct) StateGetClaim(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) {
+ if s.Internal.StateGetClaim == nil {
+ return nil, ErrNotSupported
+ }
+ return s.Internal.StateGetClaim(p0, p1, p2, p3)
+}
+
+func (s *FullNodeStub) StateGetClaim(p0 context.Context, p1 address.Address, p2 verifregtypes.ClaimId, p3 types.TipSetKey) (*verifregtypes.Claim, error) {
+ return nil, ErrNotSupported
+}
+
+func (s *FullNodeStruct) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) {
+ if s.Internal.StateGetClaims == nil {
+ return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported
+ }
+ return s.Internal.StateGetClaims(p0, p1, p2)
+}
+
+func (s *FullNodeStub) StateGetClaims(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (map[verifregtypes.ClaimId]verifregtypes.Claim, error) {
+ return *new(map[verifregtypes.ClaimId]verifregtypes.Claim), ErrNotSupported
+}
+
func (s *FullNodeStruct) StateGetNetworkParams(p0 context.Context) (*api.NetworkParams, error) {
if s.Internal.StateGetNetworkParams == nil {
return nil, ErrNotSupported
diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go
index 7dc9c0d63..3aff979ff 100644
--- a/api/v0api/v0mocks/mock_full.go
+++ b/api/v0api/v0mocks/mock_full.go
@@ -26,8 +26,9 @@ import (
auth "github.com/filecoin-project/go-jsonrpc/auth"
abi "github.com/filecoin-project/go-state-types/abi"
big "github.com/filecoin-project/go-state-types/big"
- miner "github.com/filecoin-project/go-state-types/builtin/v8/miner"
paych "github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ miner "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifreg "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
crypto "github.com/filecoin-project/go-state-types/crypto"
dline "github.com/filecoin-project/go-state-types/dline"
network "github.com/filecoin-project/go-state-types/network"
@@ -2157,6 +2158,21 @@ func (mr *MockFullNodeMockRecorder) Shutdown(arg0 interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0)
}
+// StartTime mocks base method.
+func (m *MockFullNode) StartTime(arg0 context.Context) (time.Time, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StartTime", arg0)
+ ret0, _ := ret[0].(time.Time)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StartTime indicates an expected call of StartTime.
+func (mr *MockFullNodeMockRecorder) StartTime(arg0 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockFullNode)(nil).StartTime), arg0)
+}
+
// StateAccountKey mocks base method.
func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) {
m.ctrl.T.Helper()
@@ -2233,10 +2249,10 @@ func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gom
}
// StateChangedActors mocks base method.
-func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.Actor, error) {
+func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.ActorV5, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "StateChangedActors", arg0, arg1, arg2)
- ret0, _ := ret[0].(map[string]types.Actor)
+ ret0, _ := ret[0].(map[string]types.ActorV5)
ret1, _ := ret[1].(error)
return ret0, ret1
}
@@ -2308,10 +2324,10 @@ func (mr *MockFullNodeMockRecorder) StateDecodeParams(arg0, arg1, arg2, arg3, ar
}
// StateGetActor mocks base method.
-func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.Actor, error) {
+func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.ActorV5, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2)
- ret0, _ := ret[0].(*types.Actor)
+ ret0, _ := ret[0].(*types.ActorV5)
ret1, _ := ret[1].(error)
return ret0, ret1
}
@@ -2322,6 +2338,81 @@ func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{})
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2)
}
+// StateGetAllocation mocks base method.
+func (m *MockFullNode) StateGetAllocation(arg0 context.Context, arg1 address.Address, arg2 verifreg.AllocationId, arg3 types.TipSetKey) (*verifreg.Allocation, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetAllocation", arg0, arg1, arg2, arg3)
+ ret0, _ := ret[0].(*verifreg.Allocation)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetAllocation indicates an expected call of StateGetAllocation.
+func (mr *MockFullNodeMockRecorder) StateGetAllocation(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocation", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocation), arg0, arg1, arg2, arg3)
+}
+
+// StateGetAllocationForPendingDeal mocks base method.
+func (m *MockFullNode) StateGetAllocationForPendingDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*verifreg.Allocation, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetAllocationForPendingDeal", arg0, arg1, arg2)
+ ret0, _ := ret[0].(*verifreg.Allocation)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetAllocationForPendingDeal indicates an expected call of StateGetAllocationForPendingDeal.
+func (mr *MockFullNodeMockRecorder) StateGetAllocationForPendingDeal(arg0, arg1, arg2 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocationForPendingDeal", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocationForPendingDeal), arg0, arg1, arg2)
+}
+
+// StateGetAllocations mocks base method.
+func (m *MockFullNode) StateGetAllocations(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetAllocations", arg0, arg1, arg2)
+ ret0, _ := ret[0].(map[verifreg.AllocationId]verifreg.Allocation)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetAllocations indicates an expected call of StateGetAllocations.
+func (mr *MockFullNodeMockRecorder) StateGetAllocations(arg0, arg1, arg2 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocations", reflect.TypeOf((*MockFullNode)(nil).StateGetAllocations), arg0, arg1, arg2)
+}
+
+// StateGetClaim mocks base method.
+func (m *MockFullNode) StateGetClaim(arg0 context.Context, arg1 address.Address, arg2 verifreg.ClaimId, arg3 types.TipSetKey) (*verifreg.Claim, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetClaim", arg0, arg1, arg2, arg3)
+ ret0, _ := ret[0].(*verifreg.Claim)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetClaim indicates an expected call of StateGetClaim.
+func (mr *MockFullNodeMockRecorder) StateGetClaim(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaim", reflect.TypeOf((*MockFullNode)(nil).StateGetClaim), arg0, arg1, arg2, arg3)
+}
+
+// StateGetClaims mocks base method.
+func (m *MockFullNode) StateGetClaims(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetClaims", arg0, arg1, arg2)
+ ret0, _ := ret[0].(map[verifreg.ClaimId]verifreg.Claim)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetClaims indicates an expected call of StateGetClaims.
+func (mr *MockFullNodeMockRecorder) StateGetClaims(arg0, arg1, arg2 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetClaims", reflect.TypeOf((*MockFullNode)(nil).StateGetClaims), arg0, arg1, arg2)
+}
+
// StateGetNetworkParams mocks base method.
func (m *MockFullNode) StateGetNetworkParams(arg0 context.Context) (*api.NetworkParams, error) {
m.ctrl.T.Helper()
diff --git a/api/v0api/v1_wrapper.go b/api/v0api/v1_wrapper.go
index d2b58ccb8..f58b0420f 100644
--- a/api/v0api/v1_wrapper.go
+++ b/api/v0api/v1_wrapper.go
@@ -12,7 +12,7 @@ import (
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/lotus/api"
diff --git a/api/version.go b/api/version.go
index 3b50a9502..9c2113578 100644
--- a/api/version.go
+++ b/api/version.go
@@ -58,7 +58,7 @@ var (
FullAPIVersion1 = newVer(2, 3, 0)
MinerAPIVersion0 = newVer(1, 5, 0)
- WorkerAPIVersion0 = newVer(1, 6, 0)
+ WorkerAPIVersion0 = newVer(1, 7, 0)
)
//nolint:varcheck,deadcode
diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go
index 90f4ad071..d41d521ef 100644
--- a/blockstore/autobatch.go
+++ b/blockstore/autobatch.go
@@ -181,18 +181,22 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block,
}
bs.stateLock.Lock()
- defer bs.stateLock.Unlock()
v, ok := bs.flushingBatch.blockMap[c]
if ok {
+ bs.stateLock.Unlock()
return v, nil
}
v, ok = bs.bufferedBatch.blockMap[c]
if ok {
+ bs.stateLock.Unlock()
return v, nil
}
+ bs.stateLock.Unlock()
- return bs.Get(ctx, c)
+ // We have to check the backing store one more time because it may have been flushed by the
+ // time we were able to take the lock above.
+ return bs.backingBs.Get(ctx, c)
}
func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error {
diff --git a/blockstore/autobatch_test.go b/blockstore/autobatch_test.go
index 57a3b7d6c..495c6c4db 100644
--- a/blockstore/autobatch_test.go
+++ b/blockstore/autobatch_test.go
@@ -4,6 +4,7 @@ import (
"context"
"testing"
+ ipld "github.com/ipfs/go-ipld-format"
"github.com/stretchr/testify/require"
)
@@ -29,6 +30,10 @@ func TestAutobatchBlockstore(t *testing.T) {
require.NoError(t, err)
require.Equal(t, b2.RawData(), v2.RawData())
+ // Regression test for a deadlock.
+ _, err = ab.Get(ctx, b3.Cid())
+ require.True(t, ipld.IsNotFound(err))
+
require.NoError(t, ab.Flush(ctx))
require.NoError(t, ab.Shutdown(ctx))
}
diff --git a/blockstore/cbor_gen.go b/blockstore/cbor_gen.go
new file mode 100644
index 000000000..b8ebdb474
--- /dev/null
+++ b/blockstore/cbor_gen.go
@@ -0,0 +1,441 @@
+// Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT.
+
+package blockstore
+
+import (
+ "fmt"
+ "io"
+ "math"
+ "sort"
+
+ cid "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ xerrors "golang.org/x/xerrors"
+)
+
+var _ = xerrors.Errorf
+var _ = cid.Undef
+var _ = math.E
+var _ = sort.Sort
+
+var lengthBufNetRpcReq = []byte{132}
+
+func (t *NetRpcReq) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write(lengthBufNetRpcReq); err != nil {
+ return err
+ }
+
+ // t.Type (blockstore.NetRPCReqType) (uint8)
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Type)); err != nil {
+ return err
+ }
+
+ // t.ID (uint64) (uint64)
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ID)); err != nil {
+ return err
+ }
+
+ // t.Cid ([]cid.Cid) (slice)
+ if len(t.Cid) > cbg.MaxLength {
+ return xerrors.Errorf("Slice value in field t.Cid was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Cid))); err != nil {
+ return err
+ }
+ for _, v := range t.Cid {
+ if err := cbg.WriteCid(w, v); err != nil {
+ return xerrors.Errorf("failed writing cid field t.Cid: %w", err)
+ }
+ }
+
+ // t.Data ([][]uint8) (slice)
+ if len(t.Data) > cbg.MaxLength {
+ return xerrors.Errorf("Slice value in field t.Data was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Data))); err != nil {
+ return err
+ }
+ for _, v := range t.Data {
+ if len(v) > cbg.ByteArrayMaxLen {
+ return xerrors.Errorf("Byte array in field v was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(v))); err != nil {
+ return err
+ }
+
+ if _, err := cw.Write(v[:]); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (t *NetRpcReq) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = NetRpcReq{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("cbor input should be of type array")
+ }
+
+ if extra != 4 {
+ return fmt.Errorf("cbor input had wrong number of fields")
+ }
+
+ // t.Type (blockstore.NetRPCReqType) (uint8)
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajUnsignedInt {
+ return fmt.Errorf("wrong type for uint8 field")
+ }
+ if extra > math.MaxUint8 {
+ return fmt.Errorf("integer in input was too large for uint8 field")
+ }
+ t.Type = NetRPCReqType(extra)
+ // t.ID (uint64) (uint64)
+
+ {
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajUnsignedInt {
+ return fmt.Errorf("wrong type for uint64 field")
+ }
+ t.ID = uint64(extra)
+
+ }
+ // t.Cid ([]cid.Cid) (slice)
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+
+ if extra > cbg.MaxLength {
+ return fmt.Errorf("t.Cid: array too large (%d)", extra)
+ }
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("expected cbor array")
+ }
+
+ if extra > 0 {
+ t.Cid = make([]cid.Cid, extra)
+ }
+
+ for i := 0; i < int(extra); i++ {
+
+ c, err := cbg.ReadCid(cr)
+ if err != nil {
+ return xerrors.Errorf("reading cid field t.Cid failed: %w", err)
+ }
+ t.Cid[i] = c
+ }
+
+ // t.Data ([][]uint8) (slice)
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+
+ if extra > cbg.MaxLength {
+ return fmt.Errorf("t.Data: array too large (%d)", extra)
+ }
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("expected cbor array")
+ }
+
+ if extra > 0 {
+ t.Data = make([][]uint8, extra)
+ }
+
+ for i := 0; i < int(extra); i++ {
+ {
+ var maj byte
+ var extra uint64
+ var err error
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+
+ if extra > cbg.ByteArrayMaxLen {
+ return fmt.Errorf("t.Data[i]: byte array too large (%d)", extra)
+ }
+ if maj != cbg.MajByteString {
+ return fmt.Errorf("expected byte array")
+ }
+
+ if extra > 0 {
+ t.Data[i] = make([]uint8, extra)
+ }
+
+ if _, err := io.ReadFull(cr, t.Data[i][:]); err != nil {
+ return err
+ }
+ }
+ }
+
+ return nil
+}
+
+var lengthBufNetRpcResp = []byte{131}
+
+func (t *NetRpcResp) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write(lengthBufNetRpcResp); err != nil {
+ return err
+ }
+
+ // t.Type (blockstore.NetRPCRespType) (uint8)
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Type)); err != nil {
+ return err
+ }
+
+ // t.ID (uint64) (uint64)
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ID)); err != nil {
+ return err
+ }
+
+ // t.Data ([]uint8) (slice)
+ if len(t.Data) > cbg.ByteArrayMaxLen {
+ return xerrors.Errorf("Byte array in field t.Data was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajByteString, uint64(len(t.Data))); err != nil {
+ return err
+ }
+
+ if _, err := cw.Write(t.Data[:]); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (t *NetRpcResp) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = NetRpcResp{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("cbor input should be of type array")
+ }
+
+ if extra != 3 {
+ return fmt.Errorf("cbor input had wrong number of fields")
+ }
+
+ // t.Type (blockstore.NetRPCRespType) (uint8)
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajUnsignedInt {
+ return fmt.Errorf("wrong type for uint8 field")
+ }
+ if extra > math.MaxUint8 {
+ return fmt.Errorf("integer in input was too large for uint8 field")
+ }
+ t.Type = NetRPCRespType(extra)
+ // t.ID (uint64) (uint64)
+
+ {
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajUnsignedInt {
+ return fmt.Errorf("wrong type for uint64 field")
+ }
+ t.ID = uint64(extra)
+
+ }
+ // t.Data ([]uint8) (slice)
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+
+ if extra > cbg.ByteArrayMaxLen {
+ return fmt.Errorf("t.Data: byte array too large (%d)", extra)
+ }
+ if maj != cbg.MajByteString {
+ return fmt.Errorf("expected byte array")
+ }
+
+ if extra > 0 {
+ t.Data = make([]uint8, extra)
+ }
+
+ if _, err := io.ReadFull(cr, t.Data[:]); err != nil {
+ return err
+ }
+ return nil
+}
+
+var lengthBufNetRpcErr = []byte{131}
+
+func (t *NetRpcErr) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write(lengthBufNetRpcErr); err != nil {
+ return err
+ }
+
+ // t.Type (blockstore.NetRPCErrType) (uint8)
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Type)); err != nil {
+ return err
+ }
+
+ // t.Msg (string) (string)
+ if len(t.Msg) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.Msg was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Msg))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.Msg)); err != nil {
+ return err
+ }
+
+ // t.Cid (cid.Cid) (struct)
+
+ if t.Cid == nil {
+ if _, err := cw.Write(cbg.CborNull); err != nil {
+ return err
+ }
+ } else {
+ if err := cbg.WriteCid(cw, *t.Cid); err != nil {
+ return xerrors.Errorf("failed to write cid field t.Cid: %w", err)
+ }
+ }
+
+ return nil
+}
+
+func (t *NetRpcErr) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = NetRpcErr{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("cbor input should be of type array")
+ }
+
+ if extra != 3 {
+ return fmt.Errorf("cbor input had wrong number of fields")
+ }
+
+ // t.Type (blockstore.NetRPCErrType) (uint8)
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajUnsignedInt {
+ return fmt.Errorf("wrong type for uint8 field")
+ }
+ if extra > math.MaxUint8 {
+ return fmt.Errorf("integer in input was too large for uint8 field")
+ }
+ t.Type = NetRPCErrType(extra)
+ // t.Msg (string) (string)
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.Msg = string(sval)
+ }
+ // t.Cid (cid.Cid) (struct)
+
+ {
+
+ b, err := cr.ReadByte()
+ if err != nil {
+ return err
+ }
+ if b != cbg.CborNull[0] {
+ if err := cr.UnreadByte(); err != nil {
+ return err
+ }
+
+ c, err := cbg.ReadCid(cr)
+ if err != nil {
+ return xerrors.Errorf("failed to read cid field t.Cid: %w", err)
+ }
+
+ t.Cid = &c
+ }
+
+ }
+ return nil
+}
diff --git a/blockstore/mem.go b/blockstore/mem.go
index 15708dcd4..7cfefafd7 100644
--- a/blockstore/mem.go
+++ b/blockstore/mem.go
@@ -47,6 +47,9 @@ func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error)
if !ok {
return nil, ipld.ErrNotFound{Cid: k}
}
+ if b.Cid().Prefix().Codec != k.Prefix().Codec {
+ return blocks.NewBlockWithCid(b.RawData(), k)
+ }
return b, nil
}
diff --git a/blockstore/mem_test.go b/blockstore/mem_test.go
new file mode 100644
index 000000000..4d4a77624
--- /dev/null
+++ b/blockstore/mem_test.go
@@ -0,0 +1,45 @@
+package blockstore
+
+import (
+ "context"
+ "testing"
+
+ blocks "github.com/ipfs/go-block-format"
+ "github.com/ipfs/go-cid"
+ mh "github.com/multiformats/go-multihash"
+ "github.com/stretchr/testify/require"
+)
+
+func TestMemGetCodec(t *testing.T) {
+ ctx := context.Background()
+ bs := NewMemory()
+
+ cborArr := []byte{0x82, 1, 2}
+
+ h, err := mh.Sum(cborArr, mh.SHA2_256, -1)
+ require.NoError(t, err)
+
+ rawCid := cid.NewCidV1(cid.Raw, h)
+ rawBlk, err := blocks.NewBlockWithCid(cborArr, rawCid)
+ require.NoError(t, err)
+
+ err = bs.Put(ctx, rawBlk)
+ require.NoError(t, err)
+
+ cborCid := cid.NewCidV1(cid.DagCBOR, h)
+
+ cborBlk, err := bs.Get(ctx, cborCid)
+ require.NoError(t, err)
+
+ require.Equal(t, cborCid.Prefix(), cborBlk.Cid().Prefix())
+ require.EqualValues(t, cborArr, cborBlk.RawData())
+
+ // was allocated
+ require.NotEqual(t, cborBlk, rawBlk)
+
+ gotRawBlk, err := bs.Get(ctx, rawCid)
+ require.NoError(t, err)
+
+ // not allocated
+ require.Equal(t, rawBlk, gotRawBlk)
+}
diff --git a/blockstore/net.go b/blockstore/net.go
new file mode 100644
index 000000000..77da764a5
--- /dev/null
+++ b/blockstore/net.go
@@ -0,0 +1,424 @@
+package blockstore
+
+import (
+ "bytes"
+ "context"
+ "encoding/binary"
+ "fmt"
+ "sync"
+ "sync/atomic"
+
+ blocks "github.com/ipfs/go-block-format"
+ "github.com/ipfs/go-cid"
+ ipld "github.com/ipfs/go-ipld-format"
+ "github.com/libp2p/go-msgio"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+)
+
+type NetRPCReqType byte
+
+const (
+ NRpcHas NetRPCReqType = iota
+ NRpcGet
+ NRpcGetSize
+ NRpcPut
+ NRpcDelete
+
+ // todo cancel req
+)
+
+type NetRPCRespType byte
+
+const (
+ NRpcOK NetRPCRespType = iota
+ NRpcErr
+ NRpcMore
+)
+
+type NetRPCErrType byte
+
+const (
+ NRpcErrGeneric NetRPCErrType = iota
+ NRpcErrNotFound
+)
+
+type NetRpcReq struct {
+ Type NetRPCReqType
+ ID uint64
+
+ Cid []cid.Cid // todo maxsize?
+ Data [][]byte // todo maxsize?
+}
+
+type NetRpcResp struct {
+ Type NetRPCRespType
+ ID uint64
+
+ // error or cids in allkeys
+ Data []byte // todo maxsize?
+
+ next <-chan NetRpcResp
+}
+
+type NetRpcErr struct {
+ Type NetRPCErrType
+
+ Msg string
+
+ // in case of NRpcErrNotFound
+ Cid *cid.Cid
+}
+
+type NetworkStore struct {
+ // note: writer is thread-safe
+ msgStream msgio.ReadWriteCloser
+
+ // atomic
+ reqCount uint64
+
+ respLk sync.Mutex
+
+ // respMap is nil after store closes
+ respMap map[uint64]chan<- NetRpcResp
+
+ closing chan struct{}
+ closed chan struct{}
+
+ closeLk sync.Mutex
+ onClose []func()
+}
+
+func NewNetworkStore(mss msgio.ReadWriteCloser) *NetworkStore {
+ ns := &NetworkStore{
+ msgStream: mss,
+
+ respMap: map[uint64]chan<- NetRpcResp{},
+
+ closing: make(chan struct{}),
+ closed: make(chan struct{}),
+ }
+
+ go ns.receive()
+
+ return ns
+}
+
+func (n *NetworkStore) shutdown(msg string) {
+ if err := n.msgStream.Close(); err != nil {
+ log.Errorw("closing netstore msg stream", "error", err)
+ }
+
+ nerr := NetRpcErr{
+ Type: NRpcErrGeneric,
+ Msg: msg,
+ Cid: nil,
+ }
+
+ var errb bytes.Buffer
+ if err := nerr.MarshalCBOR(&errb); err != nil {
+ log.Errorw("netstore shutdown: error marshaling error", "err", err)
+ }
+
+ n.respLk.Lock()
+ for id, resps := range n.respMap {
+ resps <- NetRpcResp{
+ Type: NRpcErr,
+ ID: id,
+ Data: errb.Bytes(),
+ }
+ }
+
+ n.respMap = nil
+
+ n.respLk.Unlock()
+}
+
+func (n *NetworkStore) OnClose(cb func()) {
+ n.closeLk.Lock()
+ defer n.closeLk.Unlock()
+
+ select {
+ case <-n.closed:
+ cb()
+ default:
+ n.onClose = append(n.onClose, cb)
+ }
+}
+
+func (n *NetworkStore) receive() {
+ defer func() {
+ n.closeLk.Lock()
+ defer n.closeLk.Unlock()
+
+ close(n.closed)
+ if n.onClose != nil {
+ for _, f := range n.onClose {
+ f()
+ }
+ }
+ }()
+
+ for {
+ select {
+ case <-n.closing:
+ n.shutdown("netstore stopping")
+ return
+ default:
+ }
+
+ msg, err := n.msgStream.ReadMsg()
+ if err != nil {
+ n.shutdown(fmt.Sprintf("netstore ReadMsg: %s", err))
+ return
+ }
+
+ var resp NetRpcResp
+ if err := resp.UnmarshalCBOR(bytes.NewReader(msg)); err != nil {
+ n.shutdown(fmt.Sprintf("unmarshaling netstore response: %s", err))
+ return
+ }
+
+ n.msgStream.ReleaseMsg(msg)
+
+ n.respLk.Lock()
+ if ch, ok := n.respMap[resp.ID]; ok {
+ if resp.Type == NRpcMore {
+ nch := make(chan NetRpcResp, 1)
+ resp.next = nch
+ n.respMap[resp.ID] = nch
+ } else {
+ delete(n.respMap, resp.ID)
+ }
+
+ ch <- resp
+ }
+ n.respLk.Unlock()
+ }
+}
+
+func (n *NetworkStore) sendRpc(rt NetRPCReqType, cids []cid.Cid, data [][]byte) (uint64, <-chan NetRpcResp, error) {
+ rid := atomic.AddUint64(&n.reqCount, 1)
+
+ respCh := make(chan NetRpcResp, 1) // todo pool?
+
+ n.respLk.Lock()
+ if n.respMap == nil {
+ n.respLk.Unlock()
+ return 0, nil, xerrors.Errorf("netstore closed")
+ }
+ n.respMap[rid] = respCh
+ n.respLk.Unlock()
+
+ req := NetRpcReq{
+ Type: rt,
+ ID: rid,
+ Cid: cids,
+ Data: data,
+ }
+
+ var rbuf bytes.Buffer // todo buffer pool
+ if err := req.MarshalCBOR(&rbuf); err != nil {
+ n.respLk.Lock()
+ defer n.respLk.Unlock()
+
+ if n.respMap == nil {
+ return 0, nil, xerrors.Errorf("netstore closed")
+ }
+ delete(n.respMap, rid)
+
+ return 0, nil, err
+ }
+
+ if err := n.msgStream.WriteMsg(rbuf.Bytes()); err != nil {
+ n.respLk.Lock()
+ defer n.respLk.Unlock()
+
+ if n.respMap == nil {
+ return 0, nil, xerrors.Errorf("netstore closed")
+ }
+ delete(n.respMap, rid)
+
+ return 0, nil, err
+ }
+
+ return rid, respCh, nil
+}
+
+func (n *NetworkStore) waitResp(ctx context.Context, rch <-chan NetRpcResp, rid uint64) (NetRpcResp, error) {
+ select {
+ case resp := <-rch:
+ if resp.Type == NRpcErr {
+ var e NetRpcErr
+ if err := e.UnmarshalCBOR(bytes.NewReader(resp.Data)); err != nil {
+ return NetRpcResp{}, xerrors.Errorf("unmarshaling error data: %w", err)
+ }
+
+ var err error
+ switch e.Type {
+ case NRpcErrNotFound:
+ if e.Cid != nil {
+ err = ipld.ErrNotFound{
+ Cid: *e.Cid,
+ }
+ } else {
+ err = xerrors.Errorf("block not found, but cid was null")
+ }
+ case NRpcErrGeneric:
+ err = xerrors.Errorf("generic error")
+ default:
+ err = xerrors.Errorf("unknown error type")
+ }
+
+ return NetRpcResp{}, xerrors.Errorf("netstore error response: %s (%w)", e.Msg, err)
+ }
+
+ return resp, nil
+ case <-ctx.Done():
+ // todo send cancel req
+
+ n.respLk.Lock()
+ if n.respMap != nil {
+ delete(n.respMap, rid)
+ }
+ n.respLk.Unlock()
+
+ return NetRpcResp{}, ctx.Err()
+ }
+}
+
+func (n *NetworkStore) Has(ctx context.Context, c cid.Cid) (bool, error) {
+ req, rch, err := n.sendRpc(NRpcHas, []cid.Cid{c}, nil)
+ if err != nil {
+ return false, err
+ }
+
+ resp, err := n.waitResp(ctx, rch, req)
+ if err != nil {
+ return false, err
+ }
+
+ if len(resp.Data) != 1 {
+ return false, xerrors.Errorf("expected reposnse length to be 1 byte")
+ }
+ switch resp.Data[0] {
+ case cbg.CborBoolTrue[0]:
+ return true, nil
+ case cbg.CborBoolFalse[0]:
+ return false, nil
+ default:
+ return false, xerrors.Errorf("has: bad response: %x", resp.Data[0])
+ }
+}
+
+func (n *NetworkStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) {
+ req, rch, err := n.sendRpc(NRpcGet, []cid.Cid{c}, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ resp, err := n.waitResp(ctx, rch, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return blocks.NewBlockWithCid(resp.Data, c)
+}
+
+func (n *NetworkStore) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error {
+ req, rch, err := n.sendRpc(NRpcGet, []cid.Cid{c}, nil)
+ if err != nil {
+ return err
+ }
+
+ resp, err := n.waitResp(ctx, rch, req)
+ if err != nil {
+ return err
+ }
+
+ return callback(resp.Data) // todo return buf to pool
+}
+
+func (n *NetworkStore) GetSize(ctx context.Context, c cid.Cid) (int, error) {
+ req, rch, err := n.sendRpc(NRpcGetSize, []cid.Cid{c}, nil)
+ if err != nil {
+ return 0, err
+ }
+
+ resp, err := n.waitResp(ctx, rch, req)
+ if err != nil {
+ return 0, err
+ }
+
+ if len(resp.Data) != 4 {
+ return 0, xerrors.Errorf("expected getsize response to be 4 bytes, was %d", resp.Data)
+ }
+
+ return int(binary.LittleEndian.Uint32(resp.Data)), nil
+}
+
+func (n *NetworkStore) Put(ctx context.Context, block blocks.Block) error {
+ return n.PutMany(ctx, []blocks.Block{block})
+}
+
+func (n *NetworkStore) PutMany(ctx context.Context, blocks []blocks.Block) error {
+ // todo pool
+ cids := make([]cid.Cid, len(blocks))
+ blkDatas := make([][]byte, len(blocks))
+ for i, block := range blocks {
+ cids[i] = block.Cid()
+ blkDatas[i] = block.RawData()
+ }
+
+ req, rch, err := n.sendRpc(NRpcPut, cids, blkDatas)
+ if err != nil {
+ return err
+ }
+
+ _, err = n.waitResp(ctx, rch, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (n *NetworkStore) DeleteBlock(ctx context.Context, c cid.Cid) error {
+ return n.DeleteMany(ctx, []cid.Cid{c})
+}
+
+func (n *NetworkStore) DeleteMany(ctx context.Context, cids []cid.Cid) error {
+ req, rch, err := n.sendRpc(NRpcDelete, cids, nil)
+ if err != nil {
+ return err
+ }
+
+ _, err = n.waitResp(ctx, rch, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (n *NetworkStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) {
+ return nil, xerrors.Errorf("not supported")
+}
+
+func (n *NetworkStore) HashOnRead(enabled bool) {
+ // todo
+ return
+}
+
+func (n *NetworkStore) Stop(ctx context.Context) error {
+ close(n.closing)
+
+ select {
+ case <-n.closed:
+ return nil
+ case <-ctx.Done():
+ return ctx.Err()
+ }
+}
+
+var _ Blockstore = &NetworkStore{}
diff --git a/blockstore/net_serve.go b/blockstore/net_serve.go
new file mode 100644
index 000000000..2540c845e
--- /dev/null
+++ b/blockstore/net_serve.go
@@ -0,0 +1,237 @@
+package blockstore
+
+import (
+ "bytes"
+ "context"
+ "encoding/binary"
+
+ block "github.com/ipfs/go-block-format"
+ "github.com/ipfs/go-cid"
+ ipld "github.com/ipfs/go-ipld-format"
+ "github.com/libp2p/go-msgio"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+)
+
+type NetworkStoreHandler struct {
+ msgStream msgio.ReadWriteCloser
+
+ bs Blockstore
+}
+
+// NOTE: This code isn't yet hardened to accept untrusted input. See TODOs here and in net.go
+func HandleNetBstoreStream(ctx context.Context, bs Blockstore, mss msgio.ReadWriteCloser) *NetworkStoreHandler {
+ ns := &NetworkStoreHandler{
+ msgStream: mss,
+ bs: bs,
+ }
+
+ go ns.handle(ctx)
+
+ return ns
+}
+
+func (h *NetworkStoreHandler) handle(ctx context.Context) {
+ defer func() {
+ if err := h.msgStream.Close(); err != nil {
+ log.Errorw("error closing blockstore stream", "error", err)
+ }
+ }()
+
+ for {
+ var req NetRpcReq
+
+ ms, err := h.msgStream.ReadMsg()
+ if err != nil {
+ log.Warnw("bstore stream err", "error", err)
+ return
+ }
+
+ if err := req.UnmarshalCBOR(bytes.NewReader(ms)); err != nil {
+ return
+ }
+
+ h.msgStream.ReleaseMsg(ms)
+
+ switch req.Type {
+ case NRpcHas:
+ if len(req.Cid) != 1 {
+ if err := h.respondError(req.ID, xerrors.New("expected request for 1 cid"), cid.Undef); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ res, err := h.bs.Has(ctx, req.Cid[0])
+ if err != nil {
+ if err := h.respondError(req.ID, err, req.Cid[0]); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ var resData [1]byte
+ if res {
+ resData[0] = cbg.CborBoolTrue[0]
+ } else {
+ resData[0] = cbg.CborBoolFalse[0]
+ }
+
+ if err := h.respond(req.ID, NRpcOK, resData[:]); err != nil {
+ log.Warnw("writing response", "error", err)
+ return
+ }
+
+ case NRpcGet:
+ if len(req.Cid) != 1 {
+ if err := h.respondError(req.ID, xerrors.New("expected request for 1 cid"), cid.Undef); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ err := h.bs.View(ctx, req.Cid[0], func(bdata []byte) error {
+ return h.respond(req.ID, NRpcOK, bdata)
+ })
+ if err != nil {
+ if err := h.respondError(req.ID, err, req.Cid[0]); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ case NRpcGetSize:
+ if len(req.Cid) != 1 {
+ if err := h.respondError(req.ID, xerrors.New("expected request for 1 cid"), cid.Undef); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ sz, err := h.bs.GetSize(ctx, req.Cid[0])
+ if err != nil {
+ if err := h.respondError(req.ID, err, req.Cid[0]); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ var resData [4]byte
+ binary.LittleEndian.PutUint32(resData[:], uint32(sz))
+
+ if err := h.respond(req.ID, NRpcOK, resData[:]); err != nil {
+ log.Warnw("writing response", "error", err)
+ return
+ }
+
+ case NRpcPut:
+ blocks := make([]block.Block, len(req.Cid))
+
+ if len(req.Cid) != len(req.Data) {
+ if err := h.respondError(req.ID, xerrors.New("cid count didn't match data count"), cid.Undef); err != nil {
+ log.Warnw("writing error response", "error", err)
+ }
+ return
+ }
+
+ for i := range req.Cid {
+ blocks[i], err = block.NewBlockWithCid(req.Data[i], req.Cid[i])
+ if err != nil {
+ log.Warnw("make block", "error", err)
+ return
+ }
+ }
+
+ err := h.bs.PutMany(ctx, blocks)
+ if err != nil {
+ if err := h.respondError(req.ID, err, cid.Undef); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ if err := h.respond(req.ID, NRpcOK, []byte{}); err != nil {
+ log.Warnw("writing response", "error", err)
+ return
+ }
+ case NRpcDelete:
+ err := h.bs.DeleteMany(ctx, req.Cid)
+ if err != nil {
+ if err := h.respondError(req.ID, err, cid.Undef); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+
+ if err := h.respond(req.ID, NRpcOK, []byte{}); err != nil {
+ log.Warnw("writing response", "error", err)
+ return
+ }
+ default:
+ if err := h.respondError(req.ID, xerrors.New("unsupported request type"), cid.Undef); err != nil {
+ log.Warnw("writing error response", "error", err)
+ return
+ }
+ continue
+ }
+ }
+}
+
+func (h *NetworkStoreHandler) respondError(req uint64, uerr error, c cid.Cid) error {
+ var resp NetRpcResp
+ resp.ID = req
+ resp.Type = NRpcErr
+
+ nerr := NetRpcErr{
+ Type: NRpcErrGeneric,
+ Msg: uerr.Error(),
+ }
+ if ipld.IsNotFound(uerr) {
+ nerr.Type = NRpcErrNotFound
+ nerr.Cid = &c
+ }
+
+ var edata bytes.Buffer
+ if err := nerr.MarshalCBOR(&edata); err != nil {
+ return xerrors.Errorf("marshaling error data: %w", err)
+ }
+
+ resp.Data = edata.Bytes()
+
+ var msg bytes.Buffer
+ if err := resp.MarshalCBOR(&msg); err != nil {
+ return xerrors.Errorf("marshaling error response: %w", err)
+ }
+
+ if err := h.msgStream.WriteMsg(msg.Bytes()); err != nil {
+ return xerrors.Errorf("write error response: %w", err)
+ }
+
+ return nil
+}
+
+func (h *NetworkStoreHandler) respond(req uint64, rt NetRPCRespType, data []byte) error {
+ var resp NetRpcResp
+ resp.ID = req
+ resp.Type = rt
+ resp.Data = data
+
+ var msg bytes.Buffer
+ if err := resp.MarshalCBOR(&msg); err != nil {
+ return xerrors.Errorf("marshaling response: %w", err)
+ }
+
+ if err := h.msgStream.WriteMsg(msg.Bytes()); err != nil {
+ return xerrors.Errorf("write response: %w", err)
+ }
+
+ return nil
+}
diff --git a/blockstore/net_test.go b/blockstore/net_test.go
new file mode 100644
index 000000000..d8c33818e
--- /dev/null
+++ b/blockstore/net_test.go
@@ -0,0 +1,63 @@
+package blockstore
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "testing"
+
+ block "github.com/ipfs/go-block-format"
+ ipld "github.com/ipfs/go-ipld-format"
+ "github.com/libp2p/go-msgio"
+ "github.com/stretchr/testify/require"
+)
+
+func TestNetBstore(t *testing.T) {
+ ctx := context.Background()
+
+ cr, sw := io.Pipe()
+ sr, cw := io.Pipe()
+
+ cm := msgio.Combine(msgio.NewWriter(cw), msgio.NewReader(cr))
+ sm := msgio.Combine(msgio.NewWriter(sw), msgio.NewReader(sr))
+
+ bbs := NewMemorySync()
+ _ = HandleNetBstoreStream(ctx, bbs, sm)
+
+ nbs := NewNetworkStore(cm)
+
+ tb1 := block.NewBlock([]byte("aoeu"))
+
+ h, err := nbs.Has(ctx, tb1.Cid())
+ require.NoError(t, err)
+ require.False(t, h)
+
+ err = nbs.Put(ctx, tb1)
+ require.NoError(t, err)
+
+ h, err = nbs.Has(ctx, tb1.Cid())
+ require.NoError(t, err)
+ require.True(t, h)
+
+ sz, err := nbs.GetSize(ctx, tb1.Cid())
+ require.NoError(t, err)
+ require.Equal(t, 4, sz)
+
+ err = nbs.DeleteBlock(ctx, tb1.Cid())
+ require.NoError(t, err)
+
+ h, err = nbs.Has(ctx, tb1.Cid())
+ require.NoError(t, err)
+ require.False(t, h)
+
+ _, err = nbs.Get(ctx, tb1.Cid())
+ fmt.Println(err)
+ require.True(t, ipld.IsNotFound(err))
+
+ err = nbs.Put(ctx, tb1)
+ require.NoError(t, err)
+
+ b, err := nbs.Get(ctx, tb1.Cid())
+ require.NoError(t, err)
+ require.Equal(t, "aoeu", string(b.RawData()))
+}
diff --git a/blockstore/net_ws.go b/blockstore/net_ws.go
new file mode 100644
index 000000000..5c9a70d84
--- /dev/null
+++ b/blockstore/net_ws.go
@@ -0,0 +1,100 @@
+package blockstore
+
+import (
+ "bytes"
+ "context"
+
+ "github.com/gorilla/websocket"
+ "github.com/libp2p/go-msgio"
+ "golang.org/x/xerrors"
+)
+
+type wsWrapper struct {
+ wc *websocket.Conn
+
+ nextMsg []byte
+}
+
+func (w *wsWrapper) Read(b []byte) (int, error) {
+ return 0, xerrors.New("read unsupported")
+}
+
+func (w *wsWrapper) ReadMsg() ([]byte, error) {
+ if w.nextMsg != nil {
+ nm := w.nextMsg
+ w.nextMsg = nil
+ return nm, nil
+ }
+
+ mt, r, err := w.wc.NextReader()
+ if err != nil {
+ return nil, err
+ }
+
+ switch mt {
+ case websocket.BinaryMessage, websocket.TextMessage:
+ default:
+ return nil, xerrors.Errorf("unexpected message type")
+ }
+
+ // todo pool
+ // todo limit sizes
+ var mbuf bytes.Buffer
+ if _, err := mbuf.ReadFrom(r); err != nil {
+ return nil, err
+ }
+
+ return mbuf.Bytes(), nil
+}
+
+func (w *wsWrapper) ReleaseMsg(bytes []byte) {
+ // todo use a pool
+}
+
+func (w *wsWrapper) NextMsgLen() (int, error) {
+ if w.nextMsg != nil {
+ return len(w.nextMsg), nil
+ }
+
+ mt, msg, err := w.wc.ReadMessage()
+ if err != nil {
+ return 0, err
+ }
+
+ switch mt {
+ case websocket.BinaryMessage, websocket.TextMessage:
+ default:
+ return 0, xerrors.Errorf("unexpected message type")
+ }
+
+ w.nextMsg = msg
+ return len(w.nextMsg), nil
+}
+
+func (w *wsWrapper) Write(bytes []byte) (int, error) {
+ return 0, xerrors.New("write unsupported")
+}
+
+func (w *wsWrapper) WriteMsg(bytes []byte) error {
+ return w.wc.WriteMessage(websocket.BinaryMessage, bytes)
+}
+
+func (w *wsWrapper) Close() error {
+ return w.wc.Close()
+}
+
+var _ msgio.ReadWriteCloser = &wsWrapper{}
+
+func wsConnToMio(wc *websocket.Conn) msgio.ReadWriteCloser {
+ return &wsWrapper{
+ wc: wc,
+ }
+}
+
+func HandleNetBstoreWS(ctx context.Context, bs Blockstore, wc *websocket.Conn) *NetworkStoreHandler {
+ return HandleNetBstoreStream(ctx, bs, wsConnToMio(wc))
+}
+
+func NewNetworkStoreWS(wc *websocket.Conn) *NetworkStore {
+ return NewNetworkStore(wsConnToMio(wc))
+}
diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go
index 01c53f61e..dee6e784c 100644
--- a/blockstore/splitstore/splitstore.go
+++ b/blockstore/splitstore/splitstore.go
@@ -98,6 +98,10 @@ type Config struct {
// and directly purges cold blocks.
DiscardColdBlocks bool
+ // UniversalColdBlocks indicates whether all blocks being garbage collected and purged
+ // from the hotstore should be written to the cold store
+ UniversalColdBlocks bool
+
// HotstoreMessageRetention indicates the hotstore retention policy for messages.
// It has the following semantics:
// - a value of 0 will only retain messages within the compaction boundary (4 finalities)
@@ -111,21 +115,6 @@ type Config struct {
// A positive value is the number of compactions before a full GC is performed;
// a value of 1 will perform full GC in every compaction.
HotStoreFullGCFrequency uint64
-
- // EnableColdStoreAutoPrune turns on compaction of the cold store i.e. pruning
- // where hotstore compaction occurs every finality epochs pruning happens every 3 finalities
- // Default is false
- EnableColdStoreAutoPrune bool
-
- // ColdStoreFullGCFrequency specifies how often to performa a full (moving) GC on the coldstore.
- // Only applies if auto prune is enabled. A value of 0 disables while a value of 1 will do
- // full GC in every prune.
- // Default is 7 (about once every a week)
- ColdStoreFullGCFrequency uint64
-
- // ColdStoreRetention specifies the retention policy for data reachable from the chain, in
- // finalities beyond the compaction boundary, default is 0, -1 retains everything
- ColdStoreRetention int64
}
// ChainAccessor allows the Splitstore to access the chain. It will most likely
diff --git a/blockstore/splitstore/splitstore_check.go b/blockstore/splitstore/splitstore_check.go
index 6452b3ee2..336515980 100644
--- a/blockstore/splitstore/splitstore_check.go
+++ b/blockstore/splitstore/splitstore_check.go
@@ -125,7 +125,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error {
}
return nil
- })
+ }, func(cid.Cid) error { return nil })
if err != nil {
err = xerrors.Errorf("error walking chain: %w", err)
diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go
index 272d0afab..1c4c903ff 100644
--- a/blockstore/splitstore/splitstore_compact.go
+++ b/blockstore/splitstore/splitstore_compact.go
@@ -20,7 +20,6 @@ import (
"github.com/filecoin-project/go-state-types/abi"
- bstore "github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/metrics"
@@ -134,39 +133,6 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error {
log.Infow("compaction done", "took", time.Since(start))
}()
// only prune if auto prune is enabled and after at least one compaction
- } else if s.cfg.EnableColdStoreAutoPrune && epoch-s.pruneEpoch > PruneThreshold && s.compactionIndex > 0 {
- s.beginTxnProtect()
- s.compactType = cold
- go func() {
- defer atomic.StoreInt32(&s.compacting, 0)
- defer s.endTxnProtect()
-
- log.Info("pruning splitstore")
- start := time.Now()
-
- var retainP func(int64) bool
- switch {
- case s.cfg.ColdStoreRetention > int64(0):
- retainP = func(depth int64) bool {
- return depth <= int64(CompactionBoundary)+s.cfg.ColdStoreRetention*int64(build.Finality)
- }
- case s.cfg.ColdStoreRetention < 0:
- retainP = func(_ int64) bool { return true }
- default:
- retainP = func(depth int64) bool {
- return depth <= int64(CompactionBoundary)
- }
- }
- movingGC := s.cfg.ColdStoreFullGCFrequency > 0 && s.pruneIndex%int64(s.cfg.ColdStoreFullGCFrequency) == 0
- var gcOpts []bstore.BlockstoreGCOption
- if movingGC {
- gcOpts = append(gcOpts, bstore.WithFullGC(true))
- }
- doGC := func() error { return s.gcBlockstore(s.cold, gcOpts) }
-
- s.prune(curTs, retainP, doGC)
- log.Infow("prune done", "took", time.Since(start))
- }()
} else {
// no compaction necessary
atomic.StoreInt32(&s.compacting, 0)
@@ -562,6 +528,12 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
defer markSet.Close() //nolint:errcheck
defer s.debug.Flush()
+ coldSet, err := s.markSetEnv.New("cold", s.markSetSize)
+ if err != nil {
+ return xerrors.Errorf("error creating cold mark set: %w", err)
+ }
+ defer coldSet.Close() //nolint:errcheck
+
if err := s.checkClosing(); err != nil {
return err
}
@@ -580,24 +552,52 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
startMark := time.Now()
count := new(int64)
- err = s.walkChain(curTs, boundaryEpoch, inclMsgsEpoch, &noopVisitor{},
- func(c cid.Cid) error {
- if isUnitaryObject(c) {
- return errStopWalk
- }
- visit, err := markSet.Visit(c)
- if err != nil {
- return xerrors.Errorf("error visiting object: %w", err)
- }
-
- if !visit {
- return errStopWalk
- }
-
- atomic.AddInt64(count, 1)
+ coldCount := new(int64)
+ fCold := func(c cid.Cid) error {
+ // Writes to cold set optimized away in universal and discard mode
+ //
+ // Nothing gets written to cold store in discard mode so no cold objects to write
+ // Everything not marked hot gets written to cold store in universal mode so no need to track cold objects separately
+ if s.cfg.DiscardColdBlocks || s.cfg.UniversalColdBlocks {
return nil
- })
+ }
+
+ if isUnitaryObject(c) {
+ return errStopWalk
+ }
+
+ visit, err := coldSet.Visit(c)
+ if err != nil {
+ return xerrors.Errorf("error visiting object: %w", err)
+ }
+
+ if !visit {
+ return errStopWalk
+ }
+
+ atomic.AddInt64(coldCount, 1)
+ return nil
+ }
+ fHot := func(c cid.Cid) error {
+ if isUnitaryObject(c) {
+ return errStopWalk
+ }
+
+ visit, err := markSet.Visit(c)
+ if err != nil {
+ return xerrors.Errorf("error visiting object: %w", err)
+ }
+
+ if !visit {
+ return errStopWalk
+ }
+
+ atomic.AddInt64(count, 1)
+ return nil
+ }
+
+ err = s.walkChain(curTs, boundaryEpoch, inclMsgsEpoch, &noopVisitor{}, fHot, fCold)
if err != nil {
return xerrors.Errorf("error marking: %w", err)
@@ -631,8 +631,14 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
}
defer coldw.Close() //nolint:errcheck
+ purgew, err := NewColdSetWriter(s.discardSetPath())
+ if err != nil {
+ return xerrors.Errorf("error creating deadset: %w", err)
+ }
+ defer purgew.Close() //nolint:errcheck
+
// some stats for logging
- var hotCnt, coldCnt int
+ var hotCnt, coldCnt, purgeCnt int
err = s.hot.ForEachKey(func(c cid.Cid) error {
// was it marked?
mark, err := markSet.Has(c)
@@ -645,9 +651,27 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
return nil
}
- // it's cold, mark it as candidate for move
+ // it needs to be removed from hot store, mark it as candidate for purge
+ if err := purgew.Write(c); err != nil {
+ return xerrors.Errorf("error writing cid to purge set: %w", err)
+ }
+ purgeCnt++
+
+ coldMark, err := coldSet.Has(c)
+ if err != nil {
+ return xerrors.Errorf("error checking cold mark set for %s: %w", c, err)
+ }
+
+ // Discard mode: coldMark == false, s.cfg.UniversalColdBlocks == false, always return here, no writes to cold store
+ // Universal mode: coldMark == false, s.cfg.UniversalColdBlocks == true, never stop here, all writes to cold store
+ // Otherwise: s.cfg.UniversalColdBlocks == false, if !coldMark stop here and don't write to cold store, if coldMark continue and write to cold store
+ if !coldMark && !s.cfg.UniversalColdBlocks { // universal mode means mark everything as cold
+ return nil
+ }
+
+ // it's cold, mark as candidate for move
if err := coldw.Write(c); err != nil {
- return xerrors.Errorf("error writing cid to coldstore: %w", err)
+ return xerrors.Errorf("error writing cid to cold set")
}
coldCnt++
@@ -656,7 +680,9 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
if err != nil {
return xerrors.Errorf("error collecting cold objects: %w", err)
}
-
+ if err := purgew.Close(); err != nil {
+ return xerrors.Errorf("erroring closing purgeset: %w", err)
+ }
if err := coldw.Close(); err != nil {
return xerrors.Errorf("error closing coldset: %w", err)
}
@@ -705,6 +731,12 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
}
}
+ purger, err := NewColdSetReader(s.discardSetPath())
+ if err != nil {
+ return xerrors.Errorf("error opening coldset: %w", err)
+ }
+ defer purger.Close() //nolint:errcheck
+
// 4. Purge cold objects with checkpointing for recovery.
// This is the critical section of compaction, whereby any cold object not in the markSet is
// considered already deleted.
@@ -736,7 +768,7 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
// 5. purge cold objects from the hotstore, taking protected references into account
log.Info("purging cold objects from the hotstore")
startPurge := time.Now()
- err = s.purge(coldr, checkpoint, markSet)
+ err = s.purge(purger, checkpoint, markSet)
if err != nil {
return xerrors.Errorf("error purging cold objects: %w", err)
}
@@ -864,7 +896,7 @@ func (s *SplitStore) endCriticalSection() {
}
func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEpoch,
- visitor ObjectVisitor, f func(cid.Cid) error) error {
+ visitor ObjectVisitor, fHot, fCold func(cid.Cid) error) error {
var walked ObjectVisitor
var mx sync.Mutex
// we copy the tipset first into a new slice, which allows us to reuse it in every epoch.
@@ -886,7 +918,7 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp
atomic.AddInt64(walkCnt, 1)
- if err := f(c); err != nil {
+ if err := fHot(c); err != nil {
return err
}
@@ -904,27 +936,37 @@ func (s *SplitStore) walkChain(ts *types.TipSet, inclState, inclMsgs abi.ChainEp
if inclMsgs < inclState {
// we need to use walkObjectIncomplete here, as messages/receipts may be missing early on if we
// synced from snapshot and have a long HotStoreMessageRetentionPolicy.
- if err := s.walkObjectIncomplete(hdr.Messages, visitor, f, stopWalk); err != nil {
+ if err := s.walkObjectIncomplete(hdr.Messages, visitor, fHot, stopWalk); err != nil {
return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
}
- if err := s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, f, stopWalk); err != nil {
+ if err := s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, fHot, stopWalk); err != nil {
return xerrors.Errorf("error walking messages receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
}
} else {
- if err := s.walkObject(hdr.Messages, visitor, f); err != nil {
+ if err := s.walkObject(hdr.Messages, visitor, fHot); err != nil {
return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
}
- if err := s.walkObject(hdr.ParentMessageReceipts, visitor, f); err != nil {
+ if err := s.walkObject(hdr.ParentMessageReceipts, visitor, fHot); err != nil {
return xerrors.Errorf("error walking message receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
}
}
}
+ // messages and receipts outside of inclMsgs are included in the cold store
+ if hdr.Height < inclMsgs && hdr.Height > 0 {
+ if err := s.walkObjectIncomplete(hdr.Messages, visitor, fCold, stopWalk); err != nil {
+ return xerrors.Errorf("error walking messages (cid: %s): %w", hdr.Messages, err)
+ }
+ if err := s.walkObjectIncomplete(hdr.ParentMessageReceipts, visitor, fCold, stopWalk); err != nil {
+ return xerrors.Errorf("error walking messages receipts (cid: %s): %w", hdr.ParentMessageReceipts, err)
+ }
+ }
+
// state is only retained if within the inclState boundary, with the exception of genesis
if hdr.Height >= inclState || hdr.Height == 0 {
- if err := s.walkObject(hdr.ParentStateRoot, visitor, f); err != nil {
+ if err := s.walkObject(hdr.ParentStateRoot, visitor, fHot); err != nil {
return xerrors.Errorf("error walking state root (cid: %s): %w", hdr.ParentStateRoot, err)
}
atomic.AddInt64(scanCnt, 1)
@@ -1296,7 +1338,7 @@ func (s *SplitStore) coldSetPath() string {
return filepath.Join(s.path, "coldset")
}
-func (s *SplitStore) deadSetPath() string {
+func (s *SplitStore) discardSetPath() string {
return filepath.Join(s.path, "deadset")
}
diff --git a/blockstore/splitstore/splitstore_prune.go b/blockstore/splitstore/splitstore_prune.go
index 7d54d8e4e..6a26c00d2 100644
--- a/blockstore/splitstore/splitstore_prune.go
+++ b/blockstore/splitstore/splitstore_prune.go
@@ -208,7 +208,7 @@ func (s *SplitStore) doPrune(curTs *types.TipSet, retainStateP func(int64) bool,
log.Info("collecting dead objects")
startCollect := time.Now()
- deadw, err := NewColdSetWriter(s.deadSetPath())
+ deadw, err := NewColdSetWriter(s.discardSetPath())
if err != nil {
return xerrors.Errorf("error creating coldset: %w", err)
}
@@ -267,7 +267,7 @@ func (s *SplitStore) doPrune(curTs *types.TipSet, retainStateP func(int64) bool,
return err
}
- deadr, err := NewColdSetReader(s.deadSetPath())
+ deadr, err := NewColdSetReader(s.discardSetPath())
if err != nil {
return xerrors.Errorf("error opening deadset: %w", err)
}
@@ -311,10 +311,10 @@ func (s *SplitStore) doPrune(curTs *types.TipSet, retainStateP func(int64) bool,
log.Warnf("error removing checkpoint: %s", err)
}
if err := deadr.Close(); err != nil {
- log.Warnf("error closing deadset: %s", err)
+ log.Warnf("error closing discard set: %s", err)
}
- if err := os.Remove(s.deadSetPath()); err != nil {
- log.Warnf("error removing deadset: %s", err)
+ if err := os.Remove(s.discardSetPath()); err != nil {
+ log.Warnf("error removing discard set: %s", err)
}
// we are done; do some housekeeping
@@ -344,7 +344,7 @@ func (s *SplitStore) completePrune() error {
}
defer checkpoint.Close() //nolint:errcheck
- deadr, err := NewColdSetReader(s.deadSetPath())
+ deadr, err := NewColdSetReader(s.discardSetPath())
if err != nil {
return xerrors.Errorf("error opening deadset: %w", err)
}
@@ -378,7 +378,7 @@ func (s *SplitStore) completePrune() error {
if err := deadr.Close(); err != nil {
log.Warnf("error closing deadset: %s", err)
}
- if err := os.Remove(s.deadSetPath()); err != nil {
+ if err := os.Remove(s.discardSetPath()); err != nil {
log.Warnf("error removing deadset: %s", err)
}
diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go
index d23a78cf0..750a2efed 100644
--- a/blockstore/splitstore/splitstore_test.go
+++ b/blockstore/splitstore/splitstore_test.go
@@ -38,6 +38,7 @@ func init() {
func testSplitStore(t *testing.T, cfg *Config) {
ctx := context.Background()
chain := &mockChain{t: t}
+ fmt.Printf("Config: %v\n", cfg)
// the myriads of stores
ds := dssync.MutexWrap(datastore.NewMapDatastore())
@@ -225,7 +226,7 @@ func TestSplitStoreCompaction(t *testing.T) {
//stm: @SPLITSTORE_SPLITSTORE_OPEN_001, @SPLITSTORE_SPLITSTORE_CLOSE_001
//stm: @SPLITSTORE_SPLITSTORE_PUT_001, @SPLITSTORE_SPLITSTORE_ADD_PROTECTOR_001
//stm: @SPLITSTORE_SPLITSTORE_CLOSE_001
- testSplitStore(t, &Config{MarkSetType: "map"})
+ testSplitStore(t, &Config{MarkSetType: "map", UniversalColdBlocks: true})
}
func TestSplitStoreCompactionWithBadger(t *testing.T) {
@@ -237,7 +238,7 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) {
t.Cleanup(func() {
badgerMarkSetBatchSize = bs
})
- testSplitStore(t, &Config{MarkSetType: "badger"})
+ testSplitStore(t, &Config{MarkSetType: "badger", UniversalColdBlocks: true})
}
func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) {
@@ -283,7 +284,7 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) {
path := t.TempDir()
// open the splitstore
- ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map"})
+ ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map", UniversalColdBlocks: true})
if err != nil {
t.Fatal(err)
}
@@ -422,7 +423,7 @@ func testSplitStoreReification(t *testing.T, f func(context.Context, blockstore.
path := t.TempDir()
- ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map"})
+ ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map", UniversalColdBlocks: true})
if err != nil {
t.Fatal(err)
}
@@ -522,7 +523,7 @@ func testSplitStoreReificationLimit(t *testing.T, f func(context.Context, blocks
path := t.TempDir()
- ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map"})
+ ss, err := Open(path, ds, hot, cold, &Config{MarkSetType: "map", UniversalColdBlocks: true})
if err != nil {
t.Fatal(err)
}
diff --git a/blockstore/splitstore/splitstore_warmup.go b/blockstore/splitstore/splitstore_warmup.go
index e1a121125..e387263da 100644
--- a/blockstore/splitstore/splitstore_warmup.go
+++ b/blockstore/splitstore/splitstore_warmup.go
@@ -110,7 +110,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error {
mx.Unlock()
return nil
- })
+ }, func(cid.Cid) error { return nil })
if err != nil {
return err
diff --git a/blockstore/union_test.go b/blockstore/union_test.go
index a3ca117b2..579489947 100644
--- a/blockstore/union_test.go
+++ b/blockstore/union_test.go
@@ -13,6 +13,7 @@ var (
b0 = blocks.NewBlock([]byte("abc"))
b1 = blocks.NewBlock([]byte("foo"))
b2 = blocks.NewBlock([]byte("bar"))
+ b3 = blocks.NewBlock([]byte("baz"))
)
func TestUnionBlockstore_Get(t *testing.T) {
diff --git a/build/actors/v10.tar.zst b/build/actors/v10.tar.zst
new file mode 100644
index 000000000..f5644f474
Binary files /dev/null and b/build/actors/v10.tar.zst differ
diff --git a/build/actors/v9.tar.zst b/build/actors/v9.tar.zst
new file mode 100644
index 000000000..95b887312
Binary files /dev/null and b/build/actors/v9.tar.zst differ
diff --git a/build/bootstrap/butterflynet.pi b/build/bootstrap/butterflynet.pi
index 919b71aa8..556b5d14f 100644
--- a/build/bootstrap/butterflynet.pi
+++ b/build/bootstrap/butterflynet.pi
@@ -1,2 +1,2 @@
-/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWSUZhAY3eyoPUboJ1ZWe4dNPFWTr1EPoDjbTDSAN15uhY
-/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWDfvNrSRVGWAGbn3sm9C8z98W2x25qCZjaXGHXmGiH24e
+/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWKeDMuJbouvypr1nL2qRruhNVXzv4QiLsZRh6gnvLkc7p
+/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWSsACNHLGoJbPqeitNY7tom19Nxq8x5ag36eTwmgcAeLo
diff --git a/build/bootstrap/calibnet.pi b/build/bootstrap/calibnet.pi
index 20473eaaa..4ac1d1e3a 100644
--- a/build/bootstrap/calibnet.pi
+++ b/build/bootstrap/calibnet.pi
@@ -1,4 +1,4 @@
-/dns4/bootstrap-0.calibration.fildev.network/tcp/1347/p2p/12D3KooWJkikQQkxS58spo76BYzFt4fotaT5NpV2zngvrqm4u5ow
-/dns4/bootstrap-1.calibration.fildev.network/tcp/1347/p2p/12D3KooWLce5FDHR4EX4CrYavphA5xS3uDsX6aoowXh5tzDUxJav
-/dns4/bootstrap-2.calibration.fildev.network/tcp/1347/p2p/12D3KooWA9hFfQG9GjP6bHeuQQbMD3FDtZLdW1NayxKXUT26PQZu
-/dns4/bootstrap-3.calibration.fildev.network/tcp/1347/p2p/12D3KooWMHDi3LVTFG8Szqogt7RkNXvonbQYqSazxBx41A5aeuVz
+/dns4/bootstrap-0.calibration.fildev.network/tcp/1347/p2p/12D3KooWCi2w8U4DDB9xqrejb5KYHaQv2iA2AJJ6uzG3iQxNLBMy
+/dns4/bootstrap-1.calibration.fildev.network/tcp/1347/p2p/12D3KooWDTayrBojBn9jWNNUih4nNQQBGJD7Zo3gQCKgBkUsS6dp
+/dns4/bootstrap-2.calibration.fildev.network/tcp/1347/p2p/12D3KooWNRxTHUn8bf7jz1KEUPMc2dMgGfa4f8ZJTsquVSn3vHCG
+/dns4/bootstrap-3.calibration.fildev.network/tcp/1347/p2p/12D3KooWFWUqE9jgXvcKHWieYs9nhyp6NF4ftwLGAHm4sCv73jjK
diff --git a/build/builtin_actors.go b/build/builtin_actors.go
index ba61fc70e..4d283919e 100644
--- a/build/builtin_actors.go
+++ b/build/builtin_actors.go
@@ -18,6 +18,8 @@ import (
"github.com/ipld/go-car"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
@@ -28,14 +30,14 @@ var embeddedBuiltinActorReleases embed.FS
func init() {
if BundleOverrides == nil {
- BundleOverrides = make(map[actors.Version]string)
+ BundleOverrides = make(map[actorstypes.Version]string)
}
for _, av := range actors.Versions {
path := os.Getenv(fmt.Sprintf("LOTUS_BUILTIN_ACTORS_V%d_BUNDLE", av))
if path == "" {
continue
}
- BundleOverrides[actors.Version(av)] = path
+ BundleOverrides[actorstypes.Version(av)] = path
}
if err := loadManifests(NetworkBundle); err != nil {
panic(err)
@@ -55,7 +57,7 @@ func UseNetworkBundle(netw string) error {
}
func loadManifests(netw string) error {
- overridden := make(map[actors.Version]struct{})
+ overridden := make(map[actorstypes.Version]struct{})
var newMetadata []*BuiltinActorsMetadata
// First, prefer overrides.
for av, path := range BundleOverrides {
@@ -94,7 +96,7 @@ func loadManifests(netw string) error {
type BuiltinActorsMetadata struct {
Network string
- Version actors.Version
+ Version actorstypes.Version
ManifestCid cid.Cid
Actors map[string]cid.Cid
}
@@ -182,7 +184,7 @@ func readEmbeddedBuiltinActorsMetadata(bundle string) ([]*BuiltinActorsMetadata,
}
bundles = append(bundles, &BuiltinActorsMetadata{
Network: name,
- Version: actors.Version(version),
+ Version: actorstypes.Version(version),
ManifestCid: root,
Actors: actorCids,
})
@@ -229,7 +231,7 @@ func readBundleManifest(r io.Reader) (cid.Cid, map[string]cid.Cid, error) {
}
// GetEmbeddedBuiltinActorsBundle returns the builtin-actors bundle for the given actors version.
-func GetEmbeddedBuiltinActorsBundle(version actors.Version) ([]byte, bool) {
+func GetEmbeddedBuiltinActorsBundle(version actorstypes.Version) ([]byte, bool) {
fi, err := embeddedBuiltinActorReleases.Open(fmt.Sprintf("actors/v%d.tar.zst", version))
if err != nil {
return nil, false
diff --git a/build/builtin_actors_gen.go b/build/builtin_actors_gen.go
index f8d25aa3c..fa10798ef 100644
--- a/build/builtin_actors_gen.go
+++ b/build/builtin_actors_gen.go
@@ -23,6 +23,45 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
"system": MustParseCid("bafk2bzacec6xctjxybp7r3kkhase56o6jsaiua7ure5ttu2xfuojt4jhlsoa6"),
"verifiedregistry": MustParseCid("bafk2bzacec2hcqlqcfacylfcrhhliwkisvh4y3adwt47xkf2gdvodwu6ccepc"),
},
+}, {
+ Network: "butterflynet",
+ Version: 9,
+ ManifestCid: MustParseCid("bafy2bzacec35by4erhcdgcsgzp7yb3j57utydlxxfc73m3k5pep67ehvvyv6i"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaceajsdln7v4chxqoukiw7lxw6aexg5qdsaex2hgelz2sbu24iblhzg"),
+ "cron": MustParseCid("bafk2bzacecgrwmgnqhybn3l23uvwf2n2vrcfjrprfzgd44uxers2pgr5mhsue"),
+ "datacap": MustParseCid("bafk2bzacebyier2ceh27acbrq2ccv4efvzotl6qntnlrxdsrik6i4tembz6qw"),
+ "init": MustParseCid("bafk2bzaceberhto43wnf4pklkd4c7d36kzslngyzyms4op7shxuswv3dtvfxu"),
+ "multisig": MustParseCid("bafk2bzaceaclpbrhoqdruvsuqqgknvy2k5dywzmjoehk4uarce3uvt3w2rewu"),
+ "paymentchannel": MustParseCid("bafk2bzacedzp56g5cg73oilloak3kf7u667rdkd5pgnhe2cljmr3o7ykcrzuk"),
+ "reward": MustParseCid("bafk2bzacebczbwfbbi6mvppbjcozatasjiaohvjjiqcy65ccuuyyw3xiixhk2"),
+ "storagemarket": MustParseCid("bafk2bzaceawqexy6t2ybzh3jjwhbs7icbg5vqnedbbge4e4r4pfp7spkcadsu"),
+ "storageminer": MustParseCid("bafk2bzacearemd7pn2jj26fdtqd4di27lfhpng3vp5chepm7qnmdzgiqr6wfi"),
+ "storagepower": MustParseCid("bafk2bzaceddc7fiaxfobfegqaobf5xinjgmhsa5iu4yi6klvc3jmjimcdvgyg"),
+ "system": MustParseCid("bafk2bzacedylltr57b2n6zpadh4i2c2kis4fzzvhao3kgvfaggrrbqyacew7q"),
+ "verifiedregistry": MustParseCid("bafk2bzacecjkesz766626ab4svnzpq3jfs26a75vfktlfaku5fjdao2eyiqyq"),
+ },
+}, {
+ Network: "butterflynet",
+ Version: 10,
+ ManifestCid: MustParseCid("bafy2bzaceciz4ytt5gnn6gc4epez7v6xeg6efkgbvwfxkoa34o2gj3hp5f7zc"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzacedavorwsriewoddjlaganjpsk3o7zfts2wyid3clv5xnctacg37j2"),
+ "cron": MustParseCid("bafk2bzacebtauucwaewxuzgxfpjtmn6xt3kya4om4ugyprlkhhkde76h7fkqg"),
+ "datacap": MustParseCid("bafk2bzacebzdjapqwasq6woxkgq2nm2nre3v7cl2754xwiuo2cfhvsceq4cba"),
+ "eam": MustParseCid("bafk2bzacecmr4zdbpfnemvgo446qby7x4y4v5cbfespt3f6ousv2hxnflyrlk"),
+ "embryo": MustParseCid("bafk2bzacebj2mj5zlcs3yjlgpbznzistfjkdlwaoncjziliqrxqavvz4dcvnk"),
+ "evm": MustParseCid("bafk2bzacebuewexvig54cuvsvwn4k4zr36tm2q5fel4ezq4v7363n2lmn362k"),
+ "init": MustParseCid("bafk2bzacebww5gsctsk5hack2alkt4kh55bmpb4ywzbyyhoaskryymjj3snj6"),
+ "multisig": MustParseCid("bafk2bzacec5k4wxvou34pyjd5kcsrbsfnlk4k753kkscg3ron2r7tsxollfsq"),
+ "paymentchannel": MustParseCid("bafk2bzacebzdeaxglaqpmegalakmxr6secjd24mu5llo4ctoy7pvom5upyuvs"),
+ "reward": MustParseCid("bafk2bzaceb4hyabxnyrrsno5erqqwk5ynnjibblzfcaq3aotlz3ek4uu6dyla"),
+ "storagemarket": MustParseCid("bafk2bzacedpocbf2lg2x2jg6arw2argnwmvo2hyjqvpkrgfu4khz5mtlzxz2o"),
+ "storageminer": MustParseCid("bafk2bzaceacrumah7jdfc62bmvemob4lsh5yiohwodest2cgxakgnn24cenlk"),
+ "storagepower": MustParseCid("bafk2bzaceaxz6n5nywermfptnz6dc53vqsa42lic4rf66l4irm3mqfj4ak5ps"),
+ "system": MustParseCid("bafk2bzaceb4w5bblgyu25ylytpmfrixjsk2ra6emd44j4mv42xfxbwnqloyzi"),
+ "verifiedregistry": MustParseCid("bafk2bzacedbz2koeb6teewobcjdpgfv7qdae7utgoka6wzlkf6gronnis2nn2"),
+ },
}, {
Network: "calibrationnet",
Version: 8,
@@ -40,6 +79,45 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
"system": MustParseCid("bafk2bzaceaqrkllksxv2jsfgjvmuewx5vbzrammw5mdscod6gkdr3ijih2q64"),
"verifiedregistry": MustParseCid("bafk2bzaceaihibfu625lbtzdp3tcftscshrmbgghgrc7kzqhxn4455pycpdkm"),
},
+}, {
+ Network: "calibrationnet",
+ Version: 9,
+ ManifestCid: MustParseCid("bafy2bzacedbedgynklc4dgpyxippkxmba2mgtw7ecntoneclsvvl4klqwuyyy"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaceavfgpiw6whqigmskk74z4blm22nwjfnzxb4unlqz2e4wg3c5ujpw"),
+ "cron": MustParseCid("bafk2bzaceb7hxmudhvkizszbmmf2ur2qfnfxfkok3xmbrlifylx6huw4bb3s4"),
+ "datacap": MustParseCid("bafk2bzaceanmwcfjfj65xy275rrfqqgoblnuqirdg6zwhc6qhbfhpphomvceu"),
+ "init": MustParseCid("bafk2bzaceczqxpivlxifdo5ohr2rx5ny4uyvssm6tkf7am357xm47x472yxu2"),
+ "multisig": MustParseCid("bafk2bzacec6gmi7ucukr3bk67akaxwngohw3lsg3obvdazhmfhdzflkszk3tg"),
+ "paymentchannel": MustParseCid("bafk2bzacec4kg3bfjtssvv2b4wizlbdk3pdtrg5aknzgeb3a6rmksgurpynca"),
+ "reward": MustParseCid("bafk2bzacebpptqhcw6mcwdj576dgpryapdd2zfexxvqzlh3aoc24mabwgmcss"),
+ "storagemarket": MustParseCid("bafk2bzacebkfcnc27d3agm2bhzzbvvtbqahmvy2b2nf5xyj4aoxehow3bules"),
+ "storageminer": MustParseCid("bafk2bzacebz4na3nq4gmumghegtkaofrv4nffiihd7sxntrryfneusqkuqodm"),
+ "storagepower": MustParseCid("bafk2bzaceburxajojmywawjudovqvigmos4dlu4ifdikogumhso2ca2ccaleo"),
+ "system": MustParseCid("bafk2bzaceaue3nzucbom3tcclgyaahy3iwvbqejsxrohiquakvvsjgbw3shac"),
+ "verifiedregistry": MustParseCid("bafk2bzacebh7dj6j7yi5vadh7lgqjtq42qi2uq4n6zy2g5vjeathacwn2tscu"),
+ },
+}, {
+ Network: "calibrationnet",
+ Version: 10,
+ ManifestCid: MustParseCid("bafy2bzaced7wbd43lvgc55xb37mkoo4ppev6ig4jj4j7dtswtjfjq4u5qmpck"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzacecq4owv5begvryvpsy4atfb2jnf7g7o4hxovtdb5a4jfkzacownli"),
+ "cron": MustParseCid("bafk2bzaced4uz5w5h5wksx4end27lphd4qc4kh7q336uyt46lba5ddynwftya"),
+ "datacap": MustParseCid("bafk2bzacedoc7y4s5n3p2zo4bcmafcrellkakn2e3uyf5wb3mtbuqhvwqn2l4"),
+ "eam": MustParseCid("bafk2bzacealpqjgz5qmucm3v6z6hn36igx7zijixhqrxwoj3g4bdgvyml3adi"),
+ "embryo": MustParseCid("bafk2bzacebj2mj5zlcs3yjlgpbznzistfjkdlwaoncjziliqrxqavvz4dcvnk"),
+ "evm": MustParseCid("bafk2bzacedmlmyy2efbt4qk5ighawiychklhzc6pzyiwvpijwvxoq3xyxlgxw"),
+ "init": MustParseCid("bafk2bzaceaqcfmfylwdemq5bdcelydpf6iqfct4p7b2zwtmqyhuxn522yvic2"),
+ "multisig": MustParseCid("bafk2bzacebuh55hkbkobmmoaoduruss5nsh6e2gtqtdbqsmw6e7k5vg6heyrm"),
+ "paymentchannel": MustParseCid("bafk2bzacedcpzw7prdoxnaclcvmtwr6yf54zi4bzzwe5w3xknh72ji6p3qfc6"),
+ "reward": MustParseCid("bafk2bzaced74ym6j424zzbr6millasfcyl3r4zm5fnauasrwn3ti6fdarbkym"),
+ "storagemarket": MustParseCid("bafk2bzacec7delr2q42yj4wu3daa5xjz4zezeivphtx3xwyvpgwpdnfoevhh2"),
+ "storageminer": MustParseCid("bafk2bzaced7isnew5lhu237pdtwaqmbv65qqvfmmnve2c5yfobtfqw2fptuvc"),
+ "storagepower": MustParseCid("bafk2bzacebe5frk6gcgzcvzkxavhhbs3id3iyacybn7y7gxwzgl5t6zawzswg"),
+ "system": MustParseCid("bafk2bzacectivaezqijucle5s2f7xeui5uxig7bnk7fe4vsvz3xu7agjtb2ge"),
+ "verifiedregistry": MustParseCid("bafk2bzaceczgwckte4exultjxyzgzoo6m6r5coyphnlappi4clethhhybslxc"),
+ },
}, {
Network: "caterpillarnet",
Version: 8,
@@ -57,6 +135,45 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
"system": MustParseCid("bafk2bzacebu47th3xerlngqavlipb6cfu2utljkxxzgadc3totogto2tmx2jc"),
"verifiedregistry": MustParseCid("bafk2bzaceci3niq3rmbcmepgn27zvlgci6d5t4dvthx3pbmmx3wcu5elova6i"),
},
+}, {
+ Network: "caterpillarnet",
+ Version: 9,
+ ManifestCid: MustParseCid("bafy2bzacedo6tmei6rzjaaddh2yffe5xgr6w4smnadofjhomc3saiv3ubplqe"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzacebb32htqlwcwiotyvtbeehfmluu2ubjnepo57gelelwitudrstwba"),
+ "cron": MustParseCid("bafk2bzaceatvkww7soy4a6onu6xhe7pzkdzkqw46ywuu56yv3ncl76xpotzqu"),
+ "datacap": MustParseCid("bafk2bzaced57nk7i7w6qmbosy4gd6atme6yppesdgjllou6nppbti5yw6glcg"),
+ "init": MustParseCid("bafk2bzacedtoputbtz573ytg4yo5wbbg7fbhrzplux4uknxrb2jarifcuxxou"),
+ "multisig": MustParseCid("bafk2bzacec22z3xz45mbwgtliwkj7ngc43bervnt557c6dqsg6aesatpd5isy"),
+ "paymentchannel": MustParseCid("bafk2bzacedym7xnaxr2igfq72rttj2adqyqqfxk3j4qovp2bcwqk5paoe4t7e"),
+ "reward": MustParseCid("bafk2bzacedemsmbmbtk5toprmm6jivjq3wkxumavc65vpvm6ngspgjfkth7z6"),
+ "storagemarket": MustParseCid("bafk2bzacecb53mmklf4rbv263dvufqj3nsf7mi6zk2tjlgwmzbr633kw3ds3w"),
+ "storageminer": MustParseCid("bafk2bzacea3wljpn2ixgnd4lovr6yckiwd652ytcrz5amgj47lg6drjhgggqa"),
+ "storagepower": MustParseCid("bafk2bzaceakvohgvovpeldb6hjfg7readxo37a5h4qauis4nz6pte7mcll6c2"),
+ "system": MustParseCid("bafk2bzacecisuqj2ln7ep72xaejvs2lrgh2logc7retxxpd3qvobymwyz7bxo"),
+ "verifiedregistry": MustParseCid("bafk2bzacebyjosiripwqyf56yhjfs5hg26mch7totsqth4rgpt5j32hqg6ric"),
+ },
+}, {
+ Network: "caterpillarnet",
+ Version: 10,
+ ManifestCid: MustParseCid("bafy2bzacea5csj2os7h76a6yvf6shgpwkysawijxemk5uvvzejxrwjo6ir4yg"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzacea7tpruyxdgyz4xa7curiphwdw4abmspft3ee24puruazdcl3tq5c"),
+ "cron": MustParseCid("bafk2bzacebc6kkj7kzsicm5baszjgd37b4b3kijsffqmmkhhjlyd7zhkwfcqm"),
+ "datacap": MustParseCid("bafk2bzaceddcmwl6po2jd3tfkkgv4zvub7i47gsx33pkqdspqhgvhe4npc4as"),
+ "eam": MustParseCid("bafk2bzaceccsvcww2rmqnh4plkq6oapqaeqbhydrtup54z4dwunolz5tpgtb4"),
+ "embryo": MustParseCid("bafk2bzacebj2mj5zlcs3yjlgpbznzistfjkdlwaoncjziliqrxqavvz4dcvnk"),
+ "evm": MustParseCid("bafk2bzacea5sig3zpxfkqppoj3t344cvuhzvkx6ge2isgdzc34rfpng2ogdje"),
+ "init": MustParseCid("bafk2bzacedtby353aho7itoyoj7w6moydmigjm3sgy6djgnfxqehlpae4vcc2"),
+ "multisig": MustParseCid("bafk2bzacedyguvwz5zfveqoqicn3j6lkdzipf247nhvdi6dvmahulr7nzgox6"),
+ "paymentchannel": MustParseCid("bafk2bzaceavaatmmnsz3v3ksopcbu6jx4iq7u7nnmqbclsiabsfkfu3zfpmka"),
+ "reward": MustParseCid("bafk2bzacecrphs4avteik4yejsqwkpy5bcqramdhnzykbfq3uu2qalj2p26ti"),
+ "storagemarket": MustParseCid("bafk2bzaceajby2jb5m3fenzarum374zxdzuyrpkspfljwovu7c3hvyceqd5sa"),
+ "storageminer": MustParseCid("bafk2bzacebqtn7jdvk756ighri5ajro6gjepnef3c6rxupbbgkth62zytiy5s"),
+ "storagepower": MustParseCid("bafk2bzacedwlo32brlalpovfkkk7qwo3ou2kpgv2bf7fioy5srn7uejmn7n46"),
+ "system": MustParseCid("bafk2bzacebbt63h26x5vw5fdo2pmdb4q65u3t6lilkugvmjar6zfsc7ethxsi"),
+ "verifiedregistry": MustParseCid("bafk2bzacecr5kbyypdxnxlepzk5sji2k72t454vto5ok4owfcuwfpeyivjtu4"),
+ },
}, {
Network: "devnet",
Version: 8,
@@ -74,6 +191,45 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
"system": MustParseCid("bafk2bzacecf7eta2stfd3cnuxzervd33imbvlaqq6b5tsho7pxmhifrybreru"),
"verifiedregistry": MustParseCid("bafk2bzaceaajgtglewgitshgdi2nzrvq7eihjtyqj5yiamesqun2hujl3xev2"),
},
+}, {
+ Network: "devnet",
+ Version: 9,
+ ManifestCid: MustParseCid("bafy2bzacedozk3jh2j4nobqotkbofodq4chbrabioxbfrygpldgoxs3zwgggk"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaced5llqnqqhypolyuogz3h2wjomugqkrhyhocvly3aoib4c5xiush6"),
+ "cron": MustParseCid("bafk2bzaceahwdt32ji53mo5yz6imvztz3s3g2ra5uz3jdfa77j7hqcnq6r4l2"),
+ "datacap": MustParseCid("bafk2bzaceabcxoy5iscdierasorjoj6xzqgnnb5pmrr7prkuibw4yggx3v2d2"),
+ "init": MustParseCid("bafk2bzaceastwn42kqyztz7uzej7l4lemp5nakqqsfvksry7k75q5ombhprme"),
+ "multisig": MustParseCid("bafk2bzacebeiygkjupkpfxcrsidci4bvn6afkvx4lsj3ut3ywhsj654pzfgk4"),
+ "paymentchannel": MustParseCid("bafk2bzacedhsdoo4ww47rm44pizu5qqpho753cizzbbvnd5yz3nm3347su5cy"),
+ "reward": MustParseCid("bafk2bzacebzqvisqe3iaodtxq7l2lgzwfkxznrnp676ddpllqcpvuae5i33le"),
+ "storagemarket": MustParseCid("bafk2bzaceduauegz4nniegh667btjhg2anipwpxeb664s4ossq2ifvuqwqlso"),
+ "storageminer": MustParseCid("bafk2bzacec23wjdmbm5pt6pqsbjb3w6j7vyrolijz2mysvp6clllfgpmhb6ge"),
+ "storagepower": MustParseCid("bafk2bzacebnyywv46n2ghg62inllwpmnyuwtoz57fn5lpgpf436mahajg4qrg"),
+ "system": MustParseCid("bafk2bzacebgafb6h2o2g5whrujc2uvsttrussyc5t56rvhrjqkqhzdu4jopwa"),
+ "verifiedregistry": MustParseCid("bafk2bzacednorhcy446agy7ecpmfms2u4aoa3mj2eqomffuoerbik5yavrxyi"),
+ },
+}, {
+ Network: "devnet",
+ Version: 10,
+ ManifestCid: MustParseCid("bafy2bzacea73thrlpfejrswlcu5uhe7rcgdewvmrcwoef6jzngsba3i4v5ibi"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaceau2o55aripm7kqrbzzog72zcduv5psnxzpohx5rdkykepc4z7aag"),
+ "cron": MustParseCid("bafk2bzacec5qc5xluwikf4lolfa4oe356iwep25tiezbxfdyg5jib54rhlh6q"),
+ "datacap": MustParseCid("bafk2bzacebo47u6q3xou5exsecjpa4rpfqjfm7vyhz4qlr3nk7p46trsk4occ"),
+ "eam": MustParseCid("bafk2bzacea6yeptevserd7ayf4ahokor4sdpizpxpbqwkuvvhzdkon672shsm"),
+ "embryo": MustParseCid("bafk2bzacebj2mj5zlcs3yjlgpbznzistfjkdlwaoncjziliqrxqavvz4dcvnk"),
+ "evm": MustParseCid("bafk2bzacebi46zgjili4luu3nqy6mno5k4skvo4cvs7genhkdfaukhtw7xirw"),
+ "init": MustParseCid("bafk2bzacedvf2bij6jovem2dfzkz347yvmydxj7vlgaiagosz5t3c5jyy43zu"),
+ "multisig": MustParseCid("bafk2bzacecukolwx6y5pcajnxg2aawiubgxo5zyj24a23zg5t4qu3k4qbofh4"),
+ "paymentchannel": MustParseCid("bafk2bzacecwyih7nodrwsw5vyl5zk7fapklje76jpowqjr6x6br2bm55smqqy"),
+ "reward": MustParseCid("bafk2bzacea6vfrcprxg2i4l5qnigf4c6pyvnjxpzfqr4pmph3elif7sfidrei"),
+ "storagemarket": MustParseCid("bafk2bzaceahradb3od4ahs46x6yriwvm36iabgtohhoiolubsumto5eravzbu"),
+ "storageminer": MustParseCid("bafk2bzacedekivqgvqapbepvzn6jte3xyymyg5yjuwy42xvboa6rcqnzgo74u"),
+ "storagepower": MustParseCid("bafk2bzacedkmiosllqqqarmr53twspyswdvsm7givwczgo3qqsxzpad4hzjma"),
+ "system": MustParseCid("bafk2bzaceagdymtxb4lxqqjgmnphbgdtdgveuuqaouswpzagj4bpbon3ptop4"),
+ "verifiedregistry": MustParseCid("bafk2bzacec556wsqldm22k2abshvvnsrawlm3bbqkwzht6ubcj76m2jsy3azi"),
+ },
}, {
Network: "mainnet",
Version: 8,
@@ -91,6 +247,45 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
"system": MustParseCid("bafk2bzacedwq5uppsw7vp55zpj7jdieizirmldceehu6wvombw3ixq2tcq57w"),
"verifiedregistry": MustParseCid("bafk2bzaceb3zbkjz3auizmoln2unmxep7dyfcmsre64vnqfhdyh7rkqfoxlw4"),
},
+}, {
+ Network: "mainnet",
+ Version: 9,
+ ManifestCid: MustParseCid("bafy2bzaceb6j6666h36xnhksu3ww4kxb6e25niayfgkdnifaqi6m6ooc66i6i"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzacect2p7urje3pylrrrjy3tngn6yaih4gtzauuatf2jllk3ksgfiw2y"),
+ "cron": MustParseCid("bafk2bzacebcec3lffmos3nawm5cvwehssxeqwxixoyyfvejy7viszzsxzyu26"),
+ "datacap": MustParseCid("bafk2bzacebb6uy2ys7tapekmtj7apnjg7oyj4ia5t7tlkvbmwtxwv74lb2pug"),
+ "init": MustParseCid("bafk2bzacebtdq4zyuxk2fzbdkva6kc4mx75mkbfmldplfntayhbl5wkqou33i"),
+ "multisig": MustParseCid("bafk2bzacec4va3nmugyqjqrs3lqyr2ij67jhjia5frvx7omnh2isha6abxzya"),
+ "paymentchannel": MustParseCid("bafk2bzacebhdvjbjcgupklddfavzef4e4gnkt3xk3rbmgfmk7xhecszhfxeds"),
+ "reward": MustParseCid("bafk2bzacebezgbbmcm2gbcqwisus5fjvpj7hhmu5ubd37phuku3hmkfulxm2o"),
+ "storagemarket": MustParseCid("bafk2bzacec3j7p6gklk64stax5px3xxd7hdtejaepnd4nw7s2adihde6emkcu"),
+ "storageminer": MustParseCid("bafk2bzacedyux5hlrildwutvvjdcsvjtwsoc5xnqdjl73ouiukgklekeuyfl4"),
+ "storagepower": MustParseCid("bafk2bzacedsetphfajgne4qy3vdrpyd6ekcmtfs2zkjut4r34cvnuoqemdrtw"),
+ "system": MustParseCid("bafk2bzaceagvlo2jtahj7dloshrmwfulrd6e2izqev32qm46eumf754weec6c"),
+ "verifiedregistry": MustParseCid("bafk2bzacecf3yodlyudzukumehbuabgqljyhjt5ifiv4vetcfohnvsxzynwga"),
+ },
+}, {
+ Network: "mainnet",
+ Version: 10,
+ ManifestCid: MustParseCid("bafy2bzaceduyggnyqhlr346hfw32tbobzrvhzhill33zhe7jw64pmwjci2xoc"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzacedmr3wxl7qmhquageorrt3aavbzqfpm7eymxidakwuhaobu7dseqs"),
+ "cron": MustParseCid("bafk2bzaceblekxapm5nnqnxmw3mk27236iyutvbhhpsc3fyde7zi7guccn7cc"),
+ "datacap": MustParseCid("bafk2bzacedu4jevyvqsilq7bq4uhegbkm75muwebc5ifqpfaojwhexf2j4i6a"),
+ "eam": MustParseCid("bafk2bzacedc7224twbolvdq6iwc7ybdpah2ywe3ueo33jv67ecimndinle374"),
+ "embryo": MustParseCid("bafk2bzacebj2mj5zlcs3yjlgpbznzistfjkdlwaoncjziliqrxqavvz4dcvnk"),
+ "evm": MustParseCid("bafk2bzaceaggldo6wmkvp5innv4pnjv4xnpedspzofvma3dhu7vk45hh5djoq"),
+ "init": MustParseCid("bafk2bzacedutlaebaczkdi4vqvt3xim24u3whleqk2r4lufjd5jnmxcosea6q"),
+ "multisig": MustParseCid("bafk2bzaceatiqxjwtugpzus3s52zoggnrftxqn7kiw3obvjgkjvtd6zr3636q"),
+ "paymentchannel": MustParseCid("bafk2bzacebyviac6i43gtsvmjfg6mzcp6rwgz44axidc7m432btbmvt7i2m2g"),
+ "reward": MustParseCid("bafk2bzacecbcnlvk2izojpfoaksitqenhzaofn6ynxx5pegl4y45wjlouexdi"),
+ "storagemarket": MustParseCid("bafk2bzacebobteeoz2jycplgtydfyltzughegz2sopn6pzy2udjfvuo77joyk"),
+ "storageminer": MustParseCid("bafk2bzacecwcypas3y6u4rya7qolfwmou437xgrjxh7mnnim7bo3nhk4dscxw"),
+ "storagepower": MustParseCid("bafk2bzacec62kids6rcrdmdeqhwiz3s5rs35s5gn25ilwemgmm6jqnr2rnaaq"),
+ "system": MustParseCid("bafk2bzacecj3c4bjbs2xfttn7zqle7yocqh47u2s7hwuxrsn7fi5h74tcyxoc"),
+ "verifiedregistry": MustParseCid("bafk2bzacedgf7zbnlste5ukzueduemkimiit64scz7lvebztufx5jxtx6gkz2"),
+ },
}, {
Network: "testing",
Version: 8,
@@ -108,6 +303,45 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
"system": MustParseCid("bafk2bzaced6kjkbv7lrb2qwq5we2hqaxc6ztch5p52g27qtjy45zdemsk4b7m"),
"verifiedregistry": MustParseCid("bafk2bzacectzxvtoselhnzsair5nv6k5vokvegnht6z2lfee4p3xexo4kg4m6"),
},
+}, {
+ Network: "testing",
+ Version: 9,
+ ManifestCid: MustParseCid("bafy2bzacecnnrmekqw2xvud46g3vo6x26cogh3ydgljqajlxqxzzbuxsjlwjm"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaceaiebfiuu76zoywzltelio2zuvsavirka27ur6kspn7scvcl5cuiy"),
+ "cron": MustParseCid("bafk2bzacecla36w3tbwap5jgdtooxsud25mdpc75kgtjs34mi4xhwygph2gki"),
+ "datacap": MustParseCid("bafk2bzaced5h3ct6i7oqpyimkj3hwdywmux5tslu5vs2ywbzruqmxjtqczygs"),
+ "init": MustParseCid("bafk2bzaceauxqpspnvui7dryuvfgzoogatbkbahp4ovaih734blwi4bassnlm"),
+ "multisig": MustParseCid("bafk2bzaceddfagxfpsihjxq7yt4ditv2tcoou5w4hzbsapadlw3v44cxfcqpi"),
+ "paymentchannel": MustParseCid("bafk2bzaced4nc4ofrbqevpwrt7fnf3beshi5ccrecq3zojt2sxgrkz7ebnbh4"),
+ "reward": MustParseCid("bafk2bzacedxleepeg4ei3jnayzcfz6shi25rrvoyhr6fxmkdezq4owrazi7rq"),
+ "storagemarket": MustParseCid("bafk2bzaceakqcjpppg3exrr7dru7jglvno2xyw4hsuebxay4lvrzvmwmv5kvu"),
+ "storageminer": MustParseCid("bafk2bzacealfvphicwnysmmyyerseppyvydy2reisvbft46vdprp2lnfvlgqc"),
+ "storagepower": MustParseCid("bafk2bzaceageil5b5mr5uwo6vqs4nnnmpiwe3fkjffzyngcicuu7gruuwapjm"),
+ "system": MustParseCid("bafk2bzacedo4pu3iwx2gu72hinsstpiokhl5iicnb3rumzffsnhy7zhmnxhyy"),
+ "verifiedregistry": MustParseCid("bafk2bzaceatmqip2o3ausbntvdhj7yemu6hb3b5yqv6hm42gylbbmz7geocpm"),
+ },
+}, {
+ Network: "testing",
+ Version: 10,
+ ManifestCid: MustParseCid("bafy2bzacearlgbespxi2zdrybtp2rrbwscmtbyou5qa2egbdvcz6v2yjjqvjo"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaceba6me5ipkcijuhyypnzjydhv3ebi2ctailar7mtzlk4vk3rbxfee"),
+ "cron": MustParseCid("bafk2bzacea6k2mai2xnakygqvbigivfrvv5q7d34qrzjv2crkqtwbjxnxmkbe"),
+ "datacap": MustParseCid("bafk2bzaceah4oxcgck6bcfkzctm2klpvmltyidq7uxnlkcap6ypi3lnkcvrqk"),
+ "eam": MustParseCid("bafk2bzacedjtkvocrnkrot2oztsfrxtpwl32wwbmbkrjfbbm4xipwzrhhxn5c"),
+ "embryo": MustParseCid("bafk2bzacebj2mj5zlcs3yjlgpbznzistfjkdlwaoncjziliqrxqavvz4dcvnk"),
+ "evm": MustParseCid("bafk2bzaced6vhabkr2ojpjzsybrq5yvksjzpjk6yei6fwobkwwydlj5f473pw"),
+ "init": MustParseCid("bafk2bzaceaib3o5e7wop7kwjirgpferqarmngrgjkur2yhdnwplctidpxsgme"),
+ "multisig": MustParseCid("bafk2bzaced4z3awacxumq6yr33a3adu2legb7colahgvqpmigs3fvvjxs3byc"),
+ "paymentchannel": MustParseCid("bafk2bzaceb6mfi24mpzt7qlkratj2tdtqo7aia67zcztuslrxcjaycz6fnai6"),
+ "reward": MustParseCid("bafk2bzacebngh5kwtem4ncarpjtxhs4rwyoficttkgxlsjtiz5ucdi4p3czoc"),
+ "storagemarket": MustParseCid("bafk2bzacecnsibyil62jfq2gbkoe6c2epehfcrxzjmqjnwz7kxab2hkbu3lks"),
+ "storageminer": MustParseCid("bafk2bzacedzw4vkrt3sdkhagpvn62pknyyjkcrzewncvtvae5qgwe6ulzx4a4"),
+ "storagepower": MustParseCid("bafk2bzacedxgadibot6nzvripqt3z5shvjsoscupinejnsvswq4cbeskblwyy"),
+ "system": MustParseCid("bafk2bzacedm24avrmp5o5odhpad43qeglooflygwh4ah7qnzbij2h4c3v6cge"),
+ "verifiedregistry": MustParseCid("bafk2bzaceapq3j6ww3ofytwq3pz3obumaqsyg3wrm6tksdh7op23a72co3rya"),
+ },
}, {
Network: "testing-fake-proofs",
Version: 8,
@@ -125,4 +359,43 @@ var EmbeddedBuiltinActorsMetadata []*BuiltinActorsMetadata = []*BuiltinActorsMet
"system": MustParseCid("bafk2bzaced6kjkbv7lrb2qwq5we2hqaxc6ztch5p52g27qtjy45zdemsk4b7m"),
"verifiedregistry": MustParseCid("bafk2bzacectzxvtoselhnzsair5nv6k5vokvegnht6z2lfee4p3xexo4kg4m6"),
},
+}, {
+ Network: "testing-fake-proofs",
+ Version: 9,
+ ManifestCid: MustParseCid("bafy2bzacecql2gj2tri4fnbznmldue73qzt6zszvugw4exd64mwb52zrhv7k2"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaceaiebfiuu76zoywzltelio2zuvsavirka27ur6kspn7scvcl5cuiy"),
+ "cron": MustParseCid("bafk2bzacecla36w3tbwap5jgdtooxsud25mdpc75kgtjs34mi4xhwygph2gki"),
+ "datacap": MustParseCid("bafk2bzaced5h3ct6i7oqpyimkj3hwdywmux5tslu5vs2ywbzruqmxjtqczygs"),
+ "init": MustParseCid("bafk2bzaceauxqpspnvui7dryuvfgzoogatbkbahp4ovaih734blwi4bassnlm"),
+ "multisig": MustParseCid("bafk2bzaceddfagxfpsihjxq7yt4ditv2tcoou5w4hzbsapadlw3v44cxfcqpi"),
+ "paymentchannel": MustParseCid("bafk2bzaced4nc4ofrbqevpwrt7fnf3beshi5ccrecq3zojt2sxgrkz7ebnbh4"),
+ "reward": MustParseCid("bafk2bzacedxleepeg4ei3jnayzcfz6shi25rrvoyhr6fxmkdezq4owrazi7rq"),
+ "storagemarket": MustParseCid("bafk2bzaceakqcjpppg3exrr7dru7jglvno2xyw4hsuebxay4lvrzvmwmv5kvu"),
+ "storageminer": MustParseCid("bafk2bzaceab3cjrwwwfemyc5lw73w6tibpgxtx3wuzjhami6tvhcvetygdm7m"),
+ "storagepower": MustParseCid("bafk2bzaceafemwhsy3e7ueqsrn3f7n53vdqkvfbig3hgbw7eohsefnfvgq7yc"),
+ "system": MustParseCid("bafk2bzacedo4pu3iwx2gu72hinsstpiokhl5iicnb3rumzffsnhy7zhmnxhyy"),
+ "verifiedregistry": MustParseCid("bafk2bzaceatmqip2o3ausbntvdhj7yemu6hb3b5yqv6hm42gylbbmz7geocpm"),
+ },
+}, {
+ Network: "testing-fake-proofs",
+ Version: 10,
+ ManifestCid: MustParseCid("bafy2bzacea4irr2oxhclwt4mvtrevbzb7mbqddcebjz7bkqjq6eoflpfhencc"),
+ Actors: map[string]cid.Cid{
+ "account": MustParseCid("bafk2bzaceba6me5ipkcijuhyypnzjydhv3ebi2ctailar7mtzlk4vk3rbxfee"),
+ "cron": MustParseCid("bafk2bzacea6k2mai2xnakygqvbigivfrvv5q7d34qrzjv2crkqtwbjxnxmkbe"),
+ "datacap": MustParseCid("bafk2bzaceah4oxcgck6bcfkzctm2klpvmltyidq7uxnlkcap6ypi3lnkcvrqk"),
+ "eam": MustParseCid("bafk2bzacedjtkvocrnkrot2oztsfrxtpwl32wwbmbkrjfbbm4xipwzrhhxn5c"),
+ "embryo": MustParseCid("bafk2bzacebj2mj5zlcs3yjlgpbznzistfjkdlwaoncjziliqrxqavvz4dcvnk"),
+ "evm": MustParseCid("bafk2bzaced6vhabkr2ojpjzsybrq5yvksjzpjk6yei6fwobkwwydlj5f473pw"),
+ "init": MustParseCid("bafk2bzaceaib3o5e7wop7kwjirgpferqarmngrgjkur2yhdnwplctidpxsgme"),
+ "multisig": MustParseCid("bafk2bzaced4z3awacxumq6yr33a3adu2legb7colahgvqpmigs3fvvjxs3byc"),
+ "paymentchannel": MustParseCid("bafk2bzaceb6mfi24mpzt7qlkratj2tdtqo7aia67zcztuslrxcjaycz6fnai6"),
+ "reward": MustParseCid("bafk2bzacebngh5kwtem4ncarpjtxhs4rwyoficttkgxlsjtiz5ucdi4p3czoc"),
+ "storagemarket": MustParseCid("bafk2bzacecnsibyil62jfq2gbkoe6c2epehfcrxzjmqjnwz7kxab2hkbu3lks"),
+ "storageminer": MustParseCid("bafk2bzaceb4grddnw54gczgcdak5a2gqvwed66mhibbug6qu4jy35bf45jltg"),
+ "storagepower": MustParseCid("bafk2bzacedp2dnbk4bg3hhaeztre4q3jv7eqs267rlafszpggb2njjn3x5eru"),
+ "system": MustParseCid("bafk2bzacedm24avrmp5o5odhpad43qeglooflygwh4ah7qnzbij2h4c3v6cge"),
+ "verifiedregistry": MustParseCid("bafk2bzaceapq3j6ww3ofytwq3pz3obumaqsyg3wrm6tksdh7op23a72co3rya"),
+ },
}}
diff --git a/build/builtin_actors_test.go b/build/builtin_actors_test.go
index 7a5c0936d..384193fee 100644
--- a/build/builtin_actors_test.go
+++ b/build/builtin_actors_test.go
@@ -5,6 +5,8 @@ import (
"github.com/stretchr/testify/require"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors"
)
@@ -19,16 +21,18 @@ func TestEmbeddedMetadata(t *testing.T) {
// Test that we're registering the manifest correctly.
func TestRegistration(t *testing.T) {
- manifestCid, found := actors.GetManifest(actors.Version8)
- require.True(t, found)
- require.True(t, manifestCid.Defined())
+ for _, av := range []actorstypes.Version{actorstypes.Version8, actorstypes.Version9} {
+ manifestCid, found := actors.GetManifest(av)
+ require.True(t, found)
+ require.True(t, manifestCid.Defined())
- for _, key := range actors.GetBuiltinActorsKeys() {
- actorCid, found := actors.GetActorCodeID(actors.Version8, key)
- require.True(t, found)
- name, version, found := actors.GetActorMetaByCode(actorCid)
- require.True(t, found)
- require.Equal(t, actors.Version8, version)
- require.Equal(t, key, name)
+ for _, key := range actors.GetBuiltinActorsKeys(av) {
+ actorCid, found := actors.GetActorCodeID(av, key)
+ require.True(t, found)
+ name, version, found := actors.GetActorMetaByCode(actorCid)
+ require.True(t, found)
+ require.Equal(t, av, version)
+ require.Equal(t, key, name)
+ }
}
}
diff --git a/build/drand.go b/build/drand.go
index 3b976ac92..3027d930b 100644
--- a/build/drand.go
+++ b/build/drand.go
@@ -69,6 +69,10 @@ var DrandConfigs = map[DrandEnum]dtypes.DrandConfig{
ChainInfoJSON: `{"public_key":"8cda589f88914aa728fd183f383980b35789ce81b274e5daee1f338b77d02566ef4d3fb0098af1f844f10f9c803c1827","period":25,"genesis_time":1595348225,"hash":"e73b7dc3c4f6a236378220c0dd6aa110eb16eed26c11259606e07ee122838d4f","groupHash":"567d4785122a5a3e75a9bc9911d7ea807dd85ff76b78dc4ff06b075712898607"}`,
},
DrandIncentinet: {
+ Servers: []string{
+ "https://dev1.drand.sh",
+ "https://dev2.drand.sh",
+ },
ChainInfoJSON: `{"public_key":"8cad0c72c606ab27d36ee06de1d5b2db1faf92e447025ca37575ab3a8aac2eaae83192f846fc9e158bc738423753d000","period":30,"genesis_time":1595873820,"hash":"80c8b872c714f4c00fdd3daa465d5514049f457f01f85a4caf68cdcd394ba039","groupHash":"d9406aaed487f7af71851b4399448e311f2328923d454e971536c05398ce2d9b"}`,
},
}
diff --git a/build/genesis/butterflynet.car b/build/genesis/butterflynet.car
index 2a23ff147..71a1c684e 100644
Binary files a/build/genesis/butterflynet.car and b/build/genesis/butterflynet.car differ
diff --git a/build/genesis/calibnet.car b/build/genesis/calibnet.car
index cbade953f..775cdf790 100644
Binary files a/build/genesis/calibnet.car and b/build/genesis/calibnet.car differ
diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz
index 0bf4574e2..b03f845f9 100644
Binary files a/build/openrpc/full.json.gz and b/build/openrpc/full.json.gz differ
diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz
index 7ca6673b5..e1b3bd2db 100644
Binary files a/build/openrpc/gateway.json.gz and b/build/openrpc/gateway.json.gz differ
diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz
index a97aea48a..d69d9d519 100644
Binary files a/build/openrpc/miner.json.gz and b/build/openrpc/miner.json.gz differ
diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz
index 5d62a0c56..271a18a0f 100644
Binary files a/build/openrpc/worker.json.gz and b/build/openrpc/worker.json.gz differ
diff --git a/build/params_2k.go b/build/params_2k.go
index 476d4fba1..f822d701e 100644
--- a/build/params_2k.go
+++ b/build/params_2k.go
@@ -10,9 +10,9 @@ import (
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/network"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/policy"
)
@@ -20,9 +20,9 @@ const BootstrappersFile = ""
const GenesisFile = ""
var NetworkBundle = "devnet"
-var BundleOverrides map[actors.Version]string
+var BundleOverrides map[actorstypes.Version]string
-const GenesisNetworkVersion = network.Version16
+const GenesisNetworkVersion = network.Version18
var UpgradeBreezeHeight = abi.ChainEpoch(-1)
@@ -56,6 +56,8 @@ var UpgradeOhSnapHeight = abi.ChainEpoch(-18)
var UpgradeSkyrHeight = abi.ChainEpoch(-19)
+var UpgradeSharkHeight = abi.ChainEpoch(-20)
+
var DrandSchedule = map[abi.ChainEpoch]DrandEnum{
0: DrandMainnet,
}
@@ -107,6 +109,7 @@ func init() {
UpgradeChocolateHeight = getUpgradeHeight("LOTUS_CHOCOLATE_HEIGHT", UpgradeChocolateHeight)
UpgradeOhSnapHeight = getUpgradeHeight("LOTUS_OHSNAP_HEIGHT", UpgradeOhSnapHeight)
UpgradeSkyrHeight = getUpgradeHeight("LOTUS_SKYR_HEIGHT", UpgradeSkyrHeight)
+ UpgradeSharkHeight = getUpgradeHeight("LOTUS_SHARK_HEIGHT", UpgradeSharkHeight)
BuildType |= Build2k
diff --git a/build/params_butterfly.go b/build/params_butterfly.go
index f43c30778..6f0a64598 100644
--- a/build/params_butterfly.go
+++ b/build/params_butterfly.go
@@ -8,10 +8,10 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/network"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/policy"
)
@@ -19,10 +19,10 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{
0: DrandMainnet,
}
-const GenesisNetworkVersion = network.Version15
+const GenesisNetworkVersion = network.Version16
var NetworkBundle = "butterflynet"
-var BundleOverrides map[actors.Version]string
+var BundleOverrides map[actorstypes.Version]string
const BootstrappersFile = "butterflynet.pi"
const GenesisFile = "butterflynet.car"
@@ -47,10 +47,9 @@ const UpgradeNorwegianHeight = -14
const UpgradeTurboHeight = -15
const UpgradeHyperdriveHeight = -16
const UpgradeChocolateHeight = -17
-
const UpgradeOhSnapHeight = -18
-
-const UpgradeSkyrHeight = abi.ChainEpoch(50)
+const UpgradeSkyrHeight = -19
+const UpgradeSharkHeight = abi.ChainEpoch(600)
var SupportedProofTypes = []abi.RegisteredSealProof{
abi.RegisteredSealProof_StackedDrg512MiBV1,
diff --git a/build/params_calibnet.go b/build/params_calibnet.go
index 9ecfc048d..f1aacc506 100644
--- a/build/params_calibnet.go
+++ b/build/params_calibnet.go
@@ -4,14 +4,17 @@
package build
import (
+ "os"
+ "strconv"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/network"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/policy"
)
@@ -22,7 +25,7 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{
const GenesisNetworkVersion = network.Version0
var NetworkBundle = "calibrationnet"
-var BundleOverrides map[actors.Version]string
+var BundleOverrides map[actorstypes.Version]string
const BootstrappersFile = "calibnet.pi"
const GenesisFile = "calibnet.car"
@@ -58,13 +61,13 @@ const UpgradeTurboHeight = 390
const UpgradeHyperdriveHeight = 420
-const UpgradeChocolateHeight = 312746
+const UpgradeChocolateHeight = 450
-// 2022-02-10T19:23:00Z
-const UpgradeOhSnapHeight = 682006
+const UpgradeOhSnapHeight = 480
-// 2022-06-16T17:30:00Z
-const UpgradeSkyrHeight = 1044660
+const UpgradeSkyrHeight = 510
+
+const UpgradeSharkHeight = 16800 // 6 days after genesis
var SupportedProofTypes = []abi.RegisteredSealProof{
abi.RegisteredSealProof_StackedDrg32GiBV1,
@@ -84,13 +87,28 @@ func init() {
Devnet = true
+ // NOTE: DO NOT change this unless you REALLY know what you're doing. This is not consensus critical, however,
+ //set this value too high may impacts your block submission; set this value too low may cause you miss
+ //parent tipsets for blocking forming and mining.
+ if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 {
+ pds, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64)
+ if err != nil {
+ log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err,
+ PropagationDelaySecs)
+ } else {
+ PropagationDelaySecs = pds
+ log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+
+ "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs)
+ }
+ }
+
BuildType = BuildCalibnet
}
const BlockDelaySecs = uint64(builtin2.EpochDurationSeconds)
-const PropagationDelaySecs = uint64(6)
+var PropagationDelaySecs = uint64(10)
// BootstrapPeerThreshold is the minimum number peers we need to track for a sync worker to start
const BootstrapPeerThreshold = 4
diff --git a/build/params_interop.go b/build/params_interop.go
index f3af7aed4..dbc619e1b 100644
--- a/build/params_interop.go
+++ b/build/params_interop.go
@@ -11,20 +11,20 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/network"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/policy"
)
var NetworkBundle = "caterpillarnet"
-var BundleOverrides map[actors.Version]string
+var BundleOverrides map[actorstypes.Version]string
const BootstrappersFile = "interopnet.pi"
const GenesisFile = "interopnet.car"
-const GenesisNetworkVersion = network.Version15
+const GenesisNetworkVersion = network.Version16
var UpgradeBreezeHeight = abi.ChainEpoch(-1)
@@ -34,26 +34,22 @@ var UpgradeSmokeHeight = abi.ChainEpoch(-1)
var UpgradeIgnitionHeight = abi.ChainEpoch(-2)
var UpgradeRefuelHeight = abi.ChainEpoch(-3)
var UpgradeTapeHeight = abi.ChainEpoch(-4)
-
var UpgradeAssemblyHeight = abi.ChainEpoch(-5)
var UpgradeLiftoffHeight = abi.ChainEpoch(-6)
-
var UpgradeKumquatHeight = abi.ChainEpoch(-7)
var UpgradeCalicoHeight = abi.ChainEpoch(-9)
var UpgradePersianHeight = abi.ChainEpoch(-10)
var UpgradeOrangeHeight = abi.ChainEpoch(-11)
var UpgradeClausHeight = abi.ChainEpoch(-12)
-
var UpgradeTrustHeight = abi.ChainEpoch(-13)
-
var UpgradeNorwegianHeight = abi.ChainEpoch(-14)
-
var UpgradeTurboHeight = abi.ChainEpoch(-15)
-
var UpgradeHyperdriveHeight = abi.ChainEpoch(-16)
var UpgradeChocolateHeight = abi.ChainEpoch(-17)
var UpgradeOhSnapHeight = abi.ChainEpoch(-18)
-var UpgradeSkyrHeight = abi.ChainEpoch(100)
+var UpgradeSkyrHeight = abi.ChainEpoch(-19)
+
+const UpgradeSharkHeight = abi.ChainEpoch(99999999999999)
var DrandSchedule = map[abi.ChainEpoch]DrandEnum{
0: DrandMainnet,
@@ -107,6 +103,7 @@ func init() {
UpgradeChocolateHeight = getUpgradeHeight("LOTUS_CHOCOLATE_HEIGHT", UpgradeChocolateHeight)
UpgradeOhSnapHeight = getUpgradeHeight("LOTUS_OHSNAP_HEIGHT", UpgradeOhSnapHeight)
UpgradeSkyrHeight = getUpgradeHeight("LOTUS_SKYR_HEIGHT", UpgradeSkyrHeight)
+ UpgradeSharkHeight = getUpgradeHeight("LOTUS_SHARK_HEIGHT", UpgradeSharkHeight)
BuildType |= BuildInteropnet
SetAddressNetwork(address.Testnet)
diff --git a/build/params_mainnet.go b/build/params_mainnet.go
index 7a532c174..296793131 100644
--- a/build/params_mainnet.go
+++ b/build/params_mainnet.go
@@ -6,13 +6,13 @@ package build
import (
"math"
"os"
+ "strconv"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/network"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
-
- "github.com/filecoin-project/lotus/chain/actors"
)
var DrandSchedule = map[abi.ChainEpoch]DrandEnum{
@@ -23,7 +23,7 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{
var NetworkBundle = "mainnet"
// NOTE: DO NOT change this unless you REALLY know what you're doing. This is consensus critical.
-var BundleOverrides map[actors.Version]string
+var BundleOverrides map[actorstypes.Version]string
const GenesisNetworkVersion = network.Version0
@@ -77,23 +77,41 @@ const UpgradeChocolateHeight = 1231620
const UpgradeOhSnapHeight = 1594680
// 2022-07-06T14:00:00Z
-var UpgradeSkyrHeight = abi.ChainEpoch(1960320)
+const UpgradeSkyrHeight = 1960320
+
+// 2022-11-30T14:00:00Z
+var UpgradeSharkHeight = abi.ChainEpoch(2383680)
var SupportedProofTypes = []abi.RegisteredSealProof{
abi.RegisteredSealProof_StackedDrg32GiBV1,
abi.RegisteredSealProof_StackedDrg64GiBV1,
}
var ConsensusMinerMinPower = abi.NewStoragePower(10 << 40)
-var MinVerifiedDealSize = abi.NewStoragePower(1 << 20)
var PreCommitChallengeDelay = abi.ChainEpoch(150)
+var PropagationDelaySecs = uint64(10)
func init() {
if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" {
SetAddressNetwork(address.Mainnet)
}
- if os.Getenv("LOTUS_DISABLE_SKYR") == "1" {
- UpgradeSkyrHeight = math.MaxInt64
+ if os.Getenv("LOTUS_DISABLE_SHARK") == "1" {
+ UpgradeSharkHeight = math.MaxInt64
+ }
+
+ // NOTE: DO NOT change this unless you REALLY know what you're doing. This is not consensus critical, however,
+ //set this value too high may impacts your block submission; set this value too low may cause you miss
+ //parent tipsets for blocking forming and mining.
+ if len(os.Getenv("PROPAGATION_DELAY_SECS")) != 0 {
+ pds, err := strconv.ParseUint(os.Getenv("PROPAGATION_DELAY_SECS"), 10, 64)
+ if err != nil {
+ log.Warnw("Error setting PROPAGATION_DELAY_SECS, %v, proceed with default value %s", err,
+ PropagationDelaySecs)
+ } else {
+ PropagationDelaySecs = pds
+ log.Warnw(" !!WARNING!! propagation delay is set to be %s second, "+
+ "this value impacts your message republish interval and block forming - monitor with caution!!", PropagationDelaySecs)
+ }
}
Devnet = false
@@ -103,8 +121,6 @@ func init() {
const BlockDelaySecs = uint64(builtin2.EpochDurationSeconds)
-const PropagationDelaySecs = uint64(6)
-
// BootstrapPeerThreshold is the minimum number peers we need to track for a sync worker to start
const BootstrapPeerThreshold = 4
diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go
index 6f59189a6..be6640d6f 100644
--- a/build/params_shared_vals.go
+++ b/build/params_shared_vals.go
@@ -26,14 +26,14 @@ const UnixfsLinksPerLevel = 1024
const AllowableClockDriftSecs = uint64(1)
-// TODO: This is still terrible...What's the impact of updating this before mainnet actually upgrades
+// Used by tests and some obscure tooling
/* inline-gen template
-const NewestNetworkVersion = network.Version{{.latestNetworkVersion}}
+const TestNetworkVersion = network.Version{{.latestNetworkVersion}}
/* inline-gen start */
-const NewestNetworkVersion = network.Version16
+const TestNetworkVersion = network.Version18
/* inline-gen end */
@@ -118,8 +118,9 @@ const VerifSigCacheSize = 32000
// TODO: If this is gonna stay, it should move to specs-actors
const BlockMessageLimit = 10000
-const BlockGasLimit = 10_000_000_000
-const BlockGasTarget = BlockGasLimit / 2
+var BlockGasLimit = int64(10_000_000_000)
+var BlockGasTarget = BlockGasLimit / 2
+
const BaseFeeMaxChangeDenom = 8 // 12.5%
const InitialBaseFee = 100e6
const MinimumBaseFee = 100
diff --git a/build/params_testground.go b/build/params_testground.go
index 9d708781d..dcdee888d 100644
--- a/build/params_testground.go
+++ b/build/params_testground.go
@@ -13,10 +13,10 @@ import (
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/network"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/policy"
)
@@ -107,6 +107,7 @@ var (
UpgradeChocolateHeight abi.ChainEpoch = -16
UpgradeOhSnapHeight abi.ChainEpoch = -17
UpgradeSkyrHeight abi.ChainEpoch = -18
+ UpgradeSharkHeight abi.ChainEpoch = -19
DrandSchedule = map[abi.ChainEpoch]DrandEnum{
0: DrandMainnet,
@@ -114,10 +115,10 @@ var (
GenesisNetworkVersion = network.Version0
NetworkBundle = "devnet"
- BundleOverrides map[actors.Version]string
+ BundleOverrides map[actorstypes.Version]string
- NewestNetworkVersion = network.Version15
- ActorUpgradeNetworkVersion = network.Version15
+ NewestNetworkVersion = network.Version16
+ ActorUpgradeNetworkVersion = network.Version16
Devnet = true
ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a")
diff --git a/build/version.go b/build/version.go
index cc289bfe6..70e27ad50 100644
--- a/build/version.go
+++ b/build/version.go
@@ -37,7 +37,7 @@ func BuildTypeString() string {
}
// BuildVersion is the local build version
-const BuildVersion = "1.17.2-dev"
+const BuildVersion = "1.19.1-dev"
func UserVersion() string {
if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" {
diff --git a/chain/actors/actor_cids.go b/chain/actors/actor_cids.go
index 9612983dc..042426801 100644
--- a/chain/actors/actor_cids.go
+++ b/chain/actors/actor_cids.go
@@ -4,6 +4,7 @@ import (
"github.com/ipfs/go-cid"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
@@ -14,10 +15,10 @@ import (
)
// GetActorCodeID looks up a builtin actor's code CID by actor version and canonical actor name.
-func GetActorCodeID(av Version, name string) (cid.Cid, bool) {
+func GetActorCodeID(av actorstypes.Version, name string) (cid.Cid, bool) {
// Actors V8 and above
- if av >= Version8 {
+ if av >= actorstypes.Version8 {
if cids, ok := GetActorCodeIDsFromManifest(av); ok {
c, ok := cids[name]
return c, ok
@@ -30,275 +31,275 @@ func GetActorCodeID(av Version, name string) (cid.Cid, bool) {
case AccountKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.AccountActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.AccountActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.AccountActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.AccountActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.AccountActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.AccountActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.AccountActorCodeID, true
}
case CronKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.CronActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.CronActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.CronActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.CronActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.CronActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.CronActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.CronActorCodeID, true
}
case InitKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.InitActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.InitActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.InitActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.InitActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.InitActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.InitActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.InitActorCodeID, true
}
case MarketKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.StorageMarketActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.StorageMarketActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.StorageMarketActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.StorageMarketActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.StorageMarketActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.StorageMarketActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.StorageMarketActorCodeID, true
}
case MinerKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.StorageMinerActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.StorageMinerActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.StorageMinerActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.StorageMinerActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.StorageMinerActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.StorageMinerActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.StorageMinerActorCodeID, true
}
case MultisigKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.MultisigActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.MultisigActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.MultisigActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.MultisigActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.MultisigActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.MultisigActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.MultisigActorCodeID, true
}
case PaychKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.PaymentChannelActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.PaymentChannelActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.PaymentChannelActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.PaymentChannelActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.PaymentChannelActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.PaymentChannelActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.PaymentChannelActorCodeID, true
}
case PowerKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.StoragePowerActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.StoragePowerActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.StoragePowerActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.StoragePowerActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.StoragePowerActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.StoragePowerActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.StoragePowerActorCodeID, true
}
case RewardKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.RewardActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.RewardActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.RewardActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.RewardActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.RewardActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.RewardActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.RewardActorCodeID, true
}
case SystemKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.SystemActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.SystemActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.SystemActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.SystemActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.SystemActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.SystemActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.SystemActorCodeID, true
}
case VerifregKey:
switch av {
- case Version0:
+ case actorstypes.Version0:
return builtin0.VerifiedRegistryActorCodeID, true
- case Version2:
+ case actorstypes.Version2:
return builtin2.VerifiedRegistryActorCodeID, true
- case Version3:
+ case actorstypes.Version3:
return builtin3.VerifiedRegistryActorCodeID, true
- case Version4:
+ case actorstypes.Version4:
return builtin4.VerifiedRegistryActorCodeID, true
- case Version5:
+ case actorstypes.Version5:
return builtin5.VerifiedRegistryActorCodeID, true
- case Version6:
+ case actorstypes.Version6:
return builtin6.VerifiedRegistryActorCodeID, true
- case Version7:
+ case actorstypes.Version7:
return builtin7.VerifiedRegistryActorCodeID, true
}
}
@@ -307,13 +308,13 @@ func GetActorCodeID(av Version, name string) (cid.Cid, bool) {
}
// GetActorCodeIDs looks up all builtin actor's code CIDs by actor version.
-func GetActorCodeIDs(av Version) (map[string]cid.Cid, error) {
+func GetActorCodeIDs(av actorstypes.Version) (map[string]cid.Cid, error) {
cids, ok := GetActorCodeIDsFromManifest(av)
if ok {
return cids, nil
}
- actorsKeys := GetBuiltinActorsKeys()
+ actorsKeys := GetBuiltinActorsKeys(av)
synthCids := make(map[string]cid.Cid)
for _, key := range actorsKeys {
diff --git a/chain/actors/agen/main.go b/chain/actors/agen/main.go
index ba88c54d1..b9f3a22a4 100644
--- a/chain/actors/agen/main.go
+++ b/chain/actors/agen/main.go
@@ -27,6 +27,8 @@ var actors = map[string][]int{
"system": lotusactors.Versions,
"reward": lotusactors.Versions,
"verifreg": lotusactors.Versions,
+ "datacap": lotusactors.Versions[8:],
+ "evm": lotusactors.Versions[9:],
}
func main() {
@@ -44,13 +46,18 @@ func main() {
fmt.Println(err)
return
}
+
+ if err := generateRegistry("chain/actors/builtin/registry.go"); err != nil {
+ fmt.Println(err)
+ return
+ }
}
func generateAdapters() error {
for act, versions := range actors {
actDir := filepath.Join("chain/actors/builtin", act)
- if err := generateState(actDir); err != nil {
+ if err := generateState(actDir, versions); err != nil {
return err
}
@@ -92,7 +99,7 @@ func generateAdapters() error {
return nil
}
-func generateState(actDir string) error {
+func generateState(actDir string, versions []int) error {
af, err := ioutil.ReadFile(filepath.Join(actDir, "state.go.template"))
if err != nil {
if os.IsNotExist(err) {
@@ -102,14 +109,15 @@ func generateState(actDir string) error {
return xerrors.Errorf("loading state adapter template: %w", err)
}
- for _, version := range lotusactors.Versions {
+ for _, version := range versions {
tpl := template.Must(template.New("").Funcs(template.FuncMap{}).Parse(string(af)))
var b bytes.Buffer
err := tpl.Execute(&b, map[string]interface{}{
- "v": version,
- "import": getVersionImports()[version],
+ "v": version,
+ "import": getVersionImports()[version],
+ "latestVersion": lotusactors.LatestVersion,
})
if err != nil {
return err
@@ -139,8 +147,9 @@ func generateMessages(actDir string) error {
var b bytes.Buffer
err := tpl.Execute(&b, map[string]interface{}{
- "v": version,
- "import": getVersionImports()[version],
+ "v": version,
+ "import": getVersionImports()[version],
+ "latestVersion": lotusactors.LatestVersion,
})
if err != nil {
return err
@@ -216,6 +225,36 @@ func generateBuiltin(builtinPath string) error {
return nil
}
+func generateRegistry(registryPath string) error {
+
+ bf, err := ioutil.ReadFile(registryPath + ".template")
+ if err != nil {
+ if os.IsNotExist(err) {
+ return nil // skip
+ }
+
+ return xerrors.Errorf("loading registry template file: %w", err)
+ }
+
+ tpl := template.Must(template.New("").Funcs(template.FuncMap{
+ "import": func(v int) string { return getVersionImports()[v] },
+ }).Parse(string(bf)))
+ var b bytes.Buffer
+
+ err = tpl.Execute(&b, map[string]interface{}{
+ "versions": lotusactors.Versions,
+ })
+ if err != nil {
+ return err
+ }
+
+ if err := ioutil.WriteFile(registryPath, b.Bytes(), 0666); err != nil {
+ return err
+ }
+
+ return nil
+}
+
func getVersionImports() map[int]string {
versionImports := make(map[int]string, lotusactors.LatestVersion)
for _, v := range lotusactors.Versions {
diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go
index f233f173c..5a2d55961 100644
--- a/chain/actors/builtin/account/account.go
+++ b/chain/actors/builtin/account/account.go
@@ -1,10 +1,12 @@
package account
import (
+ "github.com/ipfs/go-cid"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/go-state-types/cbor"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
@@ -19,7 +21,7 @@ import (
"github.com/filecoin-project/lotus/chain/types"
)
-var Methods = builtin8.MethodsAccount
+var Methods = builtin10.MethodsAccount
func Load(store adt.Store, act *types.Actor) (State, error) {
if name, av, ok := actors.GetActorMetaByCode(act.Code); ok {
@@ -29,9 +31,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -63,33 +71,39 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, addr address.Address) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store, addr)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store, addr)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store, addr)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store, addr)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store, addr)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store, addr)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store, addr)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store, addr)
+ case actorstypes.Version9:
+ return make9(store, addr)
+
+ case actorstypes.Version10:
+ return make10(store, addr)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
@@ -97,6 +111,25 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State,
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
PubkeyAddress() (address.Address, error)
GetState() interface{}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/account/actor.go.template b/chain/actors/builtin/account/actor.go.template
index 7aff20d42..ef6e7ac3d 100644
--- a/chain/actors/builtin/account/actor.go.template
+++ b/chain/actors/builtin/account/actor.go.template
@@ -1,6 +1,8 @@
package account
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/lotus/chain/actors"
"golang.org/x/xerrors"
@@ -9,13 +11,13 @@ import (
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
+
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
)
var Methods = builtin{{.latestVersion}}.MethodsAccount
@@ -29,7 +31,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -48,10 +50,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, addr address.Address) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store, addr)
{{end}}
}
@@ -61,6 +63,17 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State,
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
PubkeyAddress() (address.Address, error)
GetState() interface{}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/account/state.go.template b/chain/actors/builtin/account/state.go.template
index 93e7dc0db..9b623519d 100644
--- a/chain/actors/builtin/account/state.go.template
+++ b/chain/actors/builtin/account/state.go.template
@@ -1,10 +1,14 @@
package account
import (
+ "fmt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+
"github.com/filecoin-project/go-address"
"github.com/ipfs/go-cid"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
{{if (le .v 7)}}
account{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/account"
@@ -41,4 +45,21 @@ func (s *state{{.v}}) PubkeyAddress() (address.Address, error) {
func (s *state{{.v}}) GetState() interface{} {
return &s.State
+}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
\ No newline at end of file
diff --git a/chain/actors/builtin/account/v0.go b/chain/actors/builtin/account/v0.go
index 314bd4b29..f6af2c79c 100644
--- a/chain/actors/builtin/account/v0.go
+++ b/chain/actors/builtin/account/v0.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account0 "github.com/filecoin-project/specs-actors/actors/builtin/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state0) PubkeyAddress() (address.Address, error) {
func (s *state0) GetState() interface{} {
return &s.State
}
+
+func (s *state0) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v10.go b/chain/actors/builtin/account/v10.go
new file mode 100644
index 000000000..dbe7c609e
--- /dev/null
+++ b/chain/actors/builtin/account/v10.go
@@ -0,0 +1,61 @@
+package account
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ account10 "github.com/filecoin-project/go-state-types/builtin/v10/account"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, addr address.Address) (State, error) {
+ out := state10{store: store}
+ out.State = account10.State{Address: addr}
+ return &out, nil
+}
+
+type state10 struct {
+ account10.State
+ store adt.Store
+}
+
+func (s *state10) PubkeyAddress() (address.Address, error) {
+ return s.Address, nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v2.go b/chain/actors/builtin/account/v2.go
index 605065424..5e2297b4a 100644
--- a/chain/actors/builtin/account/v2.go
+++ b/chain/actors/builtin/account/v2.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state2) PubkeyAddress() (address.Address, error) {
func (s *state2) GetState() interface{} {
return &s.State
}
+
+func (s *state2) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v3.go b/chain/actors/builtin/account/v3.go
index d070476ea..4e142bcf7 100644
--- a/chain/actors/builtin/account/v3.go
+++ b/chain/actors/builtin/account/v3.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state3) PubkeyAddress() (address.Address, error) {
func (s *state3) GetState() interface{} {
return &s.State
}
+
+func (s *state3) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v4.go b/chain/actors/builtin/account/v4.go
index f4d9f7a06..7b1e7f0dd 100644
--- a/chain/actors/builtin/account/v4.go
+++ b/chain/actors/builtin/account/v4.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state4) PubkeyAddress() (address.Address, error) {
func (s *state4) GetState() interface{} {
return &s.State
}
+
+func (s *state4) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v5.go b/chain/actors/builtin/account/v5.go
index 5e01ce152..ad8bed522 100644
--- a/chain/actors/builtin/account/v5.go
+++ b/chain/actors/builtin/account/v5.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state5) PubkeyAddress() (address.Address, error) {
func (s *state5) GetState() interface{} {
return &s.State
}
+
+func (s *state5) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v6.go b/chain/actors/builtin/account/v6.go
index 85135dcda..74c959c5f 100644
--- a/chain/actors/builtin/account/v6.go
+++ b/chain/actors/builtin/account/v6.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state6) PubkeyAddress() (address.Address, error) {
func (s *state6) GetState() interface{} {
return &s.State
}
+
+func (s *state6) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v7.go b/chain/actors/builtin/account/v7.go
index 4ae979b82..24d259f33 100644
--- a/chain/actors/builtin/account/v7.go
+++ b/chain/actors/builtin/account/v7.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state7) PubkeyAddress() (address.Address, error) {
func (s *state7) GetState() interface{} {
return &s.State
}
+
+func (s *state7) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v8.go b/chain/actors/builtin/account/v8.go
index 211deea33..2a4a74ca4 100644
--- a/chain/actors/builtin/account/v8.go
+++ b/chain/actors/builtin/account/v8.go
@@ -1,11 +1,15 @@
package account
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
account8 "github.com/filecoin-project/go-state-types/builtin/v8/account"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -38,3 +42,20 @@ func (s *state8) PubkeyAddress() (address.Address, error) {
func (s *state8) GetState() interface{} {
return &s.State
}
+
+func (s *state8) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/account/v9.go b/chain/actors/builtin/account/v9.go
new file mode 100644
index 000000000..97bcd43d7
--- /dev/null
+++ b/chain/actors/builtin/account/v9.go
@@ -0,0 +1,61 @@
+package account
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ account9 "github.com/filecoin-project/go-state-types/builtin/v9/account"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store, addr address.Address) (State, error) {
+ out := state9{store: store}
+ out.State = account9.State{Address: addr}
+ return &out, nil
+}
+
+type state9 struct {
+ account9.State
+ store adt.Store
+}
+
+func (s *state9) PubkeyAddress() (address.Address, error) {
+ return s.Address, nil
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) ActorKey() string {
+ return actors.AccountKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go
index fb95a28d6..82e80365a 100644
--- a/chain/actors/builtin/builtin.go
+++ b/chain/actors/builtin/builtin.go
@@ -8,8 +8,8 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
- miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner"
smoothingtypes "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/proof"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
@@ -18,7 +18,6 @@ import (
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
- builtin8 "github.com/filecoin-project/specs-actors/v8/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors"
)
@@ -53,7 +52,7 @@ type PoStProof = proof.PoStProof
type FilterEstimate = smoothingtypes.FilterEstimate
func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower {
- return miner8.QAPowerForWeight(size, duration, dealWeight, verifiedWeight)
+ return minertypes.QAPowerForWeight(size, duration, dealWeight, verifiedWeight)
}
func ActorNameByCode(c cid.Cid) string {
@@ -84,9 +83,6 @@ func ActorNameByCode(c cid.Cid) string {
case builtin7.IsBuiltinActor(c):
return builtin7.ActorNameByCode(c)
- case builtin8.IsBuiltinActor(c):
- return builtin8.ActorNameByCode(c)
-
default:
return ""
}
diff --git a/chain/actors/builtin/builtin.go.template b/chain/actors/builtin/builtin.go.template
index d536eff36..825f6cc07 100644
--- a/chain/actors/builtin/builtin.go.template
+++ b/chain/actors/builtin/builtin.go.template
@@ -7,7 +7,9 @@ import (
"github.com/ipfs/go-cid"
{{range .versions}}
+ {{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
+ {{end}}
{{end}}
"github.com/filecoin-project/go-state-types/abi"
@@ -16,7 +18,7 @@ import (
"github.com/filecoin-project/lotus/chain/actors"
- miner{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
smoothingtypes "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing"
)
@@ -50,7 +52,7 @@ type PoStProof = proof.PoStProof
type FilterEstimate = smoothingtypes.FilterEstimate
func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower {
- return miner{{.latestVersion}}.QAPowerForWeight(size, duration, dealWeight, verifiedWeight)
+ return minertypes.QAPowerForWeight(size, duration, dealWeight, verifiedWeight)
}
func ActorNameByCode(c cid.Cid) string {
@@ -60,8 +62,10 @@ func ActorNameByCode(c cid.Cid) string {
switch {
{{range .versions}}
+ {{if (le . 7)}}
case builtin{{.}}.IsBuiltinActor(c):
return builtin{{.}}.ActorNameByCode(c)
+ {{end}}
{{end}}
default:
return ""
diff --git a/chain/actors/builtin/cron/actor.go.template b/chain/actors/builtin/cron/actor.go.template
index fb70f314a..3abb33e63 100644
--- a/chain/actors/builtin/cron/actor.go.template
+++ b/chain/actors/builtin/cron/actor.go.template
@@ -1,6 +1,8 @@
package cron
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"golang.org/x/xerrors"
@@ -9,10 +11,9 @@ import (
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -24,7 +25,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -43,10 +44,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store)
{{end}}
}
@@ -60,5 +61,16 @@ var (
type State interface {
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
GetState() interface{}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go
index 00264e3b4..3f573789a 100644
--- a/chain/actors/builtin/cron/cron.go
+++ b/chain/actors/builtin/cron/cron.go
@@ -1,9 +1,11 @@
package cron
import (
+ "github.com/ipfs/go-cid"
"golang.org/x/xerrors"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
@@ -25,9 +27,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -59,42 +67,67 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store)
+ case actorstypes.Version9:
+ return make9(store)
+
+ case actorstypes.Version10:
+ return make10(store)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
var (
- Address = builtin8.CronActorAddr
- Methods = builtin8.MethodsCron
+ Address = builtin10.CronActorAddr
+ Methods = builtin10.MethodsCron
)
type State interface {
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
GetState() interface{}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/cron/state.go.template b/chain/actors/builtin/cron/state.go.template
index 13cdc46c9..24739f162 100644
--- a/chain/actors/builtin/cron/state.go.template
+++ b/chain/actors/builtin/cron/state.go.template
@@ -1,9 +1,12 @@
package cron
import (
+ "fmt"
"github.com/ipfs/go-cid"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
{{if (le .v 7)}}
cron{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/cron"
@@ -36,4 +39,21 @@ type state{{.v}} struct {
func (s *state{{.v}}) GetState() interface{} {
return &s.State
-}
\ No newline at end of file
+}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v0.go b/chain/actors/builtin/cron/v0.go
index baa81aac3..ef5f6d93e 100644
--- a/chain/actors/builtin/cron/v0.go
+++ b/chain/actors/builtin/cron/v0.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron0 "github.com/filecoin-project/specs-actors/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state0 struct {
func (s *state0) GetState() interface{} {
return &s.State
}
+
+func (s *state0) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v10.go b/chain/actors/builtin/cron/v10.go
new file mode 100644
index 000000000..4e2e1c815
--- /dev/null
+++ b/chain/actors/builtin/cron/v10.go
@@ -0,0 +1,56 @@
+package cron
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ cron10 "github.com/filecoin-project/go-state-types/builtin/v10/cron"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store) (State, error) {
+ out := state10{store: store}
+ out.State = *cron10.ConstructState(cron10.BuiltInEntries())
+ return &out, nil
+}
+
+type state10 struct {
+ cron10.State
+ store adt.Store
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v2.go b/chain/actors/builtin/cron/v2.go
index d6ee35935..fc45be0de 100644
--- a/chain/actors/builtin/cron/v2.go
+++ b/chain/actors/builtin/cron/v2.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state2 struct {
func (s *state2) GetState() interface{} {
return &s.State
}
+
+func (s *state2) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v3.go b/chain/actors/builtin/cron/v3.go
index 356d385cd..6f8e66a3b 100644
--- a/chain/actors/builtin/cron/v3.go
+++ b/chain/actors/builtin/cron/v3.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state3 struct {
func (s *state3) GetState() interface{} {
return &s.State
}
+
+func (s *state3) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v4.go b/chain/actors/builtin/cron/v4.go
index 3db3c95aa..2539f2b1c 100644
--- a/chain/actors/builtin/cron/v4.go
+++ b/chain/actors/builtin/cron/v4.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state4 struct {
func (s *state4) GetState() interface{} {
return &s.State
}
+
+func (s *state4) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v5.go b/chain/actors/builtin/cron/v5.go
index 5d99af1fd..8aba47a2b 100644
--- a/chain/actors/builtin/cron/v5.go
+++ b/chain/actors/builtin/cron/v5.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state5 struct {
func (s *state5) GetState() interface{} {
return &s.State
}
+
+func (s *state5) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v6.go b/chain/actors/builtin/cron/v6.go
index c86cd6c42..f607a409f 100644
--- a/chain/actors/builtin/cron/v6.go
+++ b/chain/actors/builtin/cron/v6.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state6 struct {
func (s *state6) GetState() interface{} {
return &s.State
}
+
+func (s *state6) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v7.go b/chain/actors/builtin/cron/v7.go
index db9f8f9e2..ef962fd41 100644
--- a/chain/actors/builtin/cron/v7.go
+++ b/chain/actors/builtin/cron/v7.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state7 struct {
func (s *state7) GetState() interface{} {
return &s.State
}
+
+func (s *state7) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v8.go b/chain/actors/builtin/cron/v8.go
index 00567acf9..377cba060 100644
--- a/chain/actors/builtin/cron/v8.go
+++ b/chain/actors/builtin/cron/v8.go
@@ -1,10 +1,14 @@
package cron
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
cron8 "github.com/filecoin-project/go-state-types/builtin/v8/cron"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -33,3 +37,20 @@ type state8 struct {
func (s *state8) GetState() interface{} {
return &s.State
}
+
+func (s *state8) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/cron/v9.go b/chain/actors/builtin/cron/v9.go
new file mode 100644
index 000000000..b2e1d1265
--- /dev/null
+++ b/chain/actors/builtin/cron/v9.go
@@ -0,0 +1,56 @@
+package cron
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ cron9 "github.com/filecoin-project/go-state-types/builtin/v9/cron"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store) (State, error) {
+ out := state9{store: store}
+ out.State = *cron9.ConstructState(cron9.BuiltInEntries())
+ return &out, nil
+}
+
+type state9 struct {
+ cron9.State
+ store adt.Store
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) ActorKey() string {
+ return actors.CronKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/datacap/actor.go.template b/chain/actors/builtin/datacap/actor.go.template
new file mode 100644
index 000000000..15272d7d1
--- /dev/null
+++ b/chain/actors/builtin/datacap/actor.go.template
@@ -0,0 +1,69 @@
+package datacap
+
+import (
+ "golang.org/x/xerrors"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
+ "github.com/filecoin-project/go-state-types/cbor"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+var (
+ Address = builtin{{.latestVersion}}.DatacapActorAddr
+ Methods = builtin{{.latestVersion}}.MethodsDatacap
+)
+
+func Load(store adt.Store, act *types.Actor) (State, error) {
+ if name, av, ok := actors.GetActorMetaByCode(act.Code); ok {
+ if name != actors.DatacapKey {
+ return nil, xerrors.Errorf("actor code is not datacap: %s", name)
+ }
+
+ switch av {
+ {{range .versions}}
+ case actorstypes.Version{{.}}:
+ return load{{.}}(store, act.Head)
+ {{end}}
+ }
+ }
+
+ return nil, xerrors.Errorf("unknown actor code %s", act.Code)
+}
+
+func MakeState(store adt.Store, av actorstypes.Version, governor address.Address, bitwidth uint64) (State, error) {
+ switch av {
+{{range .versions}}
+ case actorstypes.Version{{.}}:
+ return make{{.}}(store, governor, bitwidth)
+{{end}}
+ default: return nil, xerrors.Errorf("datacap actor only valid for actors v9 and above, got %d", av)
+ }
+}
+
+type State interface {
+ cbor.Marshaler
+
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
+ ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error
+ VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error)
+ Governor() (address.Address, error)
+ GetState() interface{}
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/datacap/datacap.go b/chain/actors/builtin/datacap/datacap.go
new file mode 100644
index 000000000..977c020d3
--- /dev/null
+++ b/chain/actors/builtin/datacap/datacap.go
@@ -0,0 +1,75 @@
+package datacap
+
+import (
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ "github.com/filecoin-project/go-state-types/cbor"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+var (
+ Address = builtin10.DatacapActorAddr
+ Methods = builtin10.MethodsDatacap
+)
+
+func Load(store adt.Store, act *types.Actor) (State, error) {
+ if name, av, ok := actors.GetActorMetaByCode(act.Code); ok {
+ if name != actors.DatacapKey {
+ return nil, xerrors.Errorf("actor code is not datacap: %s", name)
+ }
+
+ switch av {
+
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
+ }
+ }
+
+ return nil, xerrors.Errorf("unknown actor code %s", act.Code)
+}
+
+func MakeState(store adt.Store, av actorstypes.Version, governor address.Address, bitwidth uint64) (State, error) {
+ switch av {
+
+ case actorstypes.Version9:
+ return make9(store, governor, bitwidth)
+
+ case actorstypes.Version10:
+ return make10(store, governor, bitwidth)
+
+ default:
+ return nil, xerrors.Errorf("datacap actor only valid for actors v9 and above, got %d", av)
+ }
+}
+
+type State interface {
+ cbor.Marshaler
+
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
+ ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error
+ VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error)
+ Governor() (address.Address, error)
+ GetState() interface{}
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/datacap/state.go.template b/chain/actors/builtin/datacap/state.go.template
new file mode 100644
index 000000000..dfb6eaad4
--- /dev/null
+++ b/chain/actors/builtin/datacap/state.go.template
@@ -0,0 +1,80 @@
+package datacap
+
+import (
+ "fmt"
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+
+ datacap{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}datacap"
+ adt{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}util/adt"
+)
+
+var _ State = (*state{{.v}})(nil)
+
+func load{{.v}}(store adt.Store, root cid.Cid) (State, error) {
+ out := state{{.v}}{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make{{.v}}(store adt.Store, governor address.Address, bitwidth uint64) (State, error) {
+ out := state{{.v}}{store: store}
+ s, err := datacap{{.v}}.ConstructState(store, governor, bitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state{{.v}} struct {
+ datacap{{.v}}.State
+ store adt.Store
+}
+
+func (s *state{{.v}}) Governor() (address.Address, error) {
+ return s.State.Governor, nil
+}
+
+func (s *state{{.v}}) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state{{.v}}) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+ return forEachClient(s.store, actors.Version{{.v}}, s.verifiedClients, cb)
+}
+
+func (s *state{{.v}}) verifiedClients() (adt.Map, error) {
+ return adt{{.v}}.AsMap(s.store, s.Token.Balances, int(s.Token.HamtBitWidth))
+}
+
+func (s *state{{.v}}) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+ return getDataCap(s.store, actors.Version{{.v}}, s.verifiedClients, addr)
+}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.DatacapKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/datacap/util.go b/chain/actors/builtin/datacap/util.go
new file mode 100644
index 000000000..03e941d6e
--- /dev/null
+++ b/chain/actors/builtin/datacap/util.go
@@ -0,0 +1,63 @@
+package datacap
+
+import (
+ "github.com/multiformats/go-varint"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+// taking this as a function instead of asking the caller to call it helps reduce some of the error
+// checking boilerplate.
+//
+// "go made me do it"
+type rootFunc func() (adt.Map, error)
+
+func getDataCap(store adt.Store, ver actors.Version, root rootFunc, addr address.Address) (bool, abi.StoragePower, error) {
+ if addr.Protocol() != address.ID {
+ return false, big.Zero(), xerrors.Errorf("can only look up ID addresses")
+ }
+ vh, err := root()
+ if err != nil {
+ return false, big.Zero(), xerrors.Errorf("loading datacap actor: %w", err)
+ }
+
+ var dcap abi.StoragePower
+ if found, err := vh.Get(abi.IdAddrKey(addr), &dcap); err != nil {
+ return false, big.Zero(), xerrors.Errorf("looking up addr: %w", err)
+ } else if !found {
+ return false, big.Zero(), nil
+ }
+
+ return true, big.Div(dcap, verifreg.DataCapGranularity), nil
+}
+
+func forEachClient(store adt.Store, ver actors.Version, root rootFunc, cb func(addr address.Address, dcap abi.StoragePower) error) error {
+ vh, err := root()
+ if err != nil {
+ return xerrors.Errorf("loading verified clients: %w", err)
+ }
+ var dcap abi.StoragePower
+ return vh.ForEach(&dcap, func(key string) error {
+ id, n, err := varint.FromUvarint([]byte(key))
+ if n != len([]byte(key)) {
+ return xerrors.Errorf("could not get varint from address string")
+ }
+ if err != nil {
+ return err
+ }
+
+ a, err := address.NewIDAddress(id)
+ if err != nil {
+ return xerrors.Errorf("creating ID address from actor ID: %w", err)
+ }
+
+ return cb(a, big.Div(dcap, verifreg.DataCapGranularity))
+ })
+}
diff --git a/chain/actors/builtin/datacap/v10.go b/chain/actors/builtin/datacap/v10.go
new file mode 100644
index 000000000..6f4c8593d
--- /dev/null
+++ b/chain/actors/builtin/datacap/v10.go
@@ -0,0 +1,81 @@
+package datacap
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ datacap10 "github.com/filecoin-project/go-state-types/builtin/v10/datacap"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, governor address.Address, bitwidth uint64) (State, error) {
+ out := state10{store: store}
+ s, err := datacap10.ConstructState(store, governor, bitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state10 struct {
+ datacap10.State
+ store adt.Store
+}
+
+func (s *state10) Governor() (address.Address, error) {
+ return s.State.Governor, nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+ return forEachClient(s.store, actors.Version10, s.verifiedClients, cb)
+}
+
+func (s *state10) verifiedClients() (adt.Map, error) {
+ return adt10.AsMap(s.store, s.Token.Balances, int(s.Token.HamtBitWidth))
+}
+
+func (s *state10) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+ return getDataCap(s.store, actors.Version10, s.verifiedClients, addr)
+}
+
+func (s *state10) ActorKey() string {
+ return actors.DatacapKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/datacap/v9.go b/chain/actors/builtin/datacap/v9.go
new file mode 100644
index 000000000..6dcf04477
--- /dev/null
+++ b/chain/actors/builtin/datacap/v9.go
@@ -0,0 +1,81 @@
+package datacap
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ datacap9 "github.com/filecoin-project/go-state-types/builtin/v9/datacap"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store, governor address.Address, bitwidth uint64) (State, error) {
+ out := state9{store: store}
+ s, err := datacap9.ConstructState(store, governor, bitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state9 struct {
+ datacap9.State
+ store adt.Store
+}
+
+func (s *state9) Governor() (address.Address, error) {
+ return s.State.Governor, nil
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+ return forEachClient(s.store, actors.Version9, s.verifiedClients, cb)
+}
+
+func (s *state9) verifiedClients() (adt.Map, error) {
+ return adt9.AsMap(s.store, s.Token.Balances, int(s.Token.HamtBitWidth))
+}
+
+func (s *state9) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+ return getDataCap(s.store, actors.Version9, s.verifiedClients, addr)
+}
+
+func (s *state9) ActorKey() string {
+ return actors.DatacapKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/evm/actor.go.template b/chain/actors/builtin/evm/actor.go.template
new file mode 100644
index 000000000..698029253
--- /dev/null
+++ b/chain/actors/builtin/evm/actor.go.template
@@ -0,0 +1,51 @@
+package evm
+
+import (
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/cbor"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/types"
+
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
+)
+
+var Methods = builtin{{.latestVersion}}.MethodsEVM
+
+func Load(store adt.Store, act *types.Actor) (State, error) {
+ if name, av, ok := actors.GetActorMetaByCode(act.Code); ok {
+ if name != actors.EvmKey {
+ return nil, xerrors.Errorf("actor code is not evm: %s", name)
+ }
+
+ switch av {
+ {{range .versions}}
+ case actorstypes.Version{{.}}:
+ return load{{.}}(store, act.Head)
+ {{end}}
+ }
+ }
+
+ return nil, xerrors.Errorf("unknown actor code %s", act.Code)
+}
+
+func MakeState(store adt.Store, av actorstypes.Version, bytecode cid.Cid) (State, error) {
+ switch av {
+{{range .versions}}
+ case actorstypes.Version{{.}}:
+ return make{{.}}(store, bytecode)
+{{end}}
+ default: return nil, xerrors.Errorf("evm actor only valid for actors v10 and above, got %d", av)
+ }
+}
+
+type State interface {
+ cbor.Marshaler
+
+ Nonce() (uint64, error)
+ GetState() interface{}
+}
diff --git a/chain/actors/builtin/evm/evm.go b/chain/actors/builtin/evm/evm.go
new file mode 100644
index 000000000..69bd90c42
--- /dev/null
+++ b/chain/actors/builtin/evm/evm.go
@@ -0,0 +1,51 @@
+package evm
+
+import (
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ "github.com/filecoin-project/go-state-types/cbor"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+var Methods = builtin10.MethodsEVM
+
+func Load(store adt.Store, act *types.Actor) (State, error) {
+ if name, av, ok := actors.GetActorMetaByCode(act.Code); ok {
+ if name != actors.EvmKey {
+ return nil, xerrors.Errorf("actor code is not evm: %s", name)
+ }
+
+ switch av {
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
+ }
+ }
+
+ return nil, xerrors.Errorf("unknown actor code %s", act.Code)
+}
+
+func MakeState(store adt.Store, av actorstypes.Version, bytecode cid.Cid) (State, error) {
+ switch av {
+
+ case actorstypes.Version10:
+ return make10(store, bytecode)
+
+ default:
+ return nil, xerrors.Errorf("evm actor only valid for actors v10 and above, got %d", av)
+ }
+}
+
+type State interface {
+ cbor.Marshaler
+
+ Nonce() (uint64, error)
+ GetState() interface{}
+}
diff --git a/chain/actors/builtin/evm/state.go.template b/chain/actors/builtin/evm/state.go.template
new file mode 100644
index 000000000..acc78dc0f
--- /dev/null
+++ b/chain/actors/builtin/evm/state.go.template
@@ -0,0 +1,45 @@
+package evm
+
+import (
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+
+ evm{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}evm"
+)
+
+var _ State = (*state{{.v}})(nil)
+
+func load{{.v}}(store adt.Store, root cid.Cid) (State, error) {
+ out := state{{.v}}{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make{{.v}}(store adt.Store, bytecode cid.Cid) (State, error) {
+ out := state{{.v}}{store: store}
+ s, err := evm{{.v}}.ConstructState(store, bytecode)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state{{.v}} struct {
+ evm{{.v}}.State
+ store adt.Store
+}
+
+func (s *state{{.v}}) Nonce() (uint64, error) {
+ return s.State.Nonce, nil
+}
+
+func (s *state{{.v}}) GetState() interface{} {
+ return &s.State
+}
\ No newline at end of file
diff --git a/chain/actors/builtin/evm/v10.go b/chain/actors/builtin/evm/v10.go
new file mode 100644
index 000000000..78a4a2383
--- /dev/null
+++ b/chain/actors/builtin/evm/v10.go
@@ -0,0 +1,45 @@
+package evm
+
+import (
+ "github.com/ipfs/go-cid"
+
+ evm10 "github.com/filecoin-project/go-state-types/builtin/v10/evm"
+
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, bytecode cid.Cid) (State, error) {
+ out := state10{store: store}
+ s, err := evm10.ConstructState(store, bytecode)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state10 struct {
+ evm10.State
+ store adt.Store
+}
+
+func (s *state10) Nonce() (uint64, error) {
+ return s.State.Nonce, nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
diff --git a/chain/actors/builtin/init/actor.go.template b/chain/actors/builtin/init/actor.go.template
index e27c66fbb..453aba963 100644
--- a/chain/actors/builtin/init/actor.go.template
+++ b/chain/actors/builtin/init/actor.go.template
@@ -1,6 +1,7 @@
package init
import (
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/lotus/chain/actors"
"golang.org/x/xerrors"
@@ -15,10 +16,9 @@ import (
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
)
var (
@@ -35,7 +35,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -54,10 +54,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, networkName string) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store, networkName)
{{end}}
}
@@ -67,6 +67,10 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
ResolveAddress(address address.Address) (address.Address, bool, error)
MapAddressToNewID(address address.Address) (address.Address, error)
NetworkName() (dtypes.NetworkName, error)
@@ -87,6 +91,16 @@ type State interface {
// Sets the address map for the init actor. This should only be used for testing.
SetAddressMap(mcid cid.Cid) error
- AddressMap() (adt.Map, error)
GetState() interface{}
+
+ AddressMap() (adt.Map, error)
+ AddressMapBitWidth() int
+ AddressMapHashFunction() func(input []byte) []byte
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
}
diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go
index c7e0f7b82..a97d40297 100644
--- a/chain/actors/builtin/init/init.go
+++ b/chain/actors/builtin/init/init.go
@@ -6,7 +6,8 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/go-state-types/cbor"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
@@ -23,8 +24,8 @@ import (
)
var (
- Address = builtin8.InitActorAddr
- Methods = builtin8.MethodsInit
+ Address = builtin10.InitActorAddr
+ Methods = builtin10.MethodsInit
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -35,9 +36,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -69,33 +76,39 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, networkName string) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, networkName string) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store, networkName)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store, networkName)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store, networkName)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store, networkName)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store, networkName)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store, networkName)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store, networkName)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store, networkName)
+ case actorstypes.Version9:
+ return make9(store, networkName)
+
+ case actorstypes.Version10:
+ return make10(store, networkName)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
@@ -103,6 +116,10 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
ResolveAddress(address address.Address) (address.Address, bool, error)
MapAddressToNewID(address address.Address) (address.Address, error)
NetworkName() (dtypes.NetworkName, error)
@@ -123,6 +140,24 @@ type State interface {
// Sets the address map for the init actor. This should only be used for testing.
SetAddressMap(mcid cid.Cid) error
- AddressMap() (adt.Map, error)
GetState() interface{}
+
+ AddressMap() (adt.Map, error)
+ AddressMapBitWidth() int
+ AddressMapHashFunction() func(input []byte) []byte
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
}
diff --git a/chain/actors/builtin/init/state.go.template b/chain/actors/builtin/init/state.go.template
index 0e56f5da4..c31aef6a0 100644
--- a/chain/actors/builtin/init/state.go.template
+++ b/chain/actors/builtin/init/state.go.template
@@ -1,13 +1,18 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/lotus/node/modules/dtypes"
{{if (le .v 7)}}
@@ -119,10 +124,42 @@ func (s *state{{.v}}) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state{{.v}}) GetState() interface{} {
+ return &s.State
+}
+
func (s *state{{.v}}) AddressMap() (adt.Map, error) {
return adt{{.v}}.AsMap(s.store, s.State.AddressMap{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}})
}
-func (s *state{{.v}}) GetState() interface{} {
- return &s.State
-}
\ No newline at end of file
+func (s *state{{.v}}) AddressMapBitWidth() int {
+ {{- if (ge .v 3)}}
+ return builtin{{.v}}.DefaultHamtBitwidth
+ {{- else}}
+ return 5
+ {{- end}}
+}
+
+func (s *state{{.v}}) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/init/v0.go b/chain/actors/builtin/init/v0.go
index 2f6b213c0..61ae3f2db 100644
--- a/chain/actors/builtin/init/v0.go
+++ b/chain/actors/builtin/init/v0.go
@@ -1,15 +1,20 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
init0 "github.com/filecoin-project/specs-actors/actors/builtin/init"
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -103,10 +108,38 @@ func (s *state0) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state0) GetState() interface{} {
+ return &s.State
+}
+
func (s *state0) AddressMap() (adt.Map, error) {
return adt0.AsMap(s.store, s.State.AddressMap)
}
-func (s *state0) GetState() interface{} {
- return &s.State
+func (s *state0) AddressMapBitWidth() int {
+ return 5
+}
+
+func (s *state0) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state0) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v10.go b/chain/actors/builtin/init/v10.go
new file mode 100644
index 000000000..761f9dacc
--- /dev/null
+++ b/chain/actors/builtin/init/v10.go
@@ -0,0 +1,146 @@
+package init
+
+import (
+ "crypto/sha256"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ init10 "github.com/filecoin-project/go-state-types/builtin/v10/init"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/node/modules/dtypes"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, networkName string) (State, error) {
+ out := state10{store: store}
+
+ s, err := init10.ConstructState(store, networkName)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state10 struct {
+ init10.State
+ store adt.Store
+}
+
+func (s *state10) ResolveAddress(address address.Address) (address.Address, bool, error) {
+ return s.State.ResolveAddress(s.store, address)
+}
+
+func (s *state10) MapAddressToNewID(address address.Address) (address.Address, error) {
+ return s.State.MapAddressToNewID(s.store, address)
+}
+
+func (s *state10) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error {
+ addrs, err := adt10.AsMap(s.store, s.State.AddressMap, builtin10.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+ var actorID cbg.CborInt
+ return addrs.ForEach(&actorID, func(key string) error {
+ addr, err := address.NewFromBytes([]byte(key))
+ if err != nil {
+ return err
+ }
+ return cb(abi.ActorID(actorID), addr)
+ })
+}
+
+func (s *state10) NetworkName() (dtypes.NetworkName, error) {
+ return dtypes.NetworkName(s.State.NetworkName), nil
+}
+
+func (s *state10) SetNetworkName(name string) error {
+ s.State.NetworkName = name
+ return nil
+}
+
+func (s *state10) SetNextID(id abi.ActorID) error {
+ s.State.NextID = id
+ return nil
+}
+
+func (s *state10) Remove(addrs ...address.Address) (err error) {
+ m, err := adt10.AsMap(s.store, s.State.AddressMap, builtin10.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+ for _, addr := range addrs {
+ if err = m.Delete(abi.AddrKey(addr)); err != nil {
+ return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err)
+ }
+ }
+ amr, err := m.Root()
+ if err != nil {
+ return xerrors.Errorf("failed to get address map root: %w", err)
+ }
+ s.State.AddressMap = amr
+ return nil
+}
+
+func (s *state10) SetAddressMap(mcid cid.Cid) error {
+ s.State.AddressMap = mcid
+ return nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) AddressMap() (adt.Map, error) {
+ return adt10.AsMap(s.store, s.State.AddressMap, builtin10.DefaultHamtBitwidth)
+}
+
+func (s *state10) AddressMapBitWidth() int {
+ return builtin10.DefaultHamtBitwidth
+}
+
+func (s *state10) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state10) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/init/v2.go b/chain/actors/builtin/init/v2.go
index d780a1fe9..dfbdde6c9 100644
--- a/chain/actors/builtin/init/v2.go
+++ b/chain/actors/builtin/init/v2.go
@@ -1,15 +1,20 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init"
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -103,10 +108,38 @@ func (s *state2) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state2) GetState() interface{} {
+ return &s.State
+}
+
func (s *state2) AddressMap() (adt.Map, error) {
return adt2.AsMap(s.store, s.State.AddressMap)
}
-func (s *state2) GetState() interface{} {
- return &s.State
+func (s *state2) AddressMapBitWidth() int {
+ return 5
+}
+
+func (s *state2) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state2) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v3.go b/chain/actors/builtin/init/v3.go
index b2f713b1f..56a5e4afd 100644
--- a/chain/actors/builtin/init/v3.go
+++ b/chain/actors/builtin/init/v3.go
@@ -1,16 +1,21 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init"
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -104,10 +109,38 @@ func (s *state3) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state3) GetState() interface{} {
+ return &s.State
+}
+
func (s *state3) AddressMap() (adt.Map, error) {
return adt3.AsMap(s.store, s.State.AddressMap, builtin3.DefaultHamtBitwidth)
}
-func (s *state3) GetState() interface{} {
- return &s.State
+func (s *state3) AddressMapBitWidth() int {
+ return builtin3.DefaultHamtBitwidth
+}
+
+func (s *state3) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state3) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v4.go b/chain/actors/builtin/init/v4.go
index 9de02816f..b1ecd3188 100644
--- a/chain/actors/builtin/init/v4.go
+++ b/chain/actors/builtin/init/v4.go
@@ -1,16 +1,21 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init"
adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -104,10 +109,38 @@ func (s *state4) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state4) GetState() interface{} {
+ return &s.State
+}
+
func (s *state4) AddressMap() (adt.Map, error) {
return adt4.AsMap(s.store, s.State.AddressMap, builtin4.DefaultHamtBitwidth)
}
-func (s *state4) GetState() interface{} {
- return &s.State
+func (s *state4) AddressMapBitWidth() int {
+ return builtin4.DefaultHamtBitwidth
+}
+
+func (s *state4) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state4) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v5.go b/chain/actors/builtin/init/v5.go
index f9c59f83a..b8a6438d7 100644
--- a/chain/actors/builtin/init/v5.go
+++ b/chain/actors/builtin/init/v5.go
@@ -1,16 +1,21 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init"
adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -104,10 +109,38 @@ func (s *state5) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state5) GetState() interface{} {
+ return &s.State
+}
+
func (s *state5) AddressMap() (adt.Map, error) {
return adt5.AsMap(s.store, s.State.AddressMap, builtin5.DefaultHamtBitwidth)
}
-func (s *state5) GetState() interface{} {
- return &s.State
+func (s *state5) AddressMapBitWidth() int {
+ return builtin5.DefaultHamtBitwidth
+}
+
+func (s *state5) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state5) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v6.go b/chain/actors/builtin/init/v6.go
index 494b6aaa0..aeadc2caf 100644
--- a/chain/actors/builtin/init/v6.go
+++ b/chain/actors/builtin/init/v6.go
@@ -1,16 +1,21 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init"
adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -104,10 +109,38 @@ func (s *state6) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state6) GetState() interface{} {
+ return &s.State
+}
+
func (s *state6) AddressMap() (adt.Map, error) {
return adt6.AsMap(s.store, s.State.AddressMap, builtin6.DefaultHamtBitwidth)
}
-func (s *state6) GetState() interface{} {
- return &s.State
+func (s *state6) AddressMapBitWidth() int {
+ return builtin6.DefaultHamtBitwidth
+}
+
+func (s *state6) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state6) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v7.go b/chain/actors/builtin/init/v7.go
index bc378a141..e62c56277 100644
--- a/chain/actors/builtin/init/v7.go
+++ b/chain/actors/builtin/init/v7.go
@@ -1,16 +1,21 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init"
adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -104,10 +109,38 @@ func (s *state7) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state7) GetState() interface{} {
+ return &s.State
+}
+
func (s *state7) AddressMap() (adt.Map, error) {
return adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth)
}
-func (s *state7) GetState() interface{} {
- return &s.State
+func (s *state7) AddressMapBitWidth() int {
+ return builtin7.DefaultHamtBitwidth
+}
+
+func (s *state7) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state7) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v8.go b/chain/actors/builtin/init/v8.go
index 63b058e57..145b75551 100644
--- a/chain/actors/builtin/init/v8.go
+++ b/chain/actors/builtin/init/v8.go
@@ -1,16 +1,21 @@
package init
import (
+ "crypto/sha256"
+ "fmt"
+
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin8 "github.com/filecoin-project/go-state-types/builtin"
init8 "github.com/filecoin-project/go-state-types/builtin/v8/init"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -104,10 +109,38 @@ func (s *state8) SetAddressMap(mcid cid.Cid) error {
return nil
}
+func (s *state8) GetState() interface{} {
+ return &s.State
+}
+
func (s *state8) AddressMap() (adt.Map, error) {
return adt8.AsMap(s.store, s.State.AddressMap, builtin8.DefaultHamtBitwidth)
}
-func (s *state8) GetState() interface{} {
- return &s.State
+func (s *state8) AddressMapBitWidth() int {
+ return builtin8.DefaultHamtBitwidth
+}
+
+func (s *state8) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state8) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
}
diff --git a/chain/actors/builtin/init/v9.go b/chain/actors/builtin/init/v9.go
new file mode 100644
index 000000000..8cba18e7a
--- /dev/null
+++ b/chain/actors/builtin/init/v9.go
@@ -0,0 +1,146 @@
+package init
+
+import (
+ "crypto/sha256"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin9 "github.com/filecoin-project/go-state-types/builtin"
+ init9 "github.com/filecoin-project/go-state-types/builtin/v9/init"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/node/modules/dtypes"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store, networkName string) (State, error) {
+ out := state9{store: store}
+
+ s, err := init9.ConstructState(store, networkName)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state9 struct {
+ init9.State
+ store adt.Store
+}
+
+func (s *state9) ResolveAddress(address address.Address) (address.Address, bool, error) {
+ return s.State.ResolveAddress(s.store, address)
+}
+
+func (s *state9) MapAddressToNewID(address address.Address) (address.Address, error) {
+ return s.State.MapAddressToNewID(s.store, address)
+}
+
+func (s *state9) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error {
+ addrs, err := adt9.AsMap(s.store, s.State.AddressMap, builtin9.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+ var actorID cbg.CborInt
+ return addrs.ForEach(&actorID, func(key string) error {
+ addr, err := address.NewFromBytes([]byte(key))
+ if err != nil {
+ return err
+ }
+ return cb(abi.ActorID(actorID), addr)
+ })
+}
+
+func (s *state9) NetworkName() (dtypes.NetworkName, error) {
+ return dtypes.NetworkName(s.State.NetworkName), nil
+}
+
+func (s *state9) SetNetworkName(name string) error {
+ s.State.NetworkName = name
+ return nil
+}
+
+func (s *state9) SetNextID(id abi.ActorID) error {
+ s.State.NextID = id
+ return nil
+}
+
+func (s *state9) Remove(addrs ...address.Address) (err error) {
+ m, err := adt9.AsMap(s.store, s.State.AddressMap, builtin9.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+ for _, addr := range addrs {
+ if err = m.Delete(abi.AddrKey(addr)); err != nil {
+ return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err)
+ }
+ }
+ amr, err := m.Root()
+ if err != nil {
+ return xerrors.Errorf("failed to get address map root: %w", err)
+ }
+ s.State.AddressMap = amr
+ return nil
+}
+
+func (s *state9) SetAddressMap(mcid cid.Cid) error {
+ s.State.AddressMap = mcid
+ return nil
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) AddressMap() (adt.Map, error) {
+ return adt9.AsMap(s.store, s.State.AddressMap, builtin9.DefaultHamtBitwidth)
+}
+
+func (s *state9) AddressMapBitWidth() int {
+ return builtin9.DefaultHamtBitwidth
+}
+
+func (s *state9) AddressMapHashFunction() func(input []byte) []byte {
+ return func(input []byte) []byte {
+ res := sha256.Sum256(input)
+ return res[:]
+ }
+}
+
+func (s *state9) ActorKey() string {
+ return actors.InitKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/actor.go.template b/chain/actors/builtin/market/actor.go.template
index 66298a18a..b8d8c987b 100644
--- a/chain/actors/builtin/market/actor.go.template
+++ b/chain/actors/builtin/market/actor.go.template
@@ -1,7 +1,9 @@
package market
import (
- "unicode/utf8"
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "unicode/utf8"
"github.com/filecoin-project/go-state-types/network"
"golang.org/x/xerrors"
@@ -12,23 +14,24 @@ import (
"github.com/filecoin-project/go-state-types/cbor"
cbg "github.com/whyrusleeping/cbor-gen"
- market{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin{{import .latestVersion}}market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
+
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
)
var (
- Address = builtin{{.latestVersion}}.StorageMarketActorAddr
- Methods = builtin{{.latestVersion}}.MethodsMarket
+ Address = builtintypes.StorageMarketActorAddr
+ Methods = builtintypes.MethodsMarket
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -40,7 +43,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -59,10 +62,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store)
{{end}}
}
@@ -71,6 +74,11 @@ func MakeState(store adt.Store, av actors.Version) (State, error) {
type State interface {
cbor.Marshaler
+
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
BalancesChanged(State) (bool, error)
EscrowTable() (BalanceTable, error)
LockedTable() (BalanceTable, error)
@@ -84,6 +92,7 @@ type State interface {
) (weight, verifiedWeight abi.DealWeight, err error)
NextID() (abi.DealID, error)
GetState() interface{}
+ GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error)
}
type BalanceTable interface {
@@ -100,11 +109,11 @@ type DealStates interface {
}
type DealProposals interface {
- ForEach(cb func(id abi.DealID, dp market{{.latestVersion}}.DealProposal) error) error
- Get(id abi.DealID) (*market{{.latestVersion}}.DealProposal, bool, error)
+ ForEach(cb func(id abi.DealID, dp markettypes.DealProposal) error) error
+ Get(id abi.DealID) (*markettypes.DealProposal, bool, error)
array() adt.Array
- decode(*cbg.Deferred) (*market{{.latestVersion}}.DealProposal, error)
+ decode(*cbg.Deferred) (*markettypes.DealProposal, error)
}
@@ -115,23 +124,24 @@ type PublishStorageDealsReturn interface {
}
func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) {
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return nil, err
}
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return decodePublishStorageDealsReturn{{.}}(b)
{{end}}
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
-type DealProposal = market{{.latestVersion}}.DealProposal
+type DealProposal = markettypes.DealProposal
+type DealLabel = markettypes.DealLabel
-type DealState = market{{.latestVersion}}.DealState
+type DealState = markettypes.DealState
type DealStateChanges struct {
Added []DealIDState
@@ -158,7 +168,7 @@ type DealProposalChanges struct {
type ProposalIDState struct {
ID abi.DealID
- Proposal market{{.latestVersion}}.DealProposal
+ Proposal markettypes.DealProposal
}
func EmptyDealState() *DealState {
@@ -170,7 +180,7 @@ func EmptyDealState() *DealState {
}
// returns the earned fees and pending fees for a given deal
-func GetDealFees(deal market{{.latestVersion}}.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) {
+func GetDealFees(deal markettypes.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) {
tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch)))
ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch)))
@@ -185,14 +195,21 @@ func GetDealFees(deal market{{.latestVersion}}.DealProposal, height abi.ChainEpo
return ef, big.Sub(tf, ef)
}
-func IsDealActive(state market{{.latestVersion}}.DealState) bool {
+func IsDealActive(state markettypes.DealState) bool {
return state.SectorStartEpoch > -1 && state.SlashEpoch == -1
}
-func labelFromGoString(s string) (market{{.latestVersion}}.DealLabel, error) {
+func labelFromGoString(s string) (markettypes.DealLabel, error) {
if utf8.ValidString(s) {
- return market{{.latestVersion}}.NewLabelFromString(s)
+ return markettypes.NewLabelFromString(s)
} else {
- return market{{.latestVersion}}.NewLabelFromBytes([]byte(s))
+ return markettypes.NewLabelFromBytes([]byte(s))
}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go
index 8c0e4e91a..e96484d64 100644
--- a/chain/actors/builtin/market/market.go
+++ b/chain/actors/builtin/market/market.go
@@ -3,14 +3,17 @@ package market
import (
"unicode/utf8"
+ "github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/network"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
@@ -27,8 +30,8 @@ import (
)
var (
- Address = builtin8.StorageMarketActorAddr
- Methods = builtin8.MethodsMarket
+ Address = builtintypes.StorageMarketActorAddr
+ Methods = builtintypes.MethodsMarket
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -39,9 +42,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -73,39 +82,50 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store)
+ case actorstypes.Version9:
+ return make9(store)
+
+ case actorstypes.Version10:
+ return make10(store)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
type State interface {
cbor.Marshaler
+
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
BalancesChanged(State) (bool, error)
EscrowTable() (BalanceTable, error)
LockedTable() (BalanceTable, error)
@@ -119,6 +139,7 @@ type State interface {
) (weight, verifiedWeight abi.DealWeight, err error)
NextID() (abi.DealID, error)
GetState() interface{}
+ GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error)
}
type BalanceTable interface {
@@ -135,11 +156,11 @@ type DealStates interface {
}
type DealProposals interface {
- ForEach(cb func(id abi.DealID, dp market8.DealProposal) error) error
- Get(id abi.DealID) (*market8.DealProposal, bool, error)
+ ForEach(cb func(id abi.DealID, dp markettypes.DealProposal) error) error
+ Get(id abi.DealID) (*markettypes.DealProposal, bool, error)
array() adt.Array
- decode(*cbg.Deferred) (*market8.DealProposal, error)
+ decode(*cbg.Deferred) (*markettypes.DealProposal, error)
}
type PublishStorageDealsReturn interface {
@@ -149,44 +170,51 @@ type PublishStorageDealsReturn interface {
}
func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) {
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return nil, err
}
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return decodePublishStorageDealsReturn0(b)
- case actors.Version2:
+ case actorstypes.Version2:
return decodePublishStorageDealsReturn2(b)
- case actors.Version3:
+ case actorstypes.Version3:
return decodePublishStorageDealsReturn3(b)
- case actors.Version4:
+ case actorstypes.Version4:
return decodePublishStorageDealsReturn4(b)
- case actors.Version5:
+ case actorstypes.Version5:
return decodePublishStorageDealsReturn5(b)
- case actors.Version6:
+ case actorstypes.Version6:
return decodePublishStorageDealsReturn6(b)
- case actors.Version7:
+ case actorstypes.Version7:
return decodePublishStorageDealsReturn7(b)
- case actors.Version8:
+ case actorstypes.Version8:
return decodePublishStorageDealsReturn8(b)
+ case actorstypes.Version9:
+ return decodePublishStorageDealsReturn9(b)
+
+ case actorstypes.Version10:
+ return decodePublishStorageDealsReturn10(b)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
-type DealProposal = market8.DealProposal
+type DealProposal = markettypes.DealProposal
+type DealLabel = markettypes.DealLabel
-type DealState = market8.DealState
+type DealState = markettypes.DealState
type DealStateChanges struct {
Added []DealIDState
@@ -213,7 +241,7 @@ type DealProposalChanges struct {
type ProposalIDState struct {
ID abi.DealID
- Proposal market8.DealProposal
+ Proposal markettypes.DealProposal
}
func EmptyDealState() *DealState {
@@ -225,7 +253,7 @@ func EmptyDealState() *DealState {
}
// returns the earned fees and pending fees for a given deal
-func GetDealFees(deal market8.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) {
+func GetDealFees(deal markettypes.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) {
tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch)))
ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch)))
@@ -240,14 +268,29 @@ func GetDealFees(deal market8.DealProposal, height abi.ChainEpoch) (abi.TokenAmo
return ef, big.Sub(tf, ef)
}
-func IsDealActive(state market8.DealState) bool {
+func IsDealActive(state markettypes.DealState) bool {
return state.SectorStartEpoch > -1 && state.SlashEpoch == -1
}
-func labelFromGoString(s string) (market8.DealLabel, error) {
+func labelFromGoString(s string) (markettypes.DealLabel, error) {
if utf8.ValidString(s) {
- return market8.NewLabelFromString(s)
+ return markettypes.NewLabelFromString(s)
} else {
- return market8.NewLabelFromBytes([]byte(s))
+ return markettypes.NewLabelFromBytes([]byte(s))
+ }
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
}
}
diff --git a/chain/actors/builtin/market/state.go.template b/chain/actors/builtin/market/state.go.template
index 1ed2fc4fc..ef5dff0a5 100644
--- a/chain/actors/builtin/market/state.go.template
+++ b/chain/actors/builtin/market/state.go.template
@@ -1,6 +1,7 @@
package market
import (
+ "fmt"
"bytes"
"github.com/filecoin-project/go-address"
@@ -14,15 +15,22 @@ import (
{{end}}
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
{{if (le .v 7)}}
market{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/market"
adt{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/util/adt"
{{else}}
market{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}market"
- adt{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ adt{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}util/adt"
+{{end}}
+{{if (ge .v 9)}}
+ "github.com/filecoin-project/go-state-types/builtin"
{{end}}
)
@@ -200,7 +208,17 @@ func (s *dealStates{{.v}}) array() adt.Array {
}
func fromV{{.v}}DealState(v{{.v}} market{{.v}}.DealState) DealState {
- return (DealState)(v{{.v}})
+ ret := DealState{
+ SectorStartEpoch: v{{.v}}.SectorStartEpoch,
+ LastUpdatedEpoch: v{{.v}}.LastUpdatedEpoch,
+ SlashEpoch: v{{.v}}.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+ {{if (ge .v 9)}}
+ ret.VerifiedClaim = verifregtypes.AllocationId(v{{.v}}.VerifiedClaim)
+ {{end}}
+
+ return ret
}
type dealProposals{{.v}} struct {
@@ -258,12 +276,12 @@ func (s *dealProposals{{.v}}) array() adt.Array {
func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) (DealProposal, error) {
{{if (le .v 7)}}
label, err := labelFromGoString(v{{.v}}.Label)
- if err != nil {
- return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
- }
{{else}}
- label := v{{.v}}.Label
+ label, err := fromV{{.v}}Label(v{{.v}}.Label)
{{end}}
+ if err != nil {
+ return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
+ }
return DealProposal{
PieceCID: v{{.v}}.PieceCID,
@@ -283,6 +301,25 @@ func fromV{{.v}}DealProposal(v{{.v}} market{{.v}}.DealProposal) (DealProposal, e
}, nil
}
+{{if (ge .v 8)}}
+ func fromV{{.v}}Label(v{{.v}} market{{.v}}.DealLabel) (DealLabel, error) {
+ if v{{.v}}.IsString() {
+ str, err := v{{.v}}.ToString()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert string label to string: %w", err)
+ }
+ return markettypes.NewLabelFromString(str)
+ }
+
+ bs, err := v{{.v}}.ToBytes()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert bytes label to bytes: %w", err)
+ }
+ return markettypes.NewLabelFromBytes(bs)
+ }
+{{end}}
+
+
func (s *state{{.v}}) GetState() interface{} {
return &s.State
@@ -332,3 +369,43 @@ func (r *publishStorageDealsReturn{{.v}}) IsDealValid(index uint64) (bool, int,
func (r *publishStorageDealsReturn{{.v}}) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state{{.v}}) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+{{if (le .v 8)}}
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+{{else}}
+ allocations, err := adt{{.v}}.AsMap(s.store, s.PendingDealAllocationIds, builtin.DefaultHamtBitwidth)
+ if err != nil {
+ return verifregtypes.NoAllocationID, xerrors.Errorf("failed to load allocation id for %d: %w", dealId, err)
+ }
+
+ var allocationId cbg.CborInt
+ found, err := allocations.Get(abi.UIntKey(uint64(dealId)), &allocationId)
+ if err != nil {
+ return verifregtypes.NoAllocationID, xerrors.Errorf("failed to load allocation id for %d: %w", dealId, err)
+ }
+ if !found {
+ return verifregtypes.NoAllocationID, nil
+ }
+
+ return verifregtypes.AllocationId(allocationId), nil
+{{end}}
+}
+
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v0.go b/chain/actors/builtin/market/v0.go
index 38e92f12d..4af5fe9b0 100644
--- a/chain/actors/builtin/market/v0.go
+++ b/chain/actors/builtin/market/v0.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -9,9 +10,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
market0 "github.com/filecoin-project/specs-actors/actors/builtin/market"
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -183,7 +187,14 @@ func (s *dealStates0) array() adt.Array {
}
func fromV0DealState(v0 market0.DealState) DealState {
- return (DealState)(v0)
+ ret := DealState{
+ SectorStartEpoch: v0.SectorStartEpoch,
+ LastUpdatedEpoch: v0.LastUpdatedEpoch,
+ SlashEpoch: v0.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals0 struct {
@@ -241,6 +252,7 @@ func (s *dealProposals0) array() adt.Array {
func fromV0DealProposal(v0 market0.DealProposal) (DealProposal, error) {
label, err := labelFromGoString(v0.Label)
+
if err != nil {
return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
}
@@ -292,3 +304,26 @@ func (r *publishStorageDealsReturn0) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn0) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state0) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state0) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v10.go b/chain/actors/builtin/market/v10.go
new file mode 100644
index 000000000..21acf15ac
--- /dev/null
+++ b/chain/actors/builtin/market/v10.go
@@ -0,0 +1,376 @@
+package market
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-bitfield"
+ rlepluslazy "github.com/filecoin-project/go-bitfield/rle"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/builtin"
+ market10 "github.com/filecoin-project/go-state-types/builtin/v10/market"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store) (State, error) {
+ out := state10{store: store}
+
+ s, err := market10.ConstructState(store)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state10 struct {
+ market10.State
+ store adt.Store
+}
+
+func (s *state10) TotalLocked() (abi.TokenAmount, error) {
+ fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral)
+ fml = types.BigAdd(fml, s.TotalClientStorageFee)
+ return fml, nil
+}
+
+func (s *state10) BalancesChanged(otherState State) (bool, error) {
+ otherState10, ok := otherState.(*state10)
+ if !ok {
+ // there's no way to compare different versions of the state, so let's
+ // just say that means the state of balances has changed
+ return true, nil
+ }
+ return !s.State.EscrowTable.Equals(otherState10.State.EscrowTable) || !s.State.LockedTable.Equals(otherState10.State.LockedTable), nil
+}
+
+func (s *state10) StatesChanged(otherState State) (bool, error) {
+ otherState10, ok := otherState.(*state10)
+ if !ok {
+ // there's no way to compare different versions of the state, so let's
+ // just say that means the state of balances has changed
+ return true, nil
+ }
+ return !s.State.States.Equals(otherState10.State.States), nil
+}
+
+func (s *state10) States() (DealStates, error) {
+ stateArray, err := adt10.AsArray(s.store, s.State.States, market10.StatesAmtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+ return &dealStates10{stateArray}, nil
+}
+
+func (s *state10) ProposalsChanged(otherState State) (bool, error) {
+ otherState10, ok := otherState.(*state10)
+ if !ok {
+ // there's no way to compare different versions of the state, so let's
+ // just say that means the state of balances has changed
+ return true, nil
+ }
+ return !s.State.Proposals.Equals(otherState10.State.Proposals), nil
+}
+
+func (s *state10) Proposals() (DealProposals, error) {
+ proposalArray, err := adt10.AsArray(s.store, s.State.Proposals, market10.ProposalsAmtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+ return &dealProposals10{proposalArray}, nil
+}
+
+func (s *state10) EscrowTable() (BalanceTable, error) {
+ bt, err := adt10.AsBalanceTable(s.store, s.State.EscrowTable)
+ if err != nil {
+ return nil, err
+ }
+ return &balanceTable10{bt}, nil
+}
+
+func (s *state10) LockedTable() (BalanceTable, error) {
+ bt, err := adt10.AsBalanceTable(s.store, s.State.LockedTable)
+ if err != nil {
+ return nil, err
+ }
+ return &balanceTable10{bt}, nil
+}
+
+func (s *state10) VerifyDealsForActivation(
+ minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch,
+) (weight, verifiedWeight abi.DealWeight, err error) {
+ w, vw, _, err := market10.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch)
+ return w, vw, err
+}
+
+func (s *state10) NextID() (abi.DealID, error) {
+ return s.State.NextID, nil
+}
+
+type balanceTable10 struct {
+ *adt10.BalanceTable
+}
+
+func (bt *balanceTable10) ForEach(cb func(address.Address, abi.TokenAmount) error) error {
+ asMap := (*adt10.Map)(bt.BalanceTable)
+ var ta abi.TokenAmount
+ return asMap.ForEach(&ta, func(key string) error {
+ a, err := address.NewFromBytes([]byte(key))
+ if err != nil {
+ return err
+ }
+ return cb(a, ta)
+ })
+}
+
+type dealStates10 struct {
+ adt.Array
+}
+
+func (s *dealStates10) Get(dealID abi.DealID) (*DealState, bool, error) {
+ var deal10 market10.DealState
+ found, err := s.Array.Get(uint64(dealID), &deal10)
+ if err != nil {
+ return nil, false, err
+ }
+ if !found {
+ return nil, false, nil
+ }
+ deal := fromV10DealState(deal10)
+ return &deal, true, nil
+}
+
+func (s *dealStates10) ForEach(cb func(dealID abi.DealID, ds DealState) error) error {
+ var ds10 market10.DealState
+ return s.Array.ForEach(&ds10, func(idx int64) error {
+ return cb(abi.DealID(idx), fromV10DealState(ds10))
+ })
+}
+
+func (s *dealStates10) decode(val *cbg.Deferred) (*DealState, error) {
+ var ds10 market10.DealState
+ if err := ds10.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return nil, err
+ }
+ ds := fromV10DealState(ds10)
+ return &ds, nil
+}
+
+func (s *dealStates10) array() adt.Array {
+ return s.Array
+}
+
+func fromV10DealState(v10 market10.DealState) DealState {
+ ret := DealState{
+ SectorStartEpoch: v10.SectorStartEpoch,
+ LastUpdatedEpoch: v10.LastUpdatedEpoch,
+ SlashEpoch: v10.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ ret.VerifiedClaim = verifregtypes.AllocationId(v10.VerifiedClaim)
+
+ return ret
+}
+
+type dealProposals10 struct {
+ adt.Array
+}
+
+func (s *dealProposals10) Get(dealID abi.DealID) (*DealProposal, bool, error) {
+ var proposal10 market10.DealProposal
+ found, err := s.Array.Get(uint64(dealID), &proposal10)
+ if err != nil {
+ return nil, false, err
+ }
+ if !found {
+ return nil, false, nil
+ }
+
+ proposal, err := fromV10DealProposal(proposal10)
+ if err != nil {
+ return nil, true, xerrors.Errorf("decoding proposal: %w", err)
+ }
+
+ return &proposal, true, nil
+}
+
+func (s *dealProposals10) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error {
+ var dp10 market10.DealProposal
+ return s.Array.ForEach(&dp10, func(idx int64) error {
+ dp, err := fromV10DealProposal(dp10)
+ if err != nil {
+ return xerrors.Errorf("decoding proposal: %w", err)
+ }
+
+ return cb(abi.DealID(idx), dp)
+ })
+}
+
+func (s *dealProposals10) decode(val *cbg.Deferred) (*DealProposal, error) {
+ var dp10 market10.DealProposal
+ if err := dp10.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return nil, err
+ }
+
+ dp, err := fromV10DealProposal(dp10)
+ if err != nil {
+ return nil, err
+ }
+
+ return &dp, nil
+}
+
+func (s *dealProposals10) array() adt.Array {
+ return s.Array
+}
+
+func fromV10DealProposal(v10 market10.DealProposal) (DealProposal, error) {
+
+ label, err := fromV10Label(v10.Label)
+
+ if err != nil {
+ return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
+ }
+
+ return DealProposal{
+ PieceCID: v10.PieceCID,
+ PieceSize: v10.PieceSize,
+ VerifiedDeal: v10.VerifiedDeal,
+ Client: v10.Client,
+ Provider: v10.Provider,
+
+ Label: label,
+
+ StartEpoch: v10.StartEpoch,
+ EndEpoch: v10.EndEpoch,
+ StoragePricePerEpoch: v10.StoragePricePerEpoch,
+
+ ProviderCollateral: v10.ProviderCollateral,
+ ClientCollateral: v10.ClientCollateral,
+ }, nil
+}
+
+func fromV10Label(v10 market10.DealLabel) (DealLabel, error) {
+ if v10.IsString() {
+ str, err := v10.ToString()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert string label to string: %w", err)
+ }
+ return markettypes.NewLabelFromString(str)
+ }
+
+ bs, err := v10.ToBytes()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert bytes label to bytes: %w", err)
+ }
+ return markettypes.NewLabelFromBytes(bs)
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+var _ PublishStorageDealsReturn = (*publishStorageDealsReturn10)(nil)
+
+func decodePublishStorageDealsReturn10(b []byte) (PublishStorageDealsReturn, error) {
+ var retval market10.PublishStorageDealsReturn
+ if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil {
+ return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err)
+ }
+
+ return &publishStorageDealsReturn10{retval}, nil
+}
+
+type publishStorageDealsReturn10 struct {
+ market10.PublishStorageDealsReturn
+}
+
+func (r *publishStorageDealsReturn10) IsDealValid(index uint64) (bool, int, error) {
+
+ set, err := r.ValidDeals.IsSet(index)
+ if err != nil || !set {
+ return false, -1, err
+ }
+ maskBf, err := bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{
+ Runs: []rlepluslazy.Run{rlepluslazy.Run{Val: true, Len: index}}})
+ if err != nil {
+ return false, -1, err
+ }
+ before, err := bitfield.IntersectBitField(maskBf, r.ValidDeals)
+ if err != nil {
+ return false, -1, err
+ }
+ outIdx, err := before.Count()
+ if err != nil {
+ return false, -1, err
+ }
+ return set, int(outIdx), nil
+
+}
+
+func (r *publishStorageDealsReturn10) DealIDs() ([]abi.DealID, error) {
+ return r.IDs, nil
+}
+
+func (s *state10) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ allocations, err := adt10.AsMap(s.store, s.PendingDealAllocationIds, builtin.DefaultHamtBitwidth)
+ if err != nil {
+ return verifregtypes.NoAllocationID, xerrors.Errorf("failed to load allocation id for %d: %w", dealId, err)
+ }
+
+ var allocationId cbg.CborInt
+ found, err := allocations.Get(abi.UIntKey(uint64(dealId)), &allocationId)
+ if err != nil {
+ return verifregtypes.NoAllocationID, xerrors.Errorf("failed to load allocation id for %d: %w", dealId, err)
+ }
+ if !found {
+ return verifregtypes.NoAllocationID, nil
+ }
+
+ return verifregtypes.AllocationId(allocationId), nil
+
+}
+
+func (s *state10) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v2.go b/chain/actors/builtin/market/v2.go
index 5a399e68c..45a357f33 100644
--- a/chain/actors/builtin/market/v2.go
+++ b/chain/actors/builtin/market/v2.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -9,9 +10,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market"
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -183,7 +187,14 @@ func (s *dealStates2) array() adt.Array {
}
func fromV2DealState(v2 market2.DealState) DealState {
- return (DealState)(v2)
+ ret := DealState{
+ SectorStartEpoch: v2.SectorStartEpoch,
+ LastUpdatedEpoch: v2.LastUpdatedEpoch,
+ SlashEpoch: v2.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals2 struct {
@@ -241,6 +252,7 @@ func (s *dealProposals2) array() adt.Array {
func fromV2DealProposal(v2 market2.DealProposal) (DealProposal, error) {
label, err := labelFromGoString(v2.Label)
+
if err != nil {
return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
}
@@ -292,3 +304,26 @@ func (r *publishStorageDealsReturn2) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn2) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state2) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state2) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v3.go b/chain/actors/builtin/market/v3.go
index a953429fc..ec745f5a0 100644
--- a/chain/actors/builtin/market/v3.go
+++ b/chain/actors/builtin/market/v3.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -9,9 +10,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
market3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/market"
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -178,7 +182,14 @@ func (s *dealStates3) array() adt.Array {
}
func fromV3DealState(v3 market3.DealState) DealState {
- return (DealState)(v3)
+ ret := DealState{
+ SectorStartEpoch: v3.SectorStartEpoch,
+ LastUpdatedEpoch: v3.LastUpdatedEpoch,
+ SlashEpoch: v3.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals3 struct {
@@ -236,6 +247,7 @@ func (s *dealProposals3) array() adt.Array {
func fromV3DealProposal(v3 market3.DealProposal) (DealProposal, error) {
label, err := labelFromGoString(v3.Label)
+
if err != nil {
return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
}
@@ -287,3 +299,26 @@ func (r *publishStorageDealsReturn3) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn3) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state3) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state3) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v4.go b/chain/actors/builtin/market/v4.go
index 8e6b3cd34..03e728c15 100644
--- a/chain/actors/builtin/market/v4.go
+++ b/chain/actors/builtin/market/v4.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -9,9 +10,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market"
adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -178,7 +182,14 @@ func (s *dealStates4) array() adt.Array {
}
func fromV4DealState(v4 market4.DealState) DealState {
- return (DealState)(v4)
+ ret := DealState{
+ SectorStartEpoch: v4.SectorStartEpoch,
+ LastUpdatedEpoch: v4.LastUpdatedEpoch,
+ SlashEpoch: v4.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals4 struct {
@@ -236,6 +247,7 @@ func (s *dealProposals4) array() adt.Array {
func fromV4DealProposal(v4 market4.DealProposal) (DealProposal, error) {
label, err := labelFromGoString(v4.Label)
+
if err != nil {
return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
}
@@ -287,3 +299,26 @@ func (r *publishStorageDealsReturn4) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn4) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state4) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state4) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v5.go b/chain/actors/builtin/market/v5.go
index 5cf904e04..98d498258 100644
--- a/chain/actors/builtin/market/v5.go
+++ b/chain/actors/builtin/market/v5.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -9,9 +10,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
market5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/market"
adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -178,7 +182,14 @@ func (s *dealStates5) array() adt.Array {
}
func fromV5DealState(v5 market5.DealState) DealState {
- return (DealState)(v5)
+ ret := DealState{
+ SectorStartEpoch: v5.SectorStartEpoch,
+ LastUpdatedEpoch: v5.LastUpdatedEpoch,
+ SlashEpoch: v5.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals5 struct {
@@ -236,6 +247,7 @@ func (s *dealProposals5) array() adt.Array {
func fromV5DealProposal(v5 market5.DealProposal) (DealProposal, error) {
label, err := labelFromGoString(v5.Label)
+
if err != nil {
return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
}
@@ -287,3 +299,26 @@ func (r *publishStorageDealsReturn5) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn5) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state5) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state5) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v6.go b/chain/actors/builtin/market/v6.go
index 03862ac09..5966f2f8b 100644
--- a/chain/actors/builtin/market/v6.go
+++ b/chain/actors/builtin/market/v6.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,9 +12,12 @@ import (
"github.com/filecoin-project/go-bitfield"
rlepluslazy "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
market6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/market"
adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -180,7 +184,14 @@ func (s *dealStates6) array() adt.Array {
}
func fromV6DealState(v6 market6.DealState) DealState {
- return (DealState)(v6)
+ ret := DealState{
+ SectorStartEpoch: v6.SectorStartEpoch,
+ LastUpdatedEpoch: v6.LastUpdatedEpoch,
+ SlashEpoch: v6.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals6 struct {
@@ -238,6 +249,7 @@ func (s *dealProposals6) array() adt.Array {
func fromV6DealProposal(v6 market6.DealProposal) (DealProposal, error) {
label, err := labelFromGoString(v6.Label)
+
if err != nil {
return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
}
@@ -305,3 +317,26 @@ func (r *publishStorageDealsReturn6) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn6) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state6) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state6) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go
index 2c2664110..df910cd4a 100644
--- a/chain/actors/builtin/market/v7.go
+++ b/chain/actors/builtin/market/v7.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,9 +12,12 @@ import (
"github.com/filecoin-project/go-bitfield"
rlepluslazy "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market"
adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -180,7 +184,14 @@ func (s *dealStates7) array() adt.Array {
}
func fromV7DealState(v7 market7.DealState) DealState {
- return (DealState)(v7)
+ ret := DealState{
+ SectorStartEpoch: v7.SectorStartEpoch,
+ LastUpdatedEpoch: v7.LastUpdatedEpoch,
+ SlashEpoch: v7.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals7 struct {
@@ -238,6 +249,7 @@ func (s *dealProposals7) array() adt.Array {
func fromV7DealProposal(v7 market7.DealProposal) (DealProposal, error) {
label, err := labelFromGoString(v7.Label)
+
if err != nil {
return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
}
@@ -305,3 +317,26 @@ func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state7) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state7) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v8.go b/chain/actors/builtin/market/v8.go
index 8afbf39de..1c0bfd3c5 100644
--- a/chain/actors/builtin/market/v8.go
+++ b/chain/actors/builtin/market/v8.go
@@ -2,6 +2,7 @@ package market
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,9 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rlepluslazy "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -180,7 +185,14 @@ func (s *dealStates8) array() adt.Array {
}
func fromV8DealState(v8 market8.DealState) DealState {
- return (DealState)(v8)
+ ret := DealState{
+ SectorStartEpoch: v8.SectorStartEpoch,
+ LastUpdatedEpoch: v8.LastUpdatedEpoch,
+ SlashEpoch: v8.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ return ret
}
type dealProposals8 struct {
@@ -237,7 +249,11 @@ func (s *dealProposals8) array() adt.Array {
func fromV8DealProposal(v8 market8.DealProposal) (DealProposal, error) {
- label := v8.Label
+ label, err := fromV8Label(v8.Label)
+
+ if err != nil {
+ return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
+ }
return DealProposal{
PieceCID: v8.PieceCID,
@@ -257,6 +273,22 @@ func fromV8DealProposal(v8 market8.DealProposal) (DealProposal, error) {
}, nil
}
+func fromV8Label(v8 market8.DealLabel) (DealLabel, error) {
+ if v8.IsString() {
+ str, err := v8.ToString()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert string label to string: %w", err)
+ }
+ return markettypes.NewLabelFromString(str)
+ }
+
+ bs, err := v8.ToBytes()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert bytes label to bytes: %w", err)
+ }
+ return markettypes.NewLabelFromBytes(bs)
+}
+
func (s *state8) GetState() interface{} {
return &s.State
}
@@ -302,3 +334,26 @@ func (r *publishStorageDealsReturn8) IsDealValid(index uint64) (bool, int, error
func (r *publishStorageDealsReturn8) DealIDs() ([]abi.DealID, error) {
return r.IDs, nil
}
+
+func (s *state8) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ return verifregtypes.NoAllocationID, xerrors.Errorf("unsupported before actors v9")
+
+}
+
+func (s *state8) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/market/v9.go b/chain/actors/builtin/market/v9.go
new file mode 100644
index 000000000..9335a235a
--- /dev/null
+++ b/chain/actors/builtin/market/v9.go
@@ -0,0 +1,376 @@
+package market
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-bitfield"
+ rlepluslazy "github.com/filecoin-project/go-bitfield/rle"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/builtin"
+ market9 "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store) (State, error) {
+ out := state9{store: store}
+
+ s, err := market9.ConstructState(store)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state9 struct {
+ market9.State
+ store adt.Store
+}
+
+func (s *state9) TotalLocked() (abi.TokenAmount, error) {
+ fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral)
+ fml = types.BigAdd(fml, s.TotalClientStorageFee)
+ return fml, nil
+}
+
+func (s *state9) BalancesChanged(otherState State) (bool, error) {
+ otherState9, ok := otherState.(*state9)
+ if !ok {
+ // there's no way to compare different versions of the state, so let's
+ // just say that means the state of balances has changed
+ return true, nil
+ }
+ return !s.State.EscrowTable.Equals(otherState9.State.EscrowTable) || !s.State.LockedTable.Equals(otherState9.State.LockedTable), nil
+}
+
+func (s *state9) StatesChanged(otherState State) (bool, error) {
+ otherState9, ok := otherState.(*state9)
+ if !ok {
+ // there's no way to compare different versions of the state, so let's
+ // just say that means the state of balances has changed
+ return true, nil
+ }
+ return !s.State.States.Equals(otherState9.State.States), nil
+}
+
+func (s *state9) States() (DealStates, error) {
+ stateArray, err := adt9.AsArray(s.store, s.State.States, market9.StatesAmtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+ return &dealStates9{stateArray}, nil
+}
+
+func (s *state9) ProposalsChanged(otherState State) (bool, error) {
+ otherState9, ok := otherState.(*state9)
+ if !ok {
+ // there's no way to compare different versions of the state, so let's
+ // just say that means the state of balances has changed
+ return true, nil
+ }
+ return !s.State.Proposals.Equals(otherState9.State.Proposals), nil
+}
+
+func (s *state9) Proposals() (DealProposals, error) {
+ proposalArray, err := adt9.AsArray(s.store, s.State.Proposals, market9.ProposalsAmtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+ return &dealProposals9{proposalArray}, nil
+}
+
+func (s *state9) EscrowTable() (BalanceTable, error) {
+ bt, err := adt9.AsBalanceTable(s.store, s.State.EscrowTable)
+ if err != nil {
+ return nil, err
+ }
+ return &balanceTable9{bt}, nil
+}
+
+func (s *state9) LockedTable() (BalanceTable, error) {
+ bt, err := adt9.AsBalanceTable(s.store, s.State.LockedTable)
+ if err != nil {
+ return nil, err
+ }
+ return &balanceTable9{bt}, nil
+}
+
+func (s *state9) VerifyDealsForActivation(
+ minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch,
+) (weight, verifiedWeight abi.DealWeight, err error) {
+ w, vw, _, err := market9.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch)
+ return w, vw, err
+}
+
+func (s *state9) NextID() (abi.DealID, error) {
+ return s.State.NextID, nil
+}
+
+type balanceTable9 struct {
+ *adt9.BalanceTable
+}
+
+func (bt *balanceTable9) ForEach(cb func(address.Address, abi.TokenAmount) error) error {
+ asMap := (*adt9.Map)(bt.BalanceTable)
+ var ta abi.TokenAmount
+ return asMap.ForEach(&ta, func(key string) error {
+ a, err := address.NewFromBytes([]byte(key))
+ if err != nil {
+ return err
+ }
+ return cb(a, ta)
+ })
+}
+
+type dealStates9 struct {
+ adt.Array
+}
+
+func (s *dealStates9) Get(dealID abi.DealID) (*DealState, bool, error) {
+ var deal9 market9.DealState
+ found, err := s.Array.Get(uint64(dealID), &deal9)
+ if err != nil {
+ return nil, false, err
+ }
+ if !found {
+ return nil, false, nil
+ }
+ deal := fromV9DealState(deal9)
+ return &deal, true, nil
+}
+
+func (s *dealStates9) ForEach(cb func(dealID abi.DealID, ds DealState) error) error {
+ var ds9 market9.DealState
+ return s.Array.ForEach(&ds9, func(idx int64) error {
+ return cb(abi.DealID(idx), fromV9DealState(ds9))
+ })
+}
+
+func (s *dealStates9) decode(val *cbg.Deferred) (*DealState, error) {
+ var ds9 market9.DealState
+ if err := ds9.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return nil, err
+ }
+ ds := fromV9DealState(ds9)
+ return &ds, nil
+}
+
+func (s *dealStates9) array() adt.Array {
+ return s.Array
+}
+
+func fromV9DealState(v9 market9.DealState) DealState {
+ ret := DealState{
+ SectorStartEpoch: v9.SectorStartEpoch,
+ LastUpdatedEpoch: v9.LastUpdatedEpoch,
+ SlashEpoch: v9.SlashEpoch,
+ VerifiedClaim: 0,
+ }
+
+ ret.VerifiedClaim = verifregtypes.AllocationId(v9.VerifiedClaim)
+
+ return ret
+}
+
+type dealProposals9 struct {
+ adt.Array
+}
+
+func (s *dealProposals9) Get(dealID abi.DealID) (*DealProposal, bool, error) {
+ var proposal9 market9.DealProposal
+ found, err := s.Array.Get(uint64(dealID), &proposal9)
+ if err != nil {
+ return nil, false, err
+ }
+ if !found {
+ return nil, false, nil
+ }
+
+ proposal, err := fromV9DealProposal(proposal9)
+ if err != nil {
+ return nil, true, xerrors.Errorf("decoding proposal: %w", err)
+ }
+
+ return &proposal, true, nil
+}
+
+func (s *dealProposals9) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error {
+ var dp9 market9.DealProposal
+ return s.Array.ForEach(&dp9, func(idx int64) error {
+ dp, err := fromV9DealProposal(dp9)
+ if err != nil {
+ return xerrors.Errorf("decoding proposal: %w", err)
+ }
+
+ return cb(abi.DealID(idx), dp)
+ })
+}
+
+func (s *dealProposals9) decode(val *cbg.Deferred) (*DealProposal, error) {
+ var dp9 market9.DealProposal
+ if err := dp9.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return nil, err
+ }
+
+ dp, err := fromV9DealProposal(dp9)
+ if err != nil {
+ return nil, err
+ }
+
+ return &dp, nil
+}
+
+func (s *dealProposals9) array() adt.Array {
+ return s.Array
+}
+
+func fromV9DealProposal(v9 market9.DealProposal) (DealProposal, error) {
+
+ label, err := fromV9Label(v9.Label)
+
+ if err != nil {
+ return DealProposal{}, xerrors.Errorf("error setting deal label: %w", err)
+ }
+
+ return DealProposal{
+ PieceCID: v9.PieceCID,
+ PieceSize: v9.PieceSize,
+ VerifiedDeal: v9.VerifiedDeal,
+ Client: v9.Client,
+ Provider: v9.Provider,
+
+ Label: label,
+
+ StartEpoch: v9.StartEpoch,
+ EndEpoch: v9.EndEpoch,
+ StoragePricePerEpoch: v9.StoragePricePerEpoch,
+
+ ProviderCollateral: v9.ProviderCollateral,
+ ClientCollateral: v9.ClientCollateral,
+ }, nil
+}
+
+func fromV9Label(v9 market9.DealLabel) (DealLabel, error) {
+ if v9.IsString() {
+ str, err := v9.ToString()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert string label to string: %w", err)
+ }
+ return markettypes.NewLabelFromString(str)
+ }
+
+ bs, err := v9.ToBytes()
+ if err != nil {
+ return markettypes.EmptyDealLabel, xerrors.Errorf("failed to convert bytes label to bytes: %w", err)
+ }
+ return markettypes.NewLabelFromBytes(bs)
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+var _ PublishStorageDealsReturn = (*publishStorageDealsReturn9)(nil)
+
+func decodePublishStorageDealsReturn9(b []byte) (PublishStorageDealsReturn, error) {
+ var retval market9.PublishStorageDealsReturn
+ if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil {
+ return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err)
+ }
+
+ return &publishStorageDealsReturn9{retval}, nil
+}
+
+type publishStorageDealsReturn9 struct {
+ market9.PublishStorageDealsReturn
+}
+
+func (r *publishStorageDealsReturn9) IsDealValid(index uint64) (bool, int, error) {
+
+ set, err := r.ValidDeals.IsSet(index)
+ if err != nil || !set {
+ return false, -1, err
+ }
+ maskBf, err := bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{
+ Runs: []rlepluslazy.Run{rlepluslazy.Run{Val: true, Len: index}}})
+ if err != nil {
+ return false, -1, err
+ }
+ before, err := bitfield.IntersectBitField(maskBf, r.ValidDeals)
+ if err != nil {
+ return false, -1, err
+ }
+ outIdx, err := before.Count()
+ if err != nil {
+ return false, -1, err
+ }
+ return set, int(outIdx), nil
+
+}
+
+func (r *publishStorageDealsReturn9) DealIDs() ([]abi.DealID, error) {
+ return r.IDs, nil
+}
+
+func (s *state9) GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error) {
+
+ allocations, err := adt9.AsMap(s.store, s.PendingDealAllocationIds, builtin.DefaultHamtBitwidth)
+ if err != nil {
+ return verifregtypes.NoAllocationID, xerrors.Errorf("failed to load allocation id for %d: %w", dealId, err)
+ }
+
+ var allocationId cbg.CborInt
+ found, err := allocations.Get(abi.UIntKey(uint64(dealId)), &allocationId)
+ if err != nil {
+ return verifregtypes.NoAllocationID, xerrors.Errorf("failed to load allocation id for %d: %w", dealId, err)
+ }
+ if !found {
+ return verifregtypes.NoAllocationID, nil
+ }
+
+ return verifregtypes.AllocationId(allocationId), nil
+
+}
+
+func (s *state9) ActorKey() string {
+ return actors.MarketKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template
index 731af6255..069b74d31 100644
--- a/chain/actors/builtin/miner/actor.go.template
+++ b/chain/actors/builtin/miner/actor.go.template
@@ -1,6 +1,8 @@
package miner
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/chain/actors"
@@ -15,7 +17,7 @@ import (
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
- miner{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin{{import .latestVersion}}miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
{{range .versions}}
{{if (le . 7)}}
@@ -33,7 +35,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -65,6 +67,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) {
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
// Total available balance to spend.
AvailableBalance(abi.TokenAmount) (abi.TokenAmount, error)
// Funds that will vest by the given epoch.
@@ -73,11 +79,12 @@ type State interface {
LockedFunds() (LockedFunds, error)
FeeDebt() (abi.TokenAmount, error)
+ // Returns nil, nil if sector is not found
GetSector(abi.SectorNumber) (*SectorOnChainInfo, error)
FindSector(abi.SectorNumber) (*SectorLocation, error)
GetSectorExpiration(abi.SectorNumber) (*SectorExpiration, error)
- GetPrecommittedSector(abi.SectorNumber) (*miner{{.latestVersion}}.SectorPreCommitOnChainInfo, error)
- ForEachPrecommittedSector(func(miner{{.latestVersion}}.SectorPreCommitOnChainInfo) error) error
+ GetPrecommittedSector(abi.SectorNumber) (*SectorPreCommitOnChainInfo, error)
+ ForEachPrecommittedSector(func(SectorPreCommitOnChainInfo) error) error
LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error)
NumLiveSectors() (uint64, error)
IsAllocated(abi.SectorNumber) (bool, error)
@@ -106,7 +113,7 @@ type State interface {
sectors() (adt.Array, error)
decodeSectorOnChainInfo(*cbg.Deferred) (SectorOnChainInfo, error)
precommits() (adt.Map, error)
- decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (miner{{.latestVersion}}.SectorPreCommitOnChainInfo, error)
+ decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (SectorPreCommitOnChainInfo, error)
GetState() interface{}
}
@@ -144,7 +151,7 @@ type Partition interface {
UnprovenSectors() (bitfield.BitField, error)
}
-type SectorOnChainInfo = miner{{.latestVersion}}.SectorOnChainInfo
+type SectorOnChainInfo = minertypes.SectorOnChainInfo
func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) {
// We added support for the new proofs in network version 7, and removed support for the old
@@ -199,8 +206,12 @@ func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi
}
}
-type MinerInfo = miner{{.latestVersion}}.MinerInfo
-type WorkerKeyChange = miner{{.latestVersion}}.WorkerKeyChange
+type MinerInfo = minertypes.MinerInfo
+type BeneficiaryTerm = minertypes.BeneficiaryTerm
+type PendingBeneficiaryChange = minertypes.PendingBeneficiaryChange
+type WorkerKeyChange = minertypes.WorkerKeyChange
+type SectorPreCommitOnChainInfo = minertypes.SectorPreCommitOnChainInfo
+type SectorPreCommitInfo = minertypes.SectorPreCommitInfo
type WindowPostVerifyInfo = proof.WindowPoStVerifyInfo
type SectorExpiration struct {
@@ -228,8 +239,8 @@ type SectorExtensions struct {
}
type PreCommitChanges struct {
- Added []miner{{.latestVersion}}.SectorPreCommitOnChainInfo
- Removed []miner{{.latestVersion}}.SectorPreCommitOnChainInfo
+ Added []SectorPreCommitOnChainInfo
+ Removed []SectorPreCommitOnChainInfo
}
type LockedFunds struct {
@@ -241,3 +252,10 @@ type LockedFunds struct {
func (lf LockedFunds) TotalLockedFunds() abi.TokenAmount {
return big.Add(lf.VestingFunds, big.Add(lf.InitialPledgeRequirement, lf.PreCommitDeposits))
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go
index 820be35a4..4f93ff6a9 100644
--- a/chain/actors/builtin/miner/miner.go
+++ b/chain/actors/builtin/miner/miner.go
@@ -1,13 +1,15 @@
package miner
import (
+ "github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
- miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/go-state-types/network"
@@ -33,9 +35,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -94,6 +102,12 @@ func MakeState(store adt.Store, av actors.Version) (State, error) {
case actors.Version8:
return make8(store)
+ case actors.Version9:
+ return make9(store)
+
+ case actors.Version10:
+ return make10(store)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
@@ -101,6 +115,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) {
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
// Total available balance to spend.
AvailableBalance(abi.TokenAmount) (abi.TokenAmount, error)
// Funds that will vest by the given epoch.
@@ -109,11 +127,12 @@ type State interface {
LockedFunds() (LockedFunds, error)
FeeDebt() (abi.TokenAmount, error)
+ // Returns nil, nil if sector is not found
GetSector(abi.SectorNumber) (*SectorOnChainInfo, error)
FindSector(abi.SectorNumber) (*SectorLocation, error)
GetSectorExpiration(abi.SectorNumber) (*SectorExpiration, error)
- GetPrecommittedSector(abi.SectorNumber) (*miner8.SectorPreCommitOnChainInfo, error)
- ForEachPrecommittedSector(func(miner8.SectorPreCommitOnChainInfo) error) error
+ GetPrecommittedSector(abi.SectorNumber) (*SectorPreCommitOnChainInfo, error)
+ ForEachPrecommittedSector(func(SectorPreCommitOnChainInfo) error) error
LoadSectors(sectorNos *bitfield.BitField) ([]*SectorOnChainInfo, error)
NumLiveSectors() (uint64, error)
IsAllocated(abi.SectorNumber) (bool, error)
@@ -142,7 +161,7 @@ type State interface {
sectors() (adt.Array, error)
decodeSectorOnChainInfo(*cbg.Deferred) (SectorOnChainInfo, error)
precommits() (adt.Map, error)
- decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (miner8.SectorPreCommitOnChainInfo, error)
+ decodeSectorPreCommitOnChainInfo(*cbg.Deferred) (SectorPreCommitOnChainInfo, error)
GetState() interface{}
}
@@ -180,7 +199,7 @@ type Partition interface {
UnprovenSectors() (bitfield.BitField, error)
}
-type SectorOnChainInfo = miner8.SectorOnChainInfo
+type SectorOnChainInfo = minertypes.SectorOnChainInfo
func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) {
// We added support for the new proofs in network version 7, and removed support for the old
@@ -235,8 +254,12 @@ func WinningPoStProofTypeFromWindowPoStProofType(nver network.Version, proof abi
}
}
-type MinerInfo = miner8.MinerInfo
-type WorkerKeyChange = miner8.WorkerKeyChange
+type MinerInfo = minertypes.MinerInfo
+type BeneficiaryTerm = minertypes.BeneficiaryTerm
+type PendingBeneficiaryChange = minertypes.PendingBeneficiaryChange
+type WorkerKeyChange = minertypes.WorkerKeyChange
+type SectorPreCommitOnChainInfo = minertypes.SectorPreCommitOnChainInfo
+type SectorPreCommitInfo = minertypes.SectorPreCommitInfo
type WindowPostVerifyInfo = proof.WindowPoStVerifyInfo
type SectorExpiration struct {
@@ -264,8 +287,8 @@ type SectorExtensions struct {
}
type PreCommitChanges struct {
- Added []miner8.SectorPreCommitOnChainInfo
- Removed []miner8.SectorPreCommitOnChainInfo
+ Added []SectorPreCommitOnChainInfo
+ Removed []SectorPreCommitOnChainInfo
}
type LockedFunds struct {
@@ -277,3 +300,18 @@ type LockedFunds struct {
func (lf LockedFunds) TotalLockedFunds() abi.TokenAmount {
return big.Add(lf.VestingFunds, big.Add(lf.InitialPledgeRequirement, lf.PreCommitDeposits))
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/miner/state.go.template b/chain/actors/builtin/miner/state.go.template
index 53c4b446a..5ba5f5463 100644
--- a/chain/actors/builtin/miner/state.go.template
+++ b/chain/actors/builtin/miner/state.go.template
@@ -1,6 +1,7 @@
package miner
import (
+ "fmt"
"bytes"
"errors"
{{if (le .v 1)}}
@@ -15,7 +16,8 @@ import (
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/chain/actors/adt"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/lotus/chain/actors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
{{if (le .v 7)}}
{{if (ge .v 3)}}
@@ -98,6 +100,7 @@ func (s *state{{.v}}) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state{{.v}}) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -215,7 +218,7 @@ func (s *state{{.v}}) GetSectorExpiration(num abi.SectorNumber) (*SectorExpirati
return &out, nil
}
-func (s *state{{.v}}) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state{{.v}}) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -226,7 +229,7 @@ func (s *state{{.v}}) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.S
return &ret, nil
}
-func (s *state{{.v}}) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state{{.v}}) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
{{if (ge .v 3) -}}
precommitted, err := adt{{.v}}.AsMap(s.store, s.State.PreCommittedSectors, builtin{{.v}}.DefaultHamtBitwidth)
{{- else -}}
@@ -413,6 +416,11 @@ func (s *state{{.v}}) Info() (MinerInfo, error) {
SectorSize: info.SectorSize,
WindowPoStPartitionSectors: info.WindowPoStPartitionSectors,
ConsensusFaultElapsed: {{if (ge .v 2)}}info.ConsensusFaultElapsed{{else}}-1{{end}},
+ {{if (ge .v 9)}}
+ Beneficiary: info.Beneficiary,
+ BeneficiaryTerm: BeneficiaryTerm(info.BeneficiaryTerm),
+ PendingBeneficiaryTerm: (*PendingBeneficiaryChange)(info.PendingBeneficiaryTerm),
+ {{end}}
}
return mi, nil
@@ -444,11 +452,11 @@ func (s *state{{.v}}) precommits() (adt.Map, error) {
return adt{{.v}}.AsMap(s.store, s.PreCommittedSectors{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}})
}
-func (s *state{{.v}}) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state{{.v}}) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner{{.v}}.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV{{.v}}SectorPreCommitOnChainInfo(sp), nil
@@ -579,16 +587,45 @@ func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorO
return info
}
-func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v{{.v}}.Info),
+func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v{{.v}}.Info.SealProof,
+ SectorNumber: v{{.v}}.Info.SectorNumber,
+ SealedCID: v{{.v}}.Info.SealedCID,
+ SealRandEpoch: v{{.v}}.Info.SealRandEpoch,
+ DealIDs: v{{.v}}.Info.DealIDs,
+ Expiration: v{{.v}}.Info.Expiration,
+ UnsealedCid: nil,
+ },
PreCommitDeposit: v{{.v}}.PreCommitDeposit,
PreCommitEpoch: v{{.v}}.PreCommitEpoch,
- DealWeight: v{{.v}}.DealWeight,
- VerifiedDealWeight: v{{.v}}.VerifiedDealWeight,
}
+
+ {{if (ge .v 9)}}
+ ret.Info.UnsealedCid = v{{.v}}.Info.UnsealedCid
+ {{end}}
+
+ return ret
}
func (s *state{{.v}}) GetState() interface{} {
return &s.State
}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v0.go b/chain/actors/builtin/miner/v0.go
index daa0a6bfd..10903b46b 100644
--- a/chain/actors/builtin/miner/v0.go
+++ b/chain/actors/builtin/miner/v0.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,12 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/go-state-types/dline"
miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner"
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -88,6 +90,7 @@ func (s *state0) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state0) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -195,7 +198,7 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -206,7 +209,7 @@ func (s *state0) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state0) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state0) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt0.AsMap(s.store, s.State.PreCommittedSectors)
if err != nil {
return err
@@ -419,11 +422,11 @@ func (s *state0) precommits() (adt.Map, error) {
return adt0.AsMap(s.store, s.PreCommittedSectors)
}
-func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state0) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner0.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV0SectorPreCommitOnChainInfo(sp), nil
@@ -509,16 +512,41 @@ func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v0.Info),
- PreCommitDeposit: v0.PreCommitDeposit,
- PreCommitEpoch: v0.PreCommitEpoch,
- DealWeight: v0.DealWeight,
- VerifiedDealWeight: v0.VerifiedDealWeight,
+func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v0.Info.SealProof,
+ SectorNumber: v0.Info.SectorNumber,
+ SealedCID: v0.Info.SealedCID,
+ SealRandEpoch: v0.Info.SealRandEpoch,
+ DealIDs: v0.Info.DealIDs,
+ Expiration: v0.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v0.PreCommitDeposit,
+ PreCommitEpoch: v0.PreCommitEpoch,
}
+
+ return ret
}
func (s *state0) GetState() interface{} {
return &s.State
}
+
+func (s *state0) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v10.go b/chain/actors/builtin/miner/v10.go
new file mode 100644
index 000000000..d72f7124a
--- /dev/null
+++ b/chain/actors/builtin/miner/v10.go
@@ -0,0 +1,590 @@
+package miner
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-bitfield"
+ rle "github.com/filecoin-project/go-bitfield/rle"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ miner10 "github.com/filecoin-project/go-state-types/builtin/v10/miner"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+ "github.com/filecoin-project/go-state-types/dline"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store) (State, error) {
+ out := state10{store: store}
+ out.State = miner10.State{}
+ return &out, nil
+}
+
+type state10 struct {
+ miner10.State
+ store adt.Store
+}
+
+type deadline10 struct {
+ miner10.Deadline
+ store adt.Store
+}
+
+type partition10 struct {
+ miner10.Partition
+ store adt.Store
+}
+
+func (s *state10) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ err = xerrors.Errorf("failed to get available balance: %w", r)
+ available = abi.NewTokenAmount(0)
+ }
+ }()
+ // this panics if the miner doesnt have enough funds to cover their locked pledge
+ available, err = s.GetAvailableBalance(bal)
+ return available, err
+}
+
+func (s *state10) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) {
+ return s.CheckVestedFunds(s.store, epoch)
+}
+
+func (s *state10) LockedFunds() (LockedFunds, error) {
+ return LockedFunds{
+ VestingFunds: s.State.LockedFunds,
+ InitialPledgeRequirement: s.State.InitialPledge,
+ PreCommitDeposits: s.State.PreCommitDeposits,
+ }, nil
+}
+
+func (s *state10) FeeDebt() (abi.TokenAmount, error) {
+ return s.State.FeeDebt, nil
+}
+
+func (s *state10) InitialPledge() (abi.TokenAmount, error) {
+ return s.State.InitialPledge, nil
+}
+
+func (s *state10) PreCommitDeposits() (abi.TokenAmount, error) {
+ return s.State.PreCommitDeposits, nil
+}
+
+// Returns nil, nil if sector is not found
+func (s *state10) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
+ info, ok, err := s.State.GetSector(s.store, num)
+ if !ok || err != nil {
+ return nil, err
+ }
+
+ ret := fromV10SectorOnChainInfo(*info)
+ return &ret, nil
+}
+
+func (s *state10) FindSector(num abi.SectorNumber) (*SectorLocation, error) {
+ dlIdx, partIdx, err := s.State.FindSector(s.store, num)
+ if err != nil {
+ return nil, err
+ }
+ return &SectorLocation{
+ Deadline: dlIdx,
+ Partition: partIdx,
+ }, nil
+}
+
+func (s *state10) NumLiveSectors() (uint64, error) {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return 0, err
+ }
+ var total uint64
+ if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner10.Deadline) error {
+ total += dl.LiveSectors
+ return nil
+ }); err != nil {
+ return 0, err
+ }
+ return total, nil
+}
+
+// GetSectorExpiration returns the effective expiration of the given sector.
+//
+// If the sector does not expire early, the Early expiration field is 0.
+func (s *state10) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return nil, err
+ }
+ // NOTE: this can be optimized significantly.
+ // 1. If the sector is non-faulty, it will expire on-time (can be
+ // learned from the sector info).
+ // 2. If it's faulty, it will expire early within the first 42 entries
+ // of the expiration queue.
+
+ stopErr := errors.New("stop")
+ out := SectorExpiration{}
+ err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner10.Deadline) error {
+ partitions, err := dl.PartitionsArray(s.store)
+ if err != nil {
+ return err
+ }
+ quant := s.State.QuantSpecForDeadline(dlIdx)
+ var part miner10.Partition
+ return partitions.ForEach(&part, func(partIdx int64) error {
+ if found, err := part.Sectors.IsSet(uint64(num)); err != nil {
+ return err
+ } else if !found {
+ return nil
+ }
+ if found, err := part.Terminated.IsSet(uint64(num)); err != nil {
+ return err
+ } else if found {
+ // already terminated
+ return stopErr
+ }
+
+ q, err := miner10.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner10.PartitionExpirationAmtBitwidth)
+ if err != nil {
+ return err
+ }
+ var exp miner10.ExpirationSet
+ return q.ForEach(&exp, func(epoch int64) error {
+ if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil {
+ return err
+ } else if early {
+ out.Early = abi.ChainEpoch(epoch)
+ return nil
+ }
+ if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil {
+ return err
+ } else if onTime {
+ out.OnTime = abi.ChainEpoch(epoch)
+ return stopErr
+ }
+ return nil
+ })
+ })
+ })
+ if err == stopErr {
+ err = nil
+ }
+ if err != nil {
+ return nil, err
+ }
+ if out.Early == 0 && out.OnTime == 0 {
+ return nil, xerrors.Errorf("failed to find sector %d", num)
+ }
+ return &out, nil
+}
+
+func (s *state10) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
+ info, ok, err := s.State.GetPrecommittedSector(s.store, num)
+ if !ok || err != nil {
+ return nil, err
+ }
+
+ ret := fromV10SectorPreCommitOnChainInfo(*info)
+
+ return &ret, nil
+}
+
+func (s *state10) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
+ precommitted, err := adt10.AsMap(s.store, s.State.PreCommittedSectors, builtin10.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+
+ var info miner10.SectorPreCommitOnChainInfo
+ if err := precommitted.ForEach(&info, func(_ string) error {
+ return cb(fromV10SectorPreCommitOnChainInfo(info))
+ }); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *state10) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) {
+ sectors, err := miner10.LoadSectors(s.store, s.State.Sectors)
+ if err != nil {
+ return nil, err
+ }
+
+ // If no sector numbers are specified, load all.
+ if snos == nil {
+ infos := make([]*SectorOnChainInfo, 0, sectors.Length())
+ var info10 miner10.SectorOnChainInfo
+ if err := sectors.ForEach(&info10, func(_ int64) error {
+ info := fromV10SectorOnChainInfo(info10)
+ infos = append(infos, &info)
+ return nil
+ }); err != nil {
+ return nil, err
+ }
+ return infos, nil
+ }
+
+ // Otherwise, load selected.
+ infos10, err := sectors.Load(*snos)
+ if err != nil {
+ return nil, err
+ }
+ infos := make([]*SectorOnChainInfo, len(infos10))
+ for i, info10 := range infos10 {
+ info := fromV10SectorOnChainInfo(*info10)
+ infos[i] = &info
+ }
+ return infos, nil
+}
+
+func (s *state10) loadAllocatedSectorNumbers() (bitfield.BitField, error) {
+ var allocatedSectors bitfield.BitField
+ err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors)
+ return allocatedSectors, err
+}
+
+func (s *state10) IsAllocated(num abi.SectorNumber) (bool, error) {
+ allocatedSectors, err := s.loadAllocatedSectorNumbers()
+ if err != nil {
+ return false, err
+ }
+
+ return allocatedSectors.IsSet(uint64(num))
+}
+
+func (s *state10) GetProvingPeriodStart() (abi.ChainEpoch, error) {
+ return s.State.ProvingPeriodStart, nil
+}
+
+func (s *state10) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) {
+ allocatedSectors, err := s.loadAllocatedSectorNumbers()
+ if err != nil {
+ return nil, err
+ }
+
+ allocatedRuns, err := allocatedSectors.RunIterator()
+ if err != nil {
+ return nil, err
+ }
+
+ unallocatedRuns, err := rle.Subtract(
+ &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}},
+ allocatedRuns,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ iter, err := rle.BitsFromRuns(unallocatedRuns)
+ if err != nil {
+ return nil, err
+ }
+
+ sectors := make([]abi.SectorNumber, 0, count)
+ for iter.HasNext() && len(sectors) < count {
+ nextNo, err := iter.Next()
+ if err != nil {
+ return nil, err
+ }
+ sectors = append(sectors, abi.SectorNumber(nextNo))
+ }
+
+ return sectors, nil
+}
+
+func (s *state10) GetAllocatedSectors() (*bitfield.BitField, error) {
+ var allocatedSectors bitfield.BitField
+ if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil {
+ return nil, err
+ }
+
+ return &allocatedSectors, nil
+}
+
+func (s *state10) LoadDeadline(idx uint64) (Deadline, error) {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return nil, err
+ }
+ dl, err := dls.LoadDeadline(s.store, idx)
+ if err != nil {
+ return nil, err
+ }
+ return &deadline10{*dl, s.store}, nil
+}
+
+func (s *state10) ForEachDeadline(cb func(uint64, Deadline) error) error {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return err
+ }
+ return dls.ForEach(s.store, func(i uint64, dl *miner10.Deadline) error {
+ return cb(i, &deadline10{*dl, s.store})
+ })
+}
+
+func (s *state10) NumDeadlines() (uint64, error) {
+ return miner10.WPoStPeriodDeadlines, nil
+}
+
+func (s *state10) DeadlinesChanged(other State) (bool, error) {
+ other10, ok := other.(*state10)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+
+ return !s.State.Deadlines.Equals(other10.Deadlines), nil
+}
+
+func (s *state10) MinerInfoChanged(other State) (bool, error) {
+ other0, ok := other.(*state10)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+ return !s.State.Info.Equals(other0.State.Info), nil
+}
+
+func (s *state10) Info() (MinerInfo, error) {
+ info, err := s.State.GetInfo(s.store)
+ if err != nil {
+ return MinerInfo{}, err
+ }
+
+ mi := MinerInfo{
+ Owner: info.Owner,
+ Worker: info.Worker,
+ ControlAddresses: info.ControlAddresses,
+
+ PendingWorkerKey: (*WorkerKeyChange)(info.PendingWorkerKey),
+
+ PeerId: info.PeerId,
+ Multiaddrs: info.Multiaddrs,
+ WindowPoStProofType: info.WindowPoStProofType,
+ SectorSize: info.SectorSize,
+ WindowPoStPartitionSectors: info.WindowPoStPartitionSectors,
+ ConsensusFaultElapsed: info.ConsensusFaultElapsed,
+
+ Beneficiary: info.Beneficiary,
+ BeneficiaryTerm: BeneficiaryTerm(info.BeneficiaryTerm),
+ PendingBeneficiaryTerm: (*PendingBeneficiaryChange)(info.PendingBeneficiaryTerm),
+ }
+
+ return mi, nil
+}
+
+func (s *state10) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) {
+ return s.State.RecordedDeadlineInfo(epoch), nil
+}
+
+func (s *state10) DeadlineCronActive() (bool, error) {
+ return s.State.DeadlineCronActive, nil
+}
+
+func (s *state10) sectors() (adt.Array, error) {
+ return adt10.AsArray(s.store, s.Sectors, miner10.SectorsAmtBitwidth)
+}
+
+func (s *state10) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) {
+ var si miner10.SectorOnChainInfo
+ err := si.UnmarshalCBOR(bytes.NewReader(val.Raw))
+ if err != nil {
+ return SectorOnChainInfo{}, err
+ }
+
+ return fromV10SectorOnChainInfo(si), nil
+}
+
+func (s *state10) precommits() (adt.Map, error) {
+ return adt10.AsMap(s.store, s.PreCommittedSectors, builtin10.DefaultHamtBitwidth)
+}
+
+func (s *state10) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
+ var sp miner10.SectorPreCommitOnChainInfo
+ err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
+ if err != nil {
+ return SectorPreCommitOnChainInfo{}, err
+ }
+
+ return fromV10SectorPreCommitOnChainInfo(sp), nil
+}
+
+func (s *state10) EraseAllUnproven() error {
+
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return err
+ }
+
+ err = dls.ForEach(s.store, func(dindx uint64, dl *miner10.Deadline) error {
+ ps, err := dl.PartitionsArray(s.store)
+ if err != nil {
+ return err
+ }
+
+ var part miner10.Partition
+ err = ps.ForEach(&part, func(pindx int64) error {
+ _ = part.ActivateUnproven()
+ err = ps.Set(uint64(pindx), &part)
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ dl.Partitions, err = ps.Root()
+ if err != nil {
+ return err
+ }
+
+ return dls.UpdateDeadline(s.store, dindx, dl)
+ })
+ if err != nil {
+ return err
+ }
+
+ return s.State.SaveDeadlines(s.store, dls)
+
+}
+
+func (d *deadline10) LoadPartition(idx uint64) (Partition, error) {
+ p, err := d.Deadline.LoadPartition(d.store, idx)
+ if err != nil {
+ return nil, err
+ }
+ return &partition10{*p, d.store}, nil
+}
+
+func (d *deadline10) ForEachPartition(cb func(uint64, Partition) error) error {
+ ps, err := d.Deadline.PartitionsArray(d.store)
+ if err != nil {
+ return err
+ }
+ var part miner10.Partition
+ return ps.ForEach(&part, func(i int64) error {
+ return cb(uint64(i), &partition10{part, d.store})
+ })
+}
+
+func (d *deadline10) PartitionsChanged(other Deadline) (bool, error) {
+ other10, ok := other.(*deadline10)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+
+ return !d.Deadline.Partitions.Equals(other10.Deadline.Partitions), nil
+}
+
+func (d *deadline10) PartitionsPoSted() (bitfield.BitField, error) {
+ return d.Deadline.PartitionsPoSted, nil
+}
+
+func (d *deadline10) DisputableProofCount() (uint64, error) {
+
+ ops, err := d.OptimisticProofsSnapshotArray(d.store)
+ if err != nil {
+ return 0, err
+ }
+
+ return ops.Length(), nil
+
+}
+
+func (p *partition10) AllSectors() (bitfield.BitField, error) {
+ return p.Partition.Sectors, nil
+}
+
+func (p *partition10) FaultySectors() (bitfield.BitField, error) {
+ return p.Partition.Faults, nil
+}
+
+func (p *partition10) RecoveringSectors() (bitfield.BitField, error) {
+ return p.Partition.Recoveries, nil
+}
+
+func (p *partition10) UnprovenSectors() (bitfield.BitField, error) {
+ return p.Partition.Unproven, nil
+}
+
+func fromV10SectorOnChainInfo(v10 miner10.SectorOnChainInfo) SectorOnChainInfo {
+ info := SectorOnChainInfo{
+ SectorNumber: v10.SectorNumber,
+ SealProof: v10.SealProof,
+ SealedCID: v10.SealedCID,
+ DealIDs: v10.DealIDs,
+ Activation: v10.Activation,
+ Expiration: v10.Expiration,
+ DealWeight: v10.DealWeight,
+ VerifiedDealWeight: v10.VerifiedDealWeight,
+ InitialPledge: v10.InitialPledge,
+ ExpectedDayReward: v10.ExpectedDayReward,
+ ExpectedStoragePledge: v10.ExpectedStoragePledge,
+
+ SectorKeyCID: v10.SectorKeyCID,
+ }
+ return info
+}
+
+func fromV10SectorPreCommitOnChainInfo(v10 miner10.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v10.Info.SealProof,
+ SectorNumber: v10.Info.SectorNumber,
+ SealedCID: v10.Info.SealedCID,
+ SealRandEpoch: v10.Info.SealRandEpoch,
+ DealIDs: v10.Info.DealIDs,
+ Expiration: v10.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v10.PreCommitDeposit,
+ PreCommitEpoch: v10.PreCommitEpoch,
+ }
+
+ ret.Info.UnsealedCid = v10.Info.UnsealedCid
+
+ return ret
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v2.go b/chain/actors/builtin/miner/v2.go
index 7741b5426..c9870a124 100644
--- a/chain/actors/builtin/miner/v2.go
+++ b/chain/actors/builtin/miner/v2.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,11 +12,12 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/dline"
miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner"
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -87,6 +89,7 @@ func (s *state2) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state2) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -194,7 +197,7 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -205,7 +208,7 @@ func (s *state2) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state2) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state2) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt2.AsMap(s.store, s.State.PreCommittedSectors)
if err != nil {
return err
@@ -418,11 +421,11 @@ func (s *state2) precommits() (adt.Map, error) {
return adt2.AsMap(s.store, s.PreCommittedSectors)
}
-func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state2) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner2.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV2SectorPreCommitOnChainInfo(sp), nil
@@ -540,16 +543,41 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v2.Info),
- PreCommitDeposit: v2.PreCommitDeposit,
- PreCommitEpoch: v2.PreCommitEpoch,
- DealWeight: v2.DealWeight,
- VerifiedDealWeight: v2.VerifiedDealWeight,
+func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v2.Info.SealProof,
+ SectorNumber: v2.Info.SectorNumber,
+ SealedCID: v2.Info.SealedCID,
+ SealRandEpoch: v2.Info.SealRandEpoch,
+ DealIDs: v2.Info.DealIDs,
+ Expiration: v2.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v2.PreCommitDeposit,
+ PreCommitEpoch: v2.PreCommitEpoch,
}
+
+ return ret
}
func (s *state2) GetState() interface{} {
return &s.State
}
+
+func (s *state2) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v3.go b/chain/actors/builtin/miner/v3.go
index 8cb1c4004..c71c8315a 100644
--- a/chain/actors/builtin/miner/v3.go
+++ b/chain/actors/builtin/miner/v3.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,12 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/dline"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner"
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -88,6 +90,7 @@ func (s *state3) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state3) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -195,7 +198,7 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -206,7 +209,7 @@ func (s *state3) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state3) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state3) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt3.AsMap(s.store, s.State.PreCommittedSectors, builtin3.DefaultHamtBitwidth)
if err != nil {
return err
@@ -414,11 +417,11 @@ func (s *state3) precommits() (adt.Map, error) {
return adt3.AsMap(s.store, s.PreCommittedSectors, builtin3.DefaultHamtBitwidth)
}
-func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state3) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner3.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV3SectorPreCommitOnChainInfo(sp), nil
@@ -540,16 +543,41 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v3.Info),
- PreCommitDeposit: v3.PreCommitDeposit,
- PreCommitEpoch: v3.PreCommitEpoch,
- DealWeight: v3.DealWeight,
- VerifiedDealWeight: v3.VerifiedDealWeight,
+func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v3.Info.SealProof,
+ SectorNumber: v3.Info.SectorNumber,
+ SealedCID: v3.Info.SealedCID,
+ SealRandEpoch: v3.Info.SealRandEpoch,
+ DealIDs: v3.Info.DealIDs,
+ Expiration: v3.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v3.PreCommitDeposit,
+ PreCommitEpoch: v3.PreCommitEpoch,
}
+
+ return ret
}
func (s *state3) GetState() interface{} {
return &s.State
}
+
+func (s *state3) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v4.go b/chain/actors/builtin/miner/v4.go
index dc8b7a1d1..2e3c6ee79 100644
--- a/chain/actors/builtin/miner/v4.go
+++ b/chain/actors/builtin/miner/v4.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,12 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/dline"
builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner"
adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -88,6 +90,7 @@ func (s *state4) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state4) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -195,7 +198,7 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -206,7 +209,7 @@ func (s *state4) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state4) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state4) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt4.AsMap(s.store, s.State.PreCommittedSectors, builtin4.DefaultHamtBitwidth)
if err != nil {
return err
@@ -414,11 +417,11 @@ func (s *state4) precommits() (adt.Map, error) {
return adt4.AsMap(s.store, s.PreCommittedSectors, builtin4.DefaultHamtBitwidth)
}
-func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state4) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner4.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV4SectorPreCommitOnChainInfo(sp), nil
@@ -540,16 +543,41 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v4.Info),
- PreCommitDeposit: v4.PreCommitDeposit,
- PreCommitEpoch: v4.PreCommitEpoch,
- DealWeight: v4.DealWeight,
- VerifiedDealWeight: v4.VerifiedDealWeight,
+func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v4.Info.SealProof,
+ SectorNumber: v4.Info.SectorNumber,
+ SealedCID: v4.Info.SealedCID,
+ SealRandEpoch: v4.Info.SealRandEpoch,
+ DealIDs: v4.Info.DealIDs,
+ Expiration: v4.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v4.PreCommitDeposit,
+ PreCommitEpoch: v4.PreCommitEpoch,
}
+
+ return ret
}
func (s *state4) GetState() interface{} {
return &s.State
}
+
+func (s *state4) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v5.go b/chain/actors/builtin/miner/v5.go
index f5ec6087b..28ab438e4 100644
--- a/chain/actors/builtin/miner/v5.go
+++ b/chain/actors/builtin/miner/v5.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,12 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/dline"
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner"
adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -88,6 +90,7 @@ func (s *state5) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state5) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -195,7 +198,7 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -206,7 +209,7 @@ func (s *state5) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state5) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state5) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt5.AsMap(s.store, s.State.PreCommittedSectors, builtin5.DefaultHamtBitwidth)
if err != nil {
return err
@@ -414,11 +417,11 @@ func (s *state5) precommits() (adt.Map, error) {
return adt5.AsMap(s.store, s.PreCommittedSectors, builtin5.DefaultHamtBitwidth)
}
-func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state5) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner5.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV5SectorPreCommitOnChainInfo(sp), nil
@@ -540,16 +543,41 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v5.Info),
- PreCommitDeposit: v5.PreCommitDeposit,
- PreCommitEpoch: v5.PreCommitEpoch,
- DealWeight: v5.DealWeight,
- VerifiedDealWeight: v5.VerifiedDealWeight,
+func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v5.Info.SealProof,
+ SectorNumber: v5.Info.SectorNumber,
+ SealedCID: v5.Info.SealedCID,
+ SealRandEpoch: v5.Info.SealRandEpoch,
+ DealIDs: v5.Info.DealIDs,
+ Expiration: v5.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v5.PreCommitDeposit,
+ PreCommitEpoch: v5.PreCommitEpoch,
}
+
+ return ret
}
func (s *state5) GetState() interface{} {
return &s.State
}
+
+func (s *state5) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v6.go b/chain/actors/builtin/miner/v6.go
index 78445b2ba..9e819e55f 100644
--- a/chain/actors/builtin/miner/v6.go
+++ b/chain/actors/builtin/miner/v6.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,12 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/dline"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner"
adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -88,6 +90,7 @@ func (s *state6) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state6) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -195,7 +198,7 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -206,7 +209,7 @@ func (s *state6) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state6) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state6) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt6.AsMap(s.store, s.State.PreCommittedSectors, builtin6.DefaultHamtBitwidth)
if err != nil {
return err
@@ -414,11 +417,11 @@ func (s *state6) precommits() (adt.Map, error) {
return adt6.AsMap(s.store, s.PreCommittedSectors, builtin6.DefaultHamtBitwidth)
}
-func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state6) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner6.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV6SectorPreCommitOnChainInfo(sp), nil
@@ -540,16 +543,41 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v6.Info),
- PreCommitDeposit: v6.PreCommitDeposit,
- PreCommitEpoch: v6.PreCommitEpoch,
- DealWeight: v6.DealWeight,
- VerifiedDealWeight: v6.VerifiedDealWeight,
+func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v6.Info.SealProof,
+ SectorNumber: v6.Info.SectorNumber,
+ SealedCID: v6.Info.SealedCID,
+ SealRandEpoch: v6.Info.SealRandEpoch,
+ DealIDs: v6.Info.DealIDs,
+ Expiration: v6.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v6.PreCommitDeposit,
+ PreCommitEpoch: v6.PreCommitEpoch,
}
+
+ return ret
}
func (s *state6) GetState() interface{} {
return &s.State
}
+
+func (s *state6) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go
index c91fceb7b..f98233c37 100644
--- a/chain/actors/builtin/miner/v7.go
+++ b/chain/actors/builtin/miner/v7.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,12 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/dline"
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner"
adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -88,6 +90,7 @@ func (s *state7) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state7) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -194,7 +197,7 @@ func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -205,7 +208,7 @@ func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state7) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth)
if err != nil {
return err
@@ -413,11 +416,11 @@ func (s *state7) precommits() (adt.Map, error) {
return adt7.AsMap(s.store, s.PreCommittedSectors, builtin7.DefaultHamtBitwidth)
}
-func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner7.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV7SectorPreCommitOnChainInfo(sp), nil
@@ -541,16 +544,41 @@ func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v7.Info),
- PreCommitDeposit: v7.PreCommitDeposit,
- PreCommitEpoch: v7.PreCommitEpoch,
- DealWeight: v7.DealWeight,
- VerifiedDealWeight: v7.VerifiedDealWeight,
+func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v7.Info.SealProof,
+ SectorNumber: v7.Info.SectorNumber,
+ SealedCID: v7.Info.SealedCID,
+ SealRandEpoch: v7.Info.SealRandEpoch,
+ DealIDs: v7.Info.DealIDs,
+ Expiration: v7.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v7.PreCommitDeposit,
+ PreCommitEpoch: v7.PreCommitEpoch,
}
+
+ return ret
}
func (s *state7) GetState() interface{} {
return &s.State
}
+
+func (s *state7) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v8.go b/chain/actors/builtin/miner/v8.go
index 817a073a2..ee3c475ea 100644
--- a/chain/actors/builtin/miner/v8.go
+++ b/chain/actors/builtin/miner/v8.go
@@ -3,6 +3,7 @@ package miner
import (
"bytes"
"errors"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -11,12 +12,13 @@ import (
"github.com/filecoin-project/go-bitfield"
rle "github.com/filecoin-project/go-bitfield/rle"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin8 "github.com/filecoin-project/go-state-types/builtin"
miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
"github.com/filecoin-project/go-state-types/dline"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -88,6 +90,7 @@ func (s *state8) PreCommitDeposits() (abi.TokenAmount, error) {
return s.State.PreCommitDeposits, nil
}
+// Returns nil, nil if sector is not found
func (s *state8) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
info, ok, err := s.State.GetSector(s.store, num)
if !ok || err != nil {
@@ -194,7 +197,7 @@ func (s *state8) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e
return &out, nil
}
-func (s *state8) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state8) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
info, ok, err := s.State.GetPrecommittedSector(s.store, num)
if !ok || err != nil {
return nil, err
@@ -205,7 +208,7 @@ func (s *state8) GetPrecommittedSector(num abi.SectorNumber) (*minertypes.Sector
return &ret, nil
}
-func (s *state8) ForEachPrecommittedSector(cb func(minertypes.SectorPreCommitOnChainInfo) error) error {
+func (s *state8) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
precommitted, err := adt8.AsMap(s.store, s.State.PreCommittedSectors, builtin8.DefaultHamtBitwidth)
if err != nil {
return err
@@ -413,11 +416,11 @@ func (s *state8) precommits() (adt.Map, error) {
return adt8.AsMap(s.store, s.PreCommittedSectors, builtin8.DefaultHamtBitwidth)
}
-func (s *state8) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (minertypes.SectorPreCommitOnChainInfo, error) {
+func (s *state8) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
var sp miner8.SectorPreCommitOnChainInfo
err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
if err != nil {
- return minertypes.SectorPreCommitOnChainInfo{}, err
+ return SectorPreCommitOnChainInfo{}, err
}
return fromV8SectorPreCommitOnChainInfo(sp), nil
@@ -541,16 +544,41 @@ func fromV8SectorOnChainInfo(v8 miner8.SectorOnChainInfo) SectorOnChainInfo {
return info
}
-func fromV8SectorPreCommitOnChainInfo(v8 miner8.SectorPreCommitOnChainInfo) minertypes.SectorPreCommitOnChainInfo {
- return minertypes.SectorPreCommitOnChainInfo{
- Info: (minertypes.SectorPreCommitInfo)(v8.Info),
- PreCommitDeposit: v8.PreCommitDeposit,
- PreCommitEpoch: v8.PreCommitEpoch,
- DealWeight: v8.DealWeight,
- VerifiedDealWeight: v8.VerifiedDealWeight,
+func fromV8SectorPreCommitOnChainInfo(v8 miner8.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v8.Info.SealProof,
+ SectorNumber: v8.Info.SectorNumber,
+ SealedCID: v8.Info.SealedCID,
+ SealRandEpoch: v8.Info.SealRandEpoch,
+ DealIDs: v8.Info.DealIDs,
+ Expiration: v8.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v8.PreCommitDeposit,
+ PreCommitEpoch: v8.PreCommitEpoch,
}
+
+ return ret
}
func (s *state8) GetState() interface{} {
return &s.State
}
+
+func (s *state8) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/miner/v9.go b/chain/actors/builtin/miner/v9.go
new file mode 100644
index 000000000..12e888706
--- /dev/null
+++ b/chain/actors/builtin/miner/v9.go
@@ -0,0 +1,590 @@
+package miner
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-bitfield"
+ rle "github.com/filecoin-project/go-bitfield/rle"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin9 "github.com/filecoin-project/go-state-types/builtin"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+ "github.com/filecoin-project/go-state-types/dline"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store) (State, error) {
+ out := state9{store: store}
+ out.State = miner9.State{}
+ return &out, nil
+}
+
+type state9 struct {
+ miner9.State
+ store adt.Store
+}
+
+type deadline9 struct {
+ miner9.Deadline
+ store adt.Store
+}
+
+type partition9 struct {
+ miner9.Partition
+ store adt.Store
+}
+
+func (s *state9) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ err = xerrors.Errorf("failed to get available balance: %w", r)
+ available = abi.NewTokenAmount(0)
+ }
+ }()
+ // this panics if the miner doesnt have enough funds to cover their locked pledge
+ available, err = s.GetAvailableBalance(bal)
+ return available, err
+}
+
+func (s *state9) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) {
+ return s.CheckVestedFunds(s.store, epoch)
+}
+
+func (s *state9) LockedFunds() (LockedFunds, error) {
+ return LockedFunds{
+ VestingFunds: s.State.LockedFunds,
+ InitialPledgeRequirement: s.State.InitialPledge,
+ PreCommitDeposits: s.State.PreCommitDeposits,
+ }, nil
+}
+
+func (s *state9) FeeDebt() (abi.TokenAmount, error) {
+ return s.State.FeeDebt, nil
+}
+
+func (s *state9) InitialPledge() (abi.TokenAmount, error) {
+ return s.State.InitialPledge, nil
+}
+
+func (s *state9) PreCommitDeposits() (abi.TokenAmount, error) {
+ return s.State.PreCommitDeposits, nil
+}
+
+// Returns nil, nil if sector is not found
+func (s *state9) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) {
+ info, ok, err := s.State.GetSector(s.store, num)
+ if !ok || err != nil {
+ return nil, err
+ }
+
+ ret := fromV9SectorOnChainInfo(*info)
+ return &ret, nil
+}
+
+func (s *state9) FindSector(num abi.SectorNumber) (*SectorLocation, error) {
+ dlIdx, partIdx, err := s.State.FindSector(s.store, num)
+ if err != nil {
+ return nil, err
+ }
+ return &SectorLocation{
+ Deadline: dlIdx,
+ Partition: partIdx,
+ }, nil
+}
+
+func (s *state9) NumLiveSectors() (uint64, error) {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return 0, err
+ }
+ var total uint64
+ if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner9.Deadline) error {
+ total += dl.LiveSectors
+ return nil
+ }); err != nil {
+ return 0, err
+ }
+ return total, nil
+}
+
+// GetSectorExpiration returns the effective expiration of the given sector.
+//
+// If the sector does not expire early, the Early expiration field is 0.
+func (s *state9) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return nil, err
+ }
+ // NOTE: this can be optimized significantly.
+ // 1. If the sector is non-faulty, it will expire on-time (can be
+ // learned from the sector info).
+ // 2. If it's faulty, it will expire early within the first 42 entries
+ // of the expiration queue.
+
+ stopErr := errors.New("stop")
+ out := SectorExpiration{}
+ err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner9.Deadline) error {
+ partitions, err := dl.PartitionsArray(s.store)
+ if err != nil {
+ return err
+ }
+ quant := s.State.QuantSpecForDeadline(dlIdx)
+ var part miner9.Partition
+ return partitions.ForEach(&part, func(partIdx int64) error {
+ if found, err := part.Sectors.IsSet(uint64(num)); err != nil {
+ return err
+ } else if !found {
+ return nil
+ }
+ if found, err := part.Terminated.IsSet(uint64(num)); err != nil {
+ return err
+ } else if found {
+ // already terminated
+ return stopErr
+ }
+
+ q, err := miner9.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner9.PartitionExpirationAmtBitwidth)
+ if err != nil {
+ return err
+ }
+ var exp miner9.ExpirationSet
+ return q.ForEach(&exp, func(epoch int64) error {
+ if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil {
+ return err
+ } else if early {
+ out.Early = abi.ChainEpoch(epoch)
+ return nil
+ }
+ if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil {
+ return err
+ } else if onTime {
+ out.OnTime = abi.ChainEpoch(epoch)
+ return stopErr
+ }
+ return nil
+ })
+ })
+ })
+ if err == stopErr {
+ err = nil
+ }
+ if err != nil {
+ return nil, err
+ }
+ if out.Early == 0 && out.OnTime == 0 {
+ return nil, xerrors.Errorf("failed to find sector %d", num)
+ }
+ return &out, nil
+}
+
+func (s *state9) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) {
+ info, ok, err := s.State.GetPrecommittedSector(s.store, num)
+ if !ok || err != nil {
+ return nil, err
+ }
+
+ ret := fromV9SectorPreCommitOnChainInfo(*info)
+
+ return &ret, nil
+}
+
+func (s *state9) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error {
+ precommitted, err := adt9.AsMap(s.store, s.State.PreCommittedSectors, builtin9.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+
+ var info miner9.SectorPreCommitOnChainInfo
+ if err := precommitted.ForEach(&info, func(_ string) error {
+ return cb(fromV9SectorPreCommitOnChainInfo(info))
+ }); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (s *state9) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) {
+ sectors, err := miner9.LoadSectors(s.store, s.State.Sectors)
+ if err != nil {
+ return nil, err
+ }
+
+ // If no sector numbers are specified, load all.
+ if snos == nil {
+ infos := make([]*SectorOnChainInfo, 0, sectors.Length())
+ var info9 miner9.SectorOnChainInfo
+ if err := sectors.ForEach(&info9, func(_ int64) error {
+ info := fromV9SectorOnChainInfo(info9)
+ infos = append(infos, &info)
+ return nil
+ }); err != nil {
+ return nil, err
+ }
+ return infos, nil
+ }
+
+ // Otherwise, load selected.
+ infos9, err := sectors.Load(*snos)
+ if err != nil {
+ return nil, err
+ }
+ infos := make([]*SectorOnChainInfo, len(infos9))
+ for i, info9 := range infos9 {
+ info := fromV9SectorOnChainInfo(*info9)
+ infos[i] = &info
+ }
+ return infos, nil
+}
+
+func (s *state9) loadAllocatedSectorNumbers() (bitfield.BitField, error) {
+ var allocatedSectors bitfield.BitField
+ err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors)
+ return allocatedSectors, err
+}
+
+func (s *state9) IsAllocated(num abi.SectorNumber) (bool, error) {
+ allocatedSectors, err := s.loadAllocatedSectorNumbers()
+ if err != nil {
+ return false, err
+ }
+
+ return allocatedSectors.IsSet(uint64(num))
+}
+
+func (s *state9) GetProvingPeriodStart() (abi.ChainEpoch, error) {
+ return s.State.ProvingPeriodStart, nil
+}
+
+func (s *state9) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) {
+ allocatedSectors, err := s.loadAllocatedSectorNumbers()
+ if err != nil {
+ return nil, err
+ }
+
+ allocatedRuns, err := allocatedSectors.RunIterator()
+ if err != nil {
+ return nil, err
+ }
+
+ unallocatedRuns, err := rle.Subtract(
+ &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}},
+ allocatedRuns,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ iter, err := rle.BitsFromRuns(unallocatedRuns)
+ if err != nil {
+ return nil, err
+ }
+
+ sectors := make([]abi.SectorNumber, 0, count)
+ for iter.HasNext() && len(sectors) < count {
+ nextNo, err := iter.Next()
+ if err != nil {
+ return nil, err
+ }
+ sectors = append(sectors, abi.SectorNumber(nextNo))
+ }
+
+ return sectors, nil
+}
+
+func (s *state9) GetAllocatedSectors() (*bitfield.BitField, error) {
+ var allocatedSectors bitfield.BitField
+ if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil {
+ return nil, err
+ }
+
+ return &allocatedSectors, nil
+}
+
+func (s *state9) LoadDeadline(idx uint64) (Deadline, error) {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return nil, err
+ }
+ dl, err := dls.LoadDeadline(s.store, idx)
+ if err != nil {
+ return nil, err
+ }
+ return &deadline9{*dl, s.store}, nil
+}
+
+func (s *state9) ForEachDeadline(cb func(uint64, Deadline) error) error {
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return err
+ }
+ return dls.ForEach(s.store, func(i uint64, dl *miner9.Deadline) error {
+ return cb(i, &deadline9{*dl, s.store})
+ })
+}
+
+func (s *state9) NumDeadlines() (uint64, error) {
+ return miner9.WPoStPeriodDeadlines, nil
+}
+
+func (s *state9) DeadlinesChanged(other State) (bool, error) {
+ other9, ok := other.(*state9)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+
+ return !s.State.Deadlines.Equals(other9.Deadlines), nil
+}
+
+func (s *state9) MinerInfoChanged(other State) (bool, error) {
+ other0, ok := other.(*state9)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+ return !s.State.Info.Equals(other0.State.Info), nil
+}
+
+func (s *state9) Info() (MinerInfo, error) {
+ info, err := s.State.GetInfo(s.store)
+ if err != nil {
+ return MinerInfo{}, err
+ }
+
+ mi := MinerInfo{
+ Owner: info.Owner,
+ Worker: info.Worker,
+ ControlAddresses: info.ControlAddresses,
+
+ PendingWorkerKey: (*WorkerKeyChange)(info.PendingWorkerKey),
+
+ PeerId: info.PeerId,
+ Multiaddrs: info.Multiaddrs,
+ WindowPoStProofType: info.WindowPoStProofType,
+ SectorSize: info.SectorSize,
+ WindowPoStPartitionSectors: info.WindowPoStPartitionSectors,
+ ConsensusFaultElapsed: info.ConsensusFaultElapsed,
+
+ Beneficiary: info.Beneficiary,
+ BeneficiaryTerm: BeneficiaryTerm(info.BeneficiaryTerm),
+ PendingBeneficiaryTerm: (*PendingBeneficiaryChange)(info.PendingBeneficiaryTerm),
+ }
+
+ return mi, nil
+}
+
+func (s *state9) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) {
+ return s.State.RecordedDeadlineInfo(epoch), nil
+}
+
+func (s *state9) DeadlineCronActive() (bool, error) {
+ return s.State.DeadlineCronActive, nil
+}
+
+func (s *state9) sectors() (adt.Array, error) {
+ return adt9.AsArray(s.store, s.Sectors, miner9.SectorsAmtBitwidth)
+}
+
+func (s *state9) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) {
+ var si miner9.SectorOnChainInfo
+ err := si.UnmarshalCBOR(bytes.NewReader(val.Raw))
+ if err != nil {
+ return SectorOnChainInfo{}, err
+ }
+
+ return fromV9SectorOnChainInfo(si), nil
+}
+
+func (s *state9) precommits() (adt.Map, error) {
+ return adt9.AsMap(s.store, s.PreCommittedSectors, builtin9.DefaultHamtBitwidth)
+}
+
+func (s *state9) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) {
+ var sp miner9.SectorPreCommitOnChainInfo
+ err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw))
+ if err != nil {
+ return SectorPreCommitOnChainInfo{}, err
+ }
+
+ return fromV9SectorPreCommitOnChainInfo(sp), nil
+}
+
+func (s *state9) EraseAllUnproven() error {
+
+ dls, err := s.State.LoadDeadlines(s.store)
+ if err != nil {
+ return err
+ }
+
+ err = dls.ForEach(s.store, func(dindx uint64, dl *miner9.Deadline) error {
+ ps, err := dl.PartitionsArray(s.store)
+ if err != nil {
+ return err
+ }
+
+ var part miner9.Partition
+ err = ps.ForEach(&part, func(pindx int64) error {
+ _ = part.ActivateUnproven()
+ err = ps.Set(uint64(pindx), &part)
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ dl.Partitions, err = ps.Root()
+ if err != nil {
+ return err
+ }
+
+ return dls.UpdateDeadline(s.store, dindx, dl)
+ })
+ if err != nil {
+ return err
+ }
+
+ return s.State.SaveDeadlines(s.store, dls)
+
+}
+
+func (d *deadline9) LoadPartition(idx uint64) (Partition, error) {
+ p, err := d.Deadline.LoadPartition(d.store, idx)
+ if err != nil {
+ return nil, err
+ }
+ return &partition9{*p, d.store}, nil
+}
+
+func (d *deadline9) ForEachPartition(cb func(uint64, Partition) error) error {
+ ps, err := d.Deadline.PartitionsArray(d.store)
+ if err != nil {
+ return err
+ }
+ var part miner9.Partition
+ return ps.ForEach(&part, func(i int64) error {
+ return cb(uint64(i), &partition9{part, d.store})
+ })
+}
+
+func (d *deadline9) PartitionsChanged(other Deadline) (bool, error) {
+ other9, ok := other.(*deadline9)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+
+ return !d.Deadline.Partitions.Equals(other9.Deadline.Partitions), nil
+}
+
+func (d *deadline9) PartitionsPoSted() (bitfield.BitField, error) {
+ return d.Deadline.PartitionsPoSted, nil
+}
+
+func (d *deadline9) DisputableProofCount() (uint64, error) {
+
+ ops, err := d.OptimisticProofsSnapshotArray(d.store)
+ if err != nil {
+ return 0, err
+ }
+
+ return ops.Length(), nil
+
+}
+
+func (p *partition9) AllSectors() (bitfield.BitField, error) {
+ return p.Partition.Sectors, nil
+}
+
+func (p *partition9) FaultySectors() (bitfield.BitField, error) {
+ return p.Partition.Faults, nil
+}
+
+func (p *partition9) RecoveringSectors() (bitfield.BitField, error) {
+ return p.Partition.Recoveries, nil
+}
+
+func (p *partition9) UnprovenSectors() (bitfield.BitField, error) {
+ return p.Partition.Unproven, nil
+}
+
+func fromV9SectorOnChainInfo(v9 miner9.SectorOnChainInfo) SectorOnChainInfo {
+ info := SectorOnChainInfo{
+ SectorNumber: v9.SectorNumber,
+ SealProof: v9.SealProof,
+ SealedCID: v9.SealedCID,
+ DealIDs: v9.DealIDs,
+ Activation: v9.Activation,
+ Expiration: v9.Expiration,
+ DealWeight: v9.DealWeight,
+ VerifiedDealWeight: v9.VerifiedDealWeight,
+ InitialPledge: v9.InitialPledge,
+ ExpectedDayReward: v9.ExpectedDayReward,
+ ExpectedStoragePledge: v9.ExpectedStoragePledge,
+
+ SectorKeyCID: v9.SectorKeyCID,
+ }
+ return info
+}
+
+func fromV9SectorPreCommitOnChainInfo(v9 miner9.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo {
+ ret := SectorPreCommitOnChainInfo{
+ Info: SectorPreCommitInfo{
+ SealProof: v9.Info.SealProof,
+ SectorNumber: v9.Info.SectorNumber,
+ SealedCID: v9.Info.SealedCID,
+ SealRandEpoch: v9.Info.SealRandEpoch,
+ DealIDs: v9.Info.DealIDs,
+ Expiration: v9.Info.Expiration,
+ UnsealedCid: nil,
+ },
+ PreCommitDeposit: v9.PreCommitDeposit,
+ PreCommitEpoch: v9.PreCommitEpoch,
+ }
+
+ ret.Info.UnsealedCid = v9.Info.UnsealedCid
+
+ return ret
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) ActorKey() string {
+ return actors.MinerKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/actor.go.template b/chain/actors/builtin/multisig/actor.go.template
index bd6d4d77a..40e49e702 100644
--- a/chain/actors/builtin/multisig/actor.go.template
+++ b/chain/actors/builtin/multisig/actor.go.template
@@ -1,6 +1,8 @@
package multisig
import (
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/ipfs/go-cid"
"fmt"
"github.com/minio/blake2b-simd"
@@ -15,11 +17,11 @@ import (
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
+
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/types"
@@ -34,7 +36,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -53,10 +55,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
{{end}}
}
@@ -66,6 +68,10 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
LockedBalance(epoch abi.ChainEpoch) (abi.TokenAmount, error)
StartEpoch() (abi.ChainEpoch, error)
UnlockDuration() (abi.ChainEpoch, error)
@@ -83,12 +89,12 @@ type State interface {
type Transaction = msig{{.latestVersion}}.Transaction
-var Methods = builtin{{.latestVersion}}.MethodsMultisig
+var Methods = builtintypes.MethodsMultisig
-func Message(version actors.Version, from address.Address) MessageBuilder {
+func Message(version actorstypes.Version, from address.Address) MessageBuilder {
switch version {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return message{{.}}{{"{"}}{{if (ge . 2)}}message0{from}{{else}}from{{end}}}
{{end}} default:
panic(fmt.Sprintf("unsupported actors version: %d", version))
@@ -140,3 +146,10 @@ func txnParams(id uint64, data *ProposalHashData) ([]byte, error) {
return actors.SerializeParams(¶ms)
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/multisig/message.go.template b/chain/actors/builtin/multisig/message.go.template
index 5542f4eec..1e1559968 100644
--- a/chain/actors/builtin/multisig/message.go.template
+++ b/chain/actors/builtin/multisig/message.go.template
@@ -11,12 +11,12 @@ import (
init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init"
multisig{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/multisig"
{{else}}
- builtin{{.v}} "github.com/filecoin-project/go-state-types/builtin"
- multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/multisig"
- init{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/init"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ multisig{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}multisig"
+ init{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin/v{{.latestVersion}}/init"
{{end}}
-
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/lotus/chain/actors"
init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
"github.com/filecoin-project/lotus/chain/types"
@@ -68,13 +68,13 @@ func (m message{{.v}}) Create(
ConstructorParams: enc,
}
{{else}}
- code, ok := actors.GetActorCodeID(actors.Version{{.v}}, actors.MultisigKey)
+ code, ok := actors.GetActorCodeID(actorstypes.Version{{.v}}, actors.MultisigKey)
if !ok {
return nil, xerrors.Errorf("failed to get multisig code ID")
}
// new actors are created by invoking 'exec' on the init actor with the constructor params
- execParams := &init8.ExecParams{
+ execParams := &init{{.latestVersion}}.ExecParams{
CodeCID: code,
ConstructorParams: enc,
}
@@ -88,7 +88,7 @@ func (m message{{.v}}) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin{{.v}}.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message0.go b/chain/actors/builtin/multisig/message0.go
index ac538d5b0..7dbdf444c 100644
--- a/chain/actors/builtin/multisig/message0.go
+++ b/chain/actors/builtin/multisig/message0.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
init0 "github.com/filecoin-project/specs-actors/actors/builtin/init"
multisig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig"
@@ -66,7 +67,7 @@ func (m message0) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin0.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message10.go b/chain/actors/builtin/multisig/message10.go
new file mode 100644
index 000000000..944911643
--- /dev/null
+++ b/chain/actors/builtin/multisig/message10.go
@@ -0,0 +1,76 @@
+package multisig
+
+import (
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
+ init10 "github.com/filecoin-project/go-state-types/builtin/v10/init"
+ multisig10 "github.com/filecoin-project/go-state-types/builtin/v10/multisig"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+type message10 struct{ message0 }
+
+func (m message10) Create(
+ signers []address.Address, threshold uint64,
+ unlockStart, unlockDuration abi.ChainEpoch,
+ initialAmount abi.TokenAmount,
+) (*types.Message, error) {
+
+ lenAddrs := uint64(len(signers))
+
+ if lenAddrs < threshold {
+ return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig")
+ }
+
+ if threshold == 0 {
+ threshold = lenAddrs
+ }
+
+ if m.from == address.Undef {
+ return nil, xerrors.Errorf("must provide source address")
+ }
+
+ // Set up constructor parameters for multisig
+ msigParams := &multisig10.ConstructorParams{
+ Signers: signers,
+ NumApprovalsThreshold: threshold,
+ UnlockDuration: unlockDuration,
+ StartEpoch: unlockStart,
+ }
+
+ enc, actErr := actors.SerializeParams(msigParams)
+ if actErr != nil {
+ return nil, actErr
+ }
+
+ code, ok := actors.GetActorCodeID(actorstypes.Version10, actors.MultisigKey)
+ if !ok {
+ return nil, xerrors.Errorf("failed to get multisig code ID")
+ }
+
+ // new actors are created by invoking 'exec' on the init actor with the constructor params
+ execParams := &init10.ExecParams{
+ CodeCID: code,
+ ConstructorParams: enc,
+ }
+
+ enc, actErr = actors.SerializeParams(execParams)
+ if actErr != nil {
+ return nil, actErr
+ }
+
+ return &types.Message{
+ To: init_.Address,
+ From: m.from,
+ Method: builtintypes.MethodsInit.Exec,
+ Params: enc,
+ Value: initialAmount,
+ }, nil
+}
diff --git a/chain/actors/builtin/multisig/message2.go b/chain/actors/builtin/multisig/message2.go
index 6667479b1..91ad17b84 100644
--- a/chain/actors/builtin/multisig/message2.go
+++ b/chain/actors/builtin/multisig/message2.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init"
multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig"
@@ -63,7 +64,7 @@ func (m message2) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin2.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message3.go b/chain/actors/builtin/multisig/message3.go
index b2e5880ba..4124e00c8 100644
--- a/chain/actors/builtin/multisig/message3.go
+++ b/chain/actors/builtin/multisig/message3.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
init3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/init"
multisig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig"
@@ -63,7 +64,7 @@ func (m message3) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin3.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message4.go b/chain/actors/builtin/multisig/message4.go
index c62ae3da5..33449df75 100644
--- a/chain/actors/builtin/multisig/message4.go
+++ b/chain/actors/builtin/multisig/message4.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
init4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/init"
multisig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig"
@@ -63,7 +64,7 @@ func (m message4) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin4.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message5.go b/chain/actors/builtin/multisig/message5.go
index d1ae532ea..46c35dabc 100644
--- a/chain/actors/builtin/multisig/message5.go
+++ b/chain/actors/builtin/multisig/message5.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
init5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/init"
multisig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig"
@@ -63,7 +64,7 @@ func (m message5) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin5.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message6.go b/chain/actors/builtin/multisig/message6.go
index 896ea7212..f528cfbb5 100644
--- a/chain/actors/builtin/multisig/message6.go
+++ b/chain/actors/builtin/multisig/message6.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
init6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/init"
multisig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig"
@@ -63,7 +64,7 @@ func (m message6) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin6.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go
index b05952279..6e62dad13 100644
--- a/chain/actors/builtin/multisig/message7.go
+++ b/chain/actors/builtin/multisig/message7.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init"
multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig"
@@ -63,7 +64,7 @@ func (m message7) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin7.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message8.go b/chain/actors/builtin/multisig/message8.go
index 23bee19d0..7c79f3f50 100644
--- a/chain/actors/builtin/multisig/message8.go
+++ b/chain/actors/builtin/multisig/message8.go
@@ -5,8 +5,9 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
- init8 "github.com/filecoin-project/go-state-types/builtin/v8/init"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
+ init10 "github.com/filecoin-project/go-state-types/builtin/v10/init"
multisig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig"
"github.com/filecoin-project/lotus/chain/actors"
@@ -49,13 +50,13 @@ func (m message8) Create(
return nil, actErr
}
- code, ok := actors.GetActorCodeID(actors.Version8, actors.MultisigKey)
+ code, ok := actors.GetActorCodeID(actorstypes.Version8, actors.MultisigKey)
if !ok {
return nil, xerrors.Errorf("failed to get multisig code ID")
}
// new actors are created by invoking 'exec' on the init actor with the constructor params
- execParams := &init8.ExecParams{
+ execParams := &init10.ExecParams{
CodeCID: code,
ConstructorParams: enc,
}
@@ -68,7 +69,7 @@ func (m message8) Create(
return &types.Message{
To: init_.Address,
From: m.from,
- Method: builtin8.MethodsInit.Exec,
+ Method: builtintypes.MethodsInit.Exec,
Params: enc,
Value: initialAmount,
}, nil
diff --git a/chain/actors/builtin/multisig/message9.go b/chain/actors/builtin/multisig/message9.go
new file mode 100644
index 000000000..be49894fa
--- /dev/null
+++ b/chain/actors/builtin/multisig/message9.go
@@ -0,0 +1,76 @@
+package multisig
+
+import (
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
+ init10 "github.com/filecoin-project/go-state-types/builtin/v10/init"
+ multisig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+type message9 struct{ message0 }
+
+func (m message9) Create(
+ signers []address.Address, threshold uint64,
+ unlockStart, unlockDuration abi.ChainEpoch,
+ initialAmount abi.TokenAmount,
+) (*types.Message, error) {
+
+ lenAddrs := uint64(len(signers))
+
+ if lenAddrs < threshold {
+ return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig")
+ }
+
+ if threshold == 0 {
+ threshold = lenAddrs
+ }
+
+ if m.from == address.Undef {
+ return nil, xerrors.Errorf("must provide source address")
+ }
+
+ // Set up constructor parameters for multisig
+ msigParams := &multisig9.ConstructorParams{
+ Signers: signers,
+ NumApprovalsThreshold: threshold,
+ UnlockDuration: unlockDuration,
+ StartEpoch: unlockStart,
+ }
+
+ enc, actErr := actors.SerializeParams(msigParams)
+ if actErr != nil {
+ return nil, actErr
+ }
+
+ code, ok := actors.GetActorCodeID(actorstypes.Version9, actors.MultisigKey)
+ if !ok {
+ return nil, xerrors.Errorf("failed to get multisig code ID")
+ }
+
+ // new actors are created by invoking 'exec' on the init actor with the constructor params
+ execParams := &init10.ExecParams{
+ CodeCID: code,
+ ConstructorParams: enc,
+ }
+
+ enc, actErr = actors.SerializeParams(execParams)
+ if actErr != nil {
+ return nil, actErr
+ }
+
+ return &types.Message{
+ To: init_.Address,
+ From: m.from,
+ Method: builtintypes.MethodsInit.Exec,
+ Params: enc,
+ Value: initialAmount,
+ }, nil
+}
diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go
index 1b2fa7948..adb2fcfa0 100644
--- a/chain/actors/builtin/multisig/multisig.go
+++ b/chain/actors/builtin/multisig/multisig.go
@@ -3,14 +3,16 @@ package multisig
import (
"fmt"
+ "github.com/ipfs/go-cid"
"github.com/minio/blake2b-simd"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
- msig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtintypes "github.com/filecoin-project/go-state-types/builtin"
+ msig10 "github.com/filecoin-project/go-state-types/builtin/v10/multisig"
"github.com/filecoin-project/go-state-types/cbor"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
@@ -33,9 +35,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -67,33 +75,39 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
+ case actorstypes.Version9:
+ return make9(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
+
+ case actorstypes.Version10:
+ return make10(store, signers, threshold, startEpoch, unlockDuration, initialBalance)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
@@ -101,6 +115,10 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
LockedBalance(epoch abi.ChainEpoch) (abi.TokenAmount, error)
StartEpoch() (abi.ChainEpoch, error)
UnlockDuration() (abi.ChainEpoch, error)
@@ -116,36 +134,42 @@ type State interface {
GetState() interface{}
}
-type Transaction = msig8.Transaction
+type Transaction = msig10.Transaction
-var Methods = builtin8.MethodsMultisig
+var Methods = builtintypes.MethodsMultisig
-func Message(version actors.Version, from address.Address) MessageBuilder {
+func Message(version actorstypes.Version, from address.Address) MessageBuilder {
switch version {
- case actors.Version0:
+ case actorstypes.Version0:
return message0{from}
- case actors.Version2:
+ case actorstypes.Version2:
return message2{message0{from}}
- case actors.Version3:
+ case actorstypes.Version3:
return message3{message0{from}}
- case actors.Version4:
+ case actorstypes.Version4:
return message4{message0{from}}
- case actors.Version5:
+ case actorstypes.Version5:
return message5{message0{from}}
- case actors.Version6:
+ case actorstypes.Version6:
return message6{message0{from}}
- case actors.Version7:
+ case actorstypes.Version7:
return message7{message0{from}}
- case actors.Version8:
+ case actorstypes.Version8:
return message8{message0{from}}
+
+ case actorstypes.Version9:
+ return message9{message0{from}}
+
+ case actorstypes.Version10:
+ return message10{message0{from}}
default:
panic(fmt.Sprintf("unsupported actors version: %d", version))
}
@@ -169,13 +193,13 @@ type MessageBuilder interface {
}
// this type is the same between v0 and v2
-type ProposalHashData = msig8.ProposalHashData
-type ProposeReturn = msig8.ProposeReturn
-type ProposeParams = msig8.ProposeParams
-type ApproveReturn = msig8.ApproveReturn
+type ProposalHashData = msig10.ProposalHashData
+type ProposeReturn = msig10.ProposeReturn
+type ProposeParams = msig10.ProposeParams
+type ApproveReturn = msig10.ApproveReturn
func txnParams(id uint64, data *ProposalHashData) ([]byte, error) {
- params := msig8.TxnIDParams{ID: msig8.TxnID(id)}
+ params := msig10.TxnIDParams{ID: msig10.TxnID(id)}
if data != nil {
if data.Requester.Protocol() != address.ID {
return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester)
@@ -196,3 +220,18 @@ func txnParams(id uint64, data *ProposalHashData) ([]byte, error) {
return actors.SerializeParams(¶ms)
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/multisig/state.go.template b/chain/actors/builtin/multisig/state.go.template
index e375becc3..457e8cb4d 100644
--- a/chain/actors/builtin/multisig/state.go.template
+++ b/chain/actors/builtin/multisig/state.go.template
@@ -1,9 +1,11 @@
package multisig
import (
+ "fmt"
"bytes"
"encoding/binary"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
@@ -12,6 +14,7 @@ import (
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
{{if (le .v 7)}}
{{if (ge .v 3)}}
@@ -131,3 +134,20 @@ func (s *state{{.v}}) decodeTransaction(val *cbg.Deferred) (Transaction, error)
func (s *state{{.v}}) GetState() interface{} {
return &s.State
}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v0.go b/chain/actors/builtin/multisig/v0.go
index 9f4d09dc1..38cc76411 100644
--- a/chain/actors/builtin/multisig/v0.go
+++ b/chain/actors/builtin/multisig/v0.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,9 +11,11 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig"
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -114,3 +117,20 @@ func (s *state0) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state0) GetState() interface{} {
return &s.State
}
+
+func (s *state0) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v10.go b/chain/actors/builtin/multisig/v10.go
new file mode 100644
index 000000000..3b9babebe
--- /dev/null
+++ b/chain/actors/builtin/multisig/v10.go
@@ -0,0 +1,137 @@
+package multisig
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ msig10 "github.com/filecoin-project/go-state-types/builtin/v10/multisig"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) {
+ out := state10{store: store}
+ out.State = msig10.State{}
+ out.State.Signers = signers
+ out.State.NumApprovalsThreshold = threshold
+ out.State.StartEpoch = startEpoch
+ out.State.UnlockDuration = unlockDuration
+ out.State.InitialBalance = initialBalance
+
+ em, err := adt10.StoreEmptyMap(store, builtin10.DefaultHamtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State.PendingTxns = em
+
+ return &out, nil
+}
+
+type state10 struct {
+ msig10.State
+ store adt.Store
+}
+
+func (s *state10) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) {
+ return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil
+}
+
+func (s *state10) StartEpoch() (abi.ChainEpoch, error) {
+ return s.State.StartEpoch, nil
+}
+
+func (s *state10) UnlockDuration() (abi.ChainEpoch, error) {
+ return s.State.UnlockDuration, nil
+}
+
+func (s *state10) InitialBalance() (abi.TokenAmount, error) {
+ return s.State.InitialBalance, nil
+}
+
+func (s *state10) Threshold() (uint64, error) {
+ return s.State.NumApprovalsThreshold, nil
+}
+
+func (s *state10) Signers() ([]address.Address, error) {
+ return s.State.Signers, nil
+}
+
+func (s *state10) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error {
+ arr, err := adt10.AsMap(s.store, s.State.PendingTxns, builtin10.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+ var out msig10.Transaction
+ return arr.ForEach(&out, func(key string) error {
+ txid, n := binary.Varint([]byte(key))
+ if n <= 0 {
+ return xerrors.Errorf("invalid pending transaction key: %v", key)
+ }
+ return cb(txid, (Transaction)(out)) //nolint:unconvert
+ })
+}
+
+func (s *state10) PendingTxnChanged(other State) (bool, error) {
+ other10, ok := other.(*state10)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+ return !s.State.PendingTxns.Equals(other10.PendingTxns), nil
+}
+
+func (s *state10) transactions() (adt.Map, error) {
+ return adt10.AsMap(s.store, s.PendingTxns, builtin10.DefaultHamtBitwidth)
+}
+
+func (s *state10) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
+ var tx msig10.Transaction
+ if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return Transaction{}, err
+ }
+ return Transaction(tx), nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v2.go b/chain/actors/builtin/multisig/v2.go
index 14e895680..2d72b3215 100644
--- a/chain/actors/builtin/multisig/v2.go
+++ b/chain/actors/builtin/multisig/v2.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,9 +11,11 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
msig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig"
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -114,3 +117,20 @@ func (s *state2) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state2) GetState() interface{} {
return &s.State
}
+
+func (s *state2) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v3.go b/chain/actors/builtin/multisig/v3.go
index 5cde148c1..bd45ecdaa 100644
--- a/chain/actors/builtin/multisig/v3.go
+++ b/chain/actors/builtin/multisig/v3.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,10 +11,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
msig3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/multisig"
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -115,3 +118,20 @@ func (s *state3) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state3) GetState() interface{} {
return &s.State
}
+
+func (s *state3) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v4.go b/chain/actors/builtin/multisig/v4.go
index 87936661d..1f5f2a9ce 100644
--- a/chain/actors/builtin/multisig/v4.go
+++ b/chain/actors/builtin/multisig/v4.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,10 +11,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
msig4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig"
adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -115,3 +118,20 @@ func (s *state4) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state4) GetState() interface{} {
return &s.State
}
+
+func (s *state4) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v5.go b/chain/actors/builtin/multisig/v5.go
index d50638ca5..bf4a58cbf 100644
--- a/chain/actors/builtin/multisig/v5.go
+++ b/chain/actors/builtin/multisig/v5.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,10 +11,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig"
adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -115,3 +118,20 @@ func (s *state5) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state5) GetState() interface{} {
return &s.State
}
+
+func (s *state5) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v6.go b/chain/actors/builtin/multisig/v6.go
index 9246eeaa9..f5c6f66bb 100644
--- a/chain/actors/builtin/multisig/v6.go
+++ b/chain/actors/builtin/multisig/v6.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,10 +11,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig"
adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -115,3 +118,20 @@ func (s *state6) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state6) GetState() interface{} {
return &s.State
}
+
+func (s *state6) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v7.go b/chain/actors/builtin/multisig/v7.go
index a6b630179..e75865841 100644
--- a/chain/actors/builtin/multisig/v7.go
+++ b/chain/actors/builtin/multisig/v7.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,10 +11,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig"
adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -115,3 +118,20 @@ func (s *state7) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state7) GetState() interface{} {
return &s.State
}
+
+func (s *state7) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v8.go b/chain/actors/builtin/multisig/v8.go
index 6311583b3..677f4ffe9 100644
--- a/chain/actors/builtin/multisig/v8.go
+++ b/chain/actors/builtin/multisig/v8.go
@@ -3,6 +3,7 @@ package multisig
import (
"bytes"
"encoding/binary"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -10,10 +11,12 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin8 "github.com/filecoin-project/go-state-types/builtin"
msig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -115,3 +118,20 @@ func (s *state8) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
func (s *state8) GetState() interface{} {
return &s.State
}
+
+func (s *state8) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/multisig/v9.go b/chain/actors/builtin/multisig/v9.go
new file mode 100644
index 000000000..2700470d3
--- /dev/null
+++ b/chain/actors/builtin/multisig/v9.go
@@ -0,0 +1,137 @@
+package multisig
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin9 "github.com/filecoin-project/go-state-types/builtin"
+ msig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) {
+ out := state9{store: store}
+ out.State = msig9.State{}
+ out.State.Signers = signers
+ out.State.NumApprovalsThreshold = threshold
+ out.State.StartEpoch = startEpoch
+ out.State.UnlockDuration = unlockDuration
+ out.State.InitialBalance = initialBalance
+
+ em, err := adt9.StoreEmptyMap(store, builtin9.DefaultHamtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State.PendingTxns = em
+
+ return &out, nil
+}
+
+type state9 struct {
+ msig9.State
+ store adt.Store
+}
+
+func (s *state9) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) {
+ return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil
+}
+
+func (s *state9) StartEpoch() (abi.ChainEpoch, error) {
+ return s.State.StartEpoch, nil
+}
+
+func (s *state9) UnlockDuration() (abi.ChainEpoch, error) {
+ return s.State.UnlockDuration, nil
+}
+
+func (s *state9) InitialBalance() (abi.TokenAmount, error) {
+ return s.State.InitialBalance, nil
+}
+
+func (s *state9) Threshold() (uint64, error) {
+ return s.State.NumApprovalsThreshold, nil
+}
+
+func (s *state9) Signers() ([]address.Address, error) {
+ return s.State.Signers, nil
+}
+
+func (s *state9) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error {
+ arr, err := adt9.AsMap(s.store, s.State.PendingTxns, builtin9.DefaultHamtBitwidth)
+ if err != nil {
+ return err
+ }
+ var out msig9.Transaction
+ return arr.ForEach(&out, func(key string) error {
+ txid, n := binary.Varint([]byte(key))
+ if n <= 0 {
+ return xerrors.Errorf("invalid pending transaction key: %v", key)
+ }
+ return cb(txid, (Transaction)(out)) //nolint:unconvert
+ })
+}
+
+func (s *state9) PendingTxnChanged(other State) (bool, error) {
+ other9, ok := other.(*state9)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+ return !s.State.PendingTxns.Equals(other9.PendingTxns), nil
+}
+
+func (s *state9) transactions() (adt.Map, error) {
+ return adt9.AsMap(s.store, s.PendingTxns, builtin9.DefaultHamtBitwidth)
+}
+
+func (s *state9) decodeTransaction(val *cbg.Deferred) (Transaction, error) {
+ var tx msig9.Transaction
+ if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return Transaction{}, err
+ }
+ return Transaction(tx), nil
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) ActorKey() string {
+ return actors.MultisigKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/actor.go.template b/chain/actors/builtin/paych/actor.go.template
index a815c880e..4250b4770 100644
--- a/chain/actors/builtin/paych/actor.go.template
+++ b/chain/actors/builtin/paych/actor.go.template
@@ -1,6 +1,9 @@
package paych
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/ipfs/go-cid"
"encoding/base64"
"fmt"
@@ -35,7 +38,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -58,6 +61,11 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
// versions
type State interface {
cbor.Marshaler
+
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
// Channel owner, who has funded the actor
From() (address.Address, error)
// Recipient of payouts from channel
@@ -99,10 +107,10 @@ func DecodeSignedVoucher(s string) (*paychtypes.SignedVoucher, error) {
return &sv, nil
}
-func Message(version actors.Version, from address.Address) MessageBuilder {
+func Message(version actorstypes.Version, from address.Address) MessageBuilder {
switch version {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return message{{.}}{from}
{{end}}
default:
@@ -131,4 +139,11 @@ func toV0SignedVoucher(sv paychtypes.SignedVoucher) paych0.SignedVoucher {
Merges: nil,
Signature: sv.Signature,
}
-}
\ No newline at end of file
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/paych/message.go.template b/chain/actors/builtin/paych/message.go.template
index 9e92bf748..79aed1692 100644
--- a/chain/actors/builtin/paych/message.go.template
+++ b/chain/actors/builtin/paych/message.go.template
@@ -14,9 +14,10 @@ import (
init{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/init"
paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych"
{{else}}
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin{{.v}} "github.com/filecoin-project/go-state-types/builtin"
- paych{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/paych"
- init{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/init"
+ paych{{.v}} "github.com/filecoin-project/go-state-types/builtin/v{{.v}}/paych"
+ init{{.v}} "github.com/filecoin-project/go-state-types/builtin/v{{.v}}/init"
{{end}}
@@ -31,7 +32,7 @@ func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount)
{{if (le .v 7)}}
actorCodeID := builtin{{.v}}.PaymentChannelActorCodeID
{{else}}
- actorCodeID, ok := actors.GetActorCodeID(actors.Version{{.v}}, "paymentchannel")
+ actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version{{.v}}, "paymentchannel")
if !ok {
return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", {{.v}})
}
@@ -62,8 +63,10 @@ func (m message{{.v}}) Update(paych address.Address, sv *paychtypes.SignedVouche
params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{
{{if (le .v 6)}}
Sv: toV0SignedVoucher(*sv),
- {{else}}
+ {{else if (le .v 8)}}
Sv: *sv,
+ {{else}}
+ Sv: toV{{.v}}SignedVoucher(*sv),
{{end}}
Secret: secret,
})
@@ -80,6 +83,32 @@ func (m message{{.v}}) Update(paych address.Address, sv *paychtypes.SignedVouche
}, nil
}
+{{if (ge .v 9)}}
+ func toV{{.v}}SignedVoucher(sv paychtypes.SignedVoucher) paych{{.v}}.SignedVoucher {
+ merges := make([]paych{{.v}}.Merge, len(sv.Merges))
+ for i := range sv.Merges {
+ merges[i] = paych{{.v}}.Merge{
+ Lane: sv.Merges[i].Lane,
+ Nonce: sv.Merges[i].Nonce,
+ }
+ }
+
+ return paych{{.v}}.SignedVoucher{
+ ChannelAddr: sv.ChannelAddr,
+ TimeLockMin: sv.TimeLockMin,
+ TimeLockMax: sv.TimeLockMax,
+ SecretHash: sv.SecretHash,
+ Extra: (*paych{{.v}}.ModVerifyParams)(sv.Extra),
+ Lane: sv.Lane,
+ Nonce: sv.Nonce,
+ Amount: sv.Amount,
+ MinSettleHeight: sv.MinSettleHeight,
+ Merges: merges,
+ Signature: sv.Signature,
+ }
+ }
+{{end}}
+
func (m message{{.v}}) Settle(paych address.Address) (*types.Message, error) {
return &types.Message{
To: paych,
diff --git a/chain/actors/builtin/paych/message10.go b/chain/actors/builtin/paych/message10.go
new file mode 100644
index 000000000..03daa7bcf
--- /dev/null
+++ b/chain/actors/builtin/paych/message10.go
@@ -0,0 +1,109 @@
+package paych
+
+import (
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ init10 "github.com/filecoin-project/go-state-types/builtin/v10/init"
+ paych10 "github.com/filecoin-project/go-state-types/builtin/v10/paych"
+ paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+type message10 struct{ from address.Address }
+
+func (m message10) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) {
+
+ actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version10, "paymentchannel")
+ if !ok {
+ return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", 10)
+ }
+
+ params, aerr := actors.SerializeParams(&paych10.ConstructorParams{From: m.from, To: to})
+ if aerr != nil {
+ return nil, aerr
+ }
+ enc, aerr := actors.SerializeParams(&init10.ExecParams{
+ CodeCID: actorCodeID,
+ ConstructorParams: params,
+ })
+ if aerr != nil {
+ return nil, aerr
+ }
+
+ return &types.Message{
+ To: init_.Address,
+ From: m.from,
+ Value: initialAmount,
+ Method: builtin10.MethodsInit.Exec,
+ Params: enc,
+ }, nil
+}
+
+func (m message10) Update(paych address.Address, sv *paychtypes.SignedVoucher, secret []byte) (*types.Message, error) {
+ params, aerr := actors.SerializeParams(&paych10.UpdateChannelStateParams{
+
+ Sv: toV10SignedVoucher(*sv),
+
+ Secret: secret,
+ })
+ if aerr != nil {
+ return nil, aerr
+ }
+
+ return &types.Message{
+ To: paych,
+ From: m.from,
+ Value: abi.NewTokenAmount(0),
+ Method: builtin10.MethodsPaych.UpdateChannelState,
+ Params: params,
+ }, nil
+}
+
+func toV10SignedVoucher(sv paychtypes.SignedVoucher) paych10.SignedVoucher {
+ merges := make([]paych10.Merge, len(sv.Merges))
+ for i := range sv.Merges {
+ merges[i] = paych10.Merge{
+ Lane: sv.Merges[i].Lane,
+ Nonce: sv.Merges[i].Nonce,
+ }
+ }
+
+ return paych10.SignedVoucher{
+ ChannelAddr: sv.ChannelAddr,
+ TimeLockMin: sv.TimeLockMin,
+ TimeLockMax: sv.TimeLockMax,
+ SecretHash: sv.SecretHash,
+ Extra: (*paych10.ModVerifyParams)(sv.Extra),
+ Lane: sv.Lane,
+ Nonce: sv.Nonce,
+ Amount: sv.Amount,
+ MinSettleHeight: sv.MinSettleHeight,
+ Merges: merges,
+ Signature: sv.Signature,
+ }
+}
+
+func (m message10) Settle(paych address.Address) (*types.Message, error) {
+ return &types.Message{
+ To: paych,
+ From: m.from,
+ Value: abi.NewTokenAmount(0),
+ Method: builtin10.MethodsPaych.Settle,
+ }, nil
+}
+
+func (m message10) Collect(paych address.Address) (*types.Message, error) {
+ return &types.Message{
+ To: paych,
+ From: m.from,
+ Value: abi.NewTokenAmount(0),
+ Method: builtin10.MethodsPaych.Collect,
+ }, nil
+}
diff --git a/chain/actors/builtin/paych/message8.go b/chain/actors/builtin/paych/message8.go
index 3fb743bc9..a72c5fbb3 100644
--- a/chain/actors/builtin/paych/message8.go
+++ b/chain/actors/builtin/paych/message8.go
@@ -5,6 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin8 "github.com/filecoin-project/go-state-types/builtin"
init8 "github.com/filecoin-project/go-state-types/builtin/v8/init"
paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych"
@@ -19,7 +20,7 @@ type message8 struct{ from address.Address }
func (m message8) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) {
- actorCodeID, ok := actors.GetActorCodeID(actors.Version8, "paymentchannel")
+ actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version8, "paymentchannel")
if !ok {
return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", 8)
}
diff --git a/chain/actors/builtin/paych/message9.go b/chain/actors/builtin/paych/message9.go
new file mode 100644
index 000000000..350c760ea
--- /dev/null
+++ b/chain/actors/builtin/paych/message9.go
@@ -0,0 +1,109 @@
+package paych
+
+import (
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin9 "github.com/filecoin-project/go-state-types/builtin"
+ paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ init9 "github.com/filecoin-project/go-state-types/builtin/v9/init"
+ paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+type message9 struct{ from address.Address }
+
+func (m message9) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) {
+
+ actorCodeID, ok := actors.GetActorCodeID(actorstypes.Version9, "paymentchannel")
+ if !ok {
+ return nil, xerrors.Errorf("error getting actor paymentchannel code id for actor version %d", 9)
+ }
+
+ params, aerr := actors.SerializeParams(&paych9.ConstructorParams{From: m.from, To: to})
+ if aerr != nil {
+ return nil, aerr
+ }
+ enc, aerr := actors.SerializeParams(&init9.ExecParams{
+ CodeCID: actorCodeID,
+ ConstructorParams: params,
+ })
+ if aerr != nil {
+ return nil, aerr
+ }
+
+ return &types.Message{
+ To: init_.Address,
+ From: m.from,
+ Value: initialAmount,
+ Method: builtin9.MethodsInit.Exec,
+ Params: enc,
+ }, nil
+}
+
+func (m message9) Update(paych address.Address, sv *paychtypes.SignedVoucher, secret []byte) (*types.Message, error) {
+ params, aerr := actors.SerializeParams(&paych9.UpdateChannelStateParams{
+
+ Sv: toV9SignedVoucher(*sv),
+
+ Secret: secret,
+ })
+ if aerr != nil {
+ return nil, aerr
+ }
+
+ return &types.Message{
+ To: paych,
+ From: m.from,
+ Value: abi.NewTokenAmount(0),
+ Method: builtin9.MethodsPaych.UpdateChannelState,
+ Params: params,
+ }, nil
+}
+
+func toV9SignedVoucher(sv paychtypes.SignedVoucher) paych9.SignedVoucher {
+ merges := make([]paych9.Merge, len(sv.Merges))
+ for i := range sv.Merges {
+ merges[i] = paych9.Merge{
+ Lane: sv.Merges[i].Lane,
+ Nonce: sv.Merges[i].Nonce,
+ }
+ }
+
+ return paych9.SignedVoucher{
+ ChannelAddr: sv.ChannelAddr,
+ TimeLockMin: sv.TimeLockMin,
+ TimeLockMax: sv.TimeLockMax,
+ SecretHash: sv.SecretHash,
+ Extra: (*paych9.ModVerifyParams)(sv.Extra),
+ Lane: sv.Lane,
+ Nonce: sv.Nonce,
+ Amount: sv.Amount,
+ MinSettleHeight: sv.MinSettleHeight,
+ Merges: merges,
+ Signature: sv.Signature,
+ }
+}
+
+func (m message9) Settle(paych address.Address) (*types.Message, error) {
+ return &types.Message{
+ To: paych,
+ From: m.from,
+ Value: abi.NewTokenAmount(0),
+ Method: builtin9.MethodsPaych.Settle,
+ }, nil
+}
+
+func (m message9) Collect(paych address.Address) (*types.Message, error) {
+ return &types.Message{
+ To: paych,
+ From: m.from,
+ Value: abi.NewTokenAmount(0),
+ Method: builtin9.MethodsPaych.Collect,
+ }, nil
+}
diff --git a/chain/actors/builtin/paych/mock/mock.go b/chain/actors/builtin/paych/mock/mock.go
index 729db5924..8b8624ac8 100644
--- a/chain/actors/builtin/paych/mock/mock.go
+++ b/chain/actors/builtin/paych/mock/mock.go
@@ -3,10 +3,14 @@ package mock
import (
"io"
+ "github.com/ipfs/go-cid"
+
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/builtin/paych"
)
@@ -18,6 +22,18 @@ type mockState struct {
lanes map[uint64]paych.LaneState
}
+func (ms *mockState) Code() cid.Cid {
+ panic("paych mock does not have CID")
+}
+
+func (ms *mockState) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (ms *mockState) ActorVersion() actorstypes.Version {
+ panic("paych mock is unversioned")
+}
+
func (ms *mockState) GetState() interface{} {
panic("implement me")
}
diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go
index 20d9d2552..537ae8d92 100644
--- a/chain/actors/builtin/paych/paych.go
+++ b/chain/actors/builtin/paych/paych.go
@@ -4,11 +4,13 @@ import (
"encoding/base64"
"fmt"
+ "github.com/ipfs/go-cid"
ipldcbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paychtypes "github.com/filecoin-project/go-state-types/builtin/v8/paych"
"github.com/filecoin-project/go-state-types/cbor"
@@ -35,9 +37,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -73,6 +81,11 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
// versions
type State interface {
cbor.Marshaler
+
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
// Channel owner, who has funded the actor
From() (address.Address, error)
// Recipient of payouts from channel
@@ -114,33 +127,39 @@ func DecodeSignedVoucher(s string) (*paychtypes.SignedVoucher, error) {
return &sv, nil
}
-func Message(version actors.Version, from address.Address) MessageBuilder {
+func Message(version actorstypes.Version, from address.Address) MessageBuilder {
switch version {
- case actors.Version0:
+ case actorstypes.Version0:
return message0{from}
- case actors.Version2:
+ case actorstypes.Version2:
return message2{from}
- case actors.Version3:
+ case actorstypes.Version3:
return message3{from}
- case actors.Version4:
+ case actorstypes.Version4:
return message4{from}
- case actors.Version5:
+ case actorstypes.Version5:
return message5{from}
- case actors.Version6:
+ case actorstypes.Version6:
return message6{from}
- case actors.Version7:
+ case actorstypes.Version7:
return message7{from}
- case actors.Version8:
+ case actorstypes.Version8:
return message8{from}
+ case actorstypes.Version9:
+ return message9{from}
+
+ case actorstypes.Version10:
+ return message10{from}
+
default:
panic(fmt.Sprintf("unsupported actors version: %d", version))
}
@@ -168,3 +187,18 @@ func toV0SignedVoucher(sv paychtypes.SignedVoucher) paych0.SignedVoucher {
Signature: sv.Signature,
}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/paych/state.go.template b/chain/actors/builtin/paych/state.go.template
index c3954ce81..c00f7dc56 100644
--- a/chain/actors/builtin/paych/state.go.template
+++ b/chain/actors/builtin/paych/state.go.template
@@ -1,6 +1,8 @@
package paych
import (
+ "fmt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
@@ -8,6 +10,7 @@ import (
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
{{if (le .v 7)}}
paych{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/paych"
@@ -117,3 +120,20 @@ func (ls *laneState{{.v}}) Redeemed() (big.Int, error) {
func (ls *laneState{{.v}}) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v0.go b/chain/actors/builtin/paych/v0.go
index 727525c50..8cdc27c39 100644
--- a/chain/actors/builtin/paych/v0.go
+++ b/chain/actors/builtin/paych/v0.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych"
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState0) Redeemed() (big.Int, error) {
func (ls *laneState0) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state0) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v10.go b/chain/actors/builtin/paych/v10.go
new file mode 100644
index 000000000..0527c36d1
--- /dev/null
+++ b/chain/actors/builtin/paych/v10.go
@@ -0,0 +1,134 @@
+package paych
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/big"
+ paych10 "github.com/filecoin-project/go-state-types/builtin/v10/paych"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store) (State, error) {
+ out := state10{store: store}
+ out.State = paych10.State{}
+ return &out, nil
+}
+
+type state10 struct {
+ paych10.State
+ store adt.Store
+ lsAmt *adt10.Array
+}
+
+// Channel owner, who has funded the actor
+func (s *state10) From() (address.Address, error) {
+ return s.State.From, nil
+}
+
+// Recipient of payouts from channel
+func (s *state10) To() (address.Address, error) {
+ return s.State.To, nil
+}
+
+// Height at which the channel can be `Collected`
+func (s *state10) SettlingAt() (abi.ChainEpoch, error) {
+ return s.State.SettlingAt, nil
+}
+
+// Amount successfully redeemed through the payment channel, paid out on `Collect()`
+func (s *state10) ToSend() (abi.TokenAmount, error) {
+ return s.State.ToSend, nil
+}
+
+func (s *state10) getOrLoadLsAmt() (*adt10.Array, error) {
+ if s.lsAmt != nil {
+ return s.lsAmt, nil
+ }
+
+ // Get the lane state from the chain
+ lsamt, err := adt10.AsArray(s.store, s.State.LaneStates, paych10.LaneStatesAmtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ s.lsAmt = lsamt
+ return lsamt, nil
+}
+
+// Get total number of lanes
+func (s *state10) LaneCount() (uint64, error) {
+ lsamt, err := s.getOrLoadLsAmt()
+ if err != nil {
+ return 0, err
+ }
+ return lsamt.Length(), nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+// Iterate lane states
+func (s *state10) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error {
+ // Get the lane state from the chain
+ lsamt, err := s.getOrLoadLsAmt()
+ if err != nil {
+ return err
+ }
+
+ // Note: we use a map instead of an array to store laneStates because the
+ // client sets the lane ID (the index) and potentially they could use a
+ // very large index.
+ var ls paych10.LaneState
+ return lsamt.ForEach(&ls, func(i int64) error {
+ return cb(uint64(i), &laneState10{ls})
+ })
+}
+
+type laneState10 struct {
+ paych10.LaneState
+}
+
+func (ls *laneState10) Redeemed() (big.Int, error) {
+ return ls.LaneState.Redeemed, nil
+}
+
+func (ls *laneState10) Nonce() (uint64, error) {
+ return ls.LaneState.Nonce, nil
+}
+
+func (s *state10) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v2.go b/chain/actors/builtin/paych/v2.go
index 5852c9a64..ae94adc17 100644
--- a/chain/actors/builtin/paych/v2.go
+++ b/chain/actors/builtin/paych/v2.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/paych"
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState2) Redeemed() (big.Int, error) {
func (ls *laneState2) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state2) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v3.go b/chain/actors/builtin/paych/v3.go
index 5297e9d10..5c57ea729 100644
--- a/chain/actors/builtin/paych/v3.go
+++ b/chain/actors/builtin/paych/v3.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/paych"
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState3) Redeemed() (big.Int, error) {
func (ls *laneState3) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state3) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v4.go b/chain/actors/builtin/paych/v4.go
index be10061bf..b243be2e3 100644
--- a/chain/actors/builtin/paych/v4.go
+++ b/chain/actors/builtin/paych/v4.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/paych"
adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState4) Redeemed() (big.Int, error) {
func (ls *laneState4) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state4) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v5.go b/chain/actors/builtin/paych/v5.go
index 37a917273..b3b9ad50e 100644
--- a/chain/actors/builtin/paych/v5.go
+++ b/chain/actors/builtin/paych/v5.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/paych"
adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState5) Redeemed() (big.Int, error) {
func (ls *laneState5) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state5) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v6.go b/chain/actors/builtin/paych/v6.go
index 36676d9de..a3b80c8e1 100644
--- a/chain/actors/builtin/paych/v6.go
+++ b/chain/actors/builtin/paych/v6.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych"
adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState6) Redeemed() (big.Int, error) {
func (ls *laneState6) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state6) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go
index 88b6f2b84..bb6721b01 100644
--- a/chain/actors/builtin/paych/v7.go
+++ b/chain/actors/builtin/paych/v7.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych"
adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState7) Redeemed() (big.Int, error) {
func (ls *laneState7) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state7) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v8.go b/chain/actors/builtin/paych/v8.go
index 1961e69ec..fc6853cad 100644
--- a/chain/actors/builtin/paych/v8.go
+++ b/chain/actors/builtin/paych/v8.go
@@ -1,14 +1,18 @@
package paych
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -111,3 +115,20 @@ func (ls *laneState8) Redeemed() (big.Int, error) {
func (ls *laneState8) Nonce() (uint64, error) {
return ls.LaneState.Nonce, nil
}
+
+func (s *state8) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/paych/v9.go b/chain/actors/builtin/paych/v9.go
new file mode 100644
index 000000000..817541dfb
--- /dev/null
+++ b/chain/actors/builtin/paych/v9.go
@@ -0,0 +1,134 @@
+package paych
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/big"
+ paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store) (State, error) {
+ out := state9{store: store}
+ out.State = paych9.State{}
+ return &out, nil
+}
+
+type state9 struct {
+ paych9.State
+ store adt.Store
+ lsAmt *adt9.Array
+}
+
+// Channel owner, who has funded the actor
+func (s *state9) From() (address.Address, error) {
+ return s.State.From, nil
+}
+
+// Recipient of payouts from channel
+func (s *state9) To() (address.Address, error) {
+ return s.State.To, nil
+}
+
+// Height at which the channel can be `Collected`
+func (s *state9) SettlingAt() (abi.ChainEpoch, error) {
+ return s.State.SettlingAt, nil
+}
+
+// Amount successfully redeemed through the payment channel, paid out on `Collect()`
+func (s *state9) ToSend() (abi.TokenAmount, error) {
+ return s.State.ToSend, nil
+}
+
+func (s *state9) getOrLoadLsAmt() (*adt9.Array, error) {
+ if s.lsAmt != nil {
+ return s.lsAmt, nil
+ }
+
+ // Get the lane state from the chain
+ lsamt, err := adt9.AsArray(s.store, s.State.LaneStates, paych9.LaneStatesAmtBitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ s.lsAmt = lsamt
+ return lsamt, nil
+}
+
+// Get total number of lanes
+func (s *state9) LaneCount() (uint64, error) {
+ lsamt, err := s.getOrLoadLsAmt()
+ if err != nil {
+ return 0, err
+ }
+ return lsamt.Length(), nil
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+// Iterate lane states
+func (s *state9) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error {
+ // Get the lane state from the chain
+ lsamt, err := s.getOrLoadLsAmt()
+ if err != nil {
+ return err
+ }
+
+ // Note: we use a map instead of an array to store laneStates because the
+ // client sets the lane ID (the index) and potentially they could use a
+ // very large index.
+ var ls paych9.LaneState
+ return lsamt.ForEach(&ls, func(i int64) error {
+ return cb(uint64(i), &laneState9{ls})
+ })
+}
+
+type laneState9 struct {
+ paych9.LaneState
+}
+
+func (ls *laneState9) Redeemed() (big.Int, error) {
+ return ls.LaneState.Redeemed, nil
+}
+
+func (ls *laneState9) Nonce() (uint64, error) {
+ return ls.LaneState.Nonce, nil
+}
+
+func (s *state9) ActorKey() string {
+ return actors.PaychKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/actor.go.template b/chain/actors/builtin/power/actor.go.template
index af9190357..0a4d70f46 100644
--- a/chain/actors/builtin/power/actor.go.template
+++ b/chain/actors/builtin/power/actor.go.template
@@ -1,6 +1,8 @@
package power
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/lotus/chain/actors"
@@ -17,10 +19,9 @@ import (
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
)
var (
@@ -37,7 +38,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -56,10 +57,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store)
{{end}}
}
@@ -69,6 +70,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) {
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
TotalLocked() (abi.TokenAmount, error)
TotalPower() (Claim, error)
TotalCommitted() (Claim, error)
@@ -109,3 +114,10 @@ func AddClaims(a Claim, b Claim) Claim {
QualityAdjPower: big.Add(a.QualityAdjPower, b.QualityAdjPower),
}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go
index 2f1cfa22f..893a25cd7 100644
--- a/chain/actors/builtin/power/power.go
+++ b/chain/actors/builtin/power/power.go
@@ -1,13 +1,15 @@
package power
import (
+ "github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/go-state-types/cbor"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
@@ -24,8 +26,8 @@ import (
)
var (
- Address = builtin8.StoragePowerActorAddr
- Methods = builtin8.MethodsPower
+ Address = builtin10.StoragePowerActorAddr
+ Methods = builtin10.MethodsPower
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -36,9 +38,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -70,33 +78,39 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store)
+ case actorstypes.Version9:
+ return make9(store)
+
+ case actorstypes.Version10:
+ return make10(store)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
@@ -104,6 +118,10 @@ func MakeState(store adt.Store, av actors.Version) (State, error) {
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
TotalLocked() (abi.TokenAmount, error)
TotalPower() (Claim, error)
TotalCommitted() (Claim, error)
@@ -144,3 +162,18 @@ func AddClaims(a Claim, b Claim) Claim {
QualityAdjPower: big.Add(a.QualityAdjPower, b.QualityAdjPower),
}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/power/state.go.template b/chain/actors/builtin/power/state.go.template
index b53ba68c8..8c2a8ce97 100644
--- a/chain/actors/builtin/power/state.go.template
+++ b/chain/actors/builtin/power/state.go.template
@@ -1,6 +1,8 @@
package power
import (
+ "fmt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"bytes"
"github.com/filecoin-project/go-address"
@@ -8,6 +10,7 @@ import (
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
@@ -20,7 +23,7 @@ import (
{{else}}
builtin{{.v}} "github.com/filecoin-project/go-state-types/builtin"
power{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}power"
- adt{{.v}} "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ adt{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}util/adt"
{{end}}
)
@@ -205,3 +208,20 @@ func fromV{{.v}}Claim(v{{.v}} power{{.v}}.Claim) Claim {
QualityAdjPower: v{{.v}}.QualityAdjPower,
}
}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v0.go b/chain/actors/builtin/power/v0.go
index 5ae42b4df..56982e77b 100644
--- a/chain/actors/builtin/power/v0.go
+++ b/chain/actors/builtin/power/v0.go
@@ -2,15 +2,18 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
power0 "github.com/filecoin-project/specs-actors/actors/builtin/power"
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -188,3 +191,20 @@ func fromV0Claim(v0 power0.Claim) Claim {
QualityAdjPower: v0.QualityAdjPower,
}
}
+
+func (s *state0) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v10.go b/chain/actors/builtin/power/v10.go
new file mode 100644
index 000000000..7359ca947
--- /dev/null
+++ b/chain/actors/builtin/power/v10.go
@@ -0,0 +1,206 @@
+package power
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ power10 "github.com/filecoin-project/go-state-types/builtin/v10/power"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store) (State, error) {
+ out := state10{store: store}
+
+ s, err := power10.ConstructState(store)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state10 struct {
+ power10.State
+ store adt.Store
+}
+
+func (s *state10) TotalLocked() (abi.TokenAmount, error) {
+ return s.TotalPledgeCollateral, nil
+}
+
+func (s *state10) TotalPower() (Claim, error) {
+ return Claim{
+ RawBytePower: s.TotalRawBytePower,
+ QualityAdjPower: s.TotalQualityAdjPower,
+ }, nil
+}
+
+// Committed power to the network. Includes miners below the minimum threshold.
+func (s *state10) TotalCommitted() (Claim, error) {
+ return Claim{
+ RawBytePower: s.TotalBytesCommitted,
+ QualityAdjPower: s.TotalQABytesCommitted,
+ }, nil
+}
+
+func (s *state10) MinerPower(addr address.Address) (Claim, bool, error) {
+ claims, err := s.claims()
+ if err != nil {
+ return Claim{}, false, err
+ }
+ var claim power10.Claim
+ ok, err := claims.Get(abi.AddrKey(addr), &claim)
+ if err != nil {
+ return Claim{}, false, err
+ }
+ return Claim{
+ RawBytePower: claim.RawBytePower,
+ QualityAdjPower: claim.QualityAdjPower,
+ }, ok, nil
+}
+
+func (s *state10) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) {
+ return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a)
+}
+
+func (s *state10) TotalPowerSmoothed() (builtin.FilterEstimate, error) {
+ return builtin.FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil
+}
+
+func (s *state10) MinerCounts() (uint64, uint64, error) {
+ return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil
+}
+
+func (s *state10) ListAllMiners() ([]address.Address, error) {
+ claims, err := s.claims()
+ if err != nil {
+ return nil, err
+ }
+
+ var miners []address.Address
+ err = claims.ForEach(nil, func(k string) error {
+ a, err := address.NewFromBytes([]byte(k))
+ if err != nil {
+ return err
+ }
+ miners = append(miners, a)
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ return miners, nil
+}
+
+func (s *state10) ForEachClaim(cb func(miner address.Address, claim Claim) error) error {
+ claims, err := s.claims()
+ if err != nil {
+ return err
+ }
+
+ var claim power10.Claim
+ return claims.ForEach(&claim, func(k string) error {
+ a, err := address.NewFromBytes([]byte(k))
+ if err != nil {
+ return err
+ }
+ return cb(a, Claim{
+ RawBytePower: claim.RawBytePower,
+ QualityAdjPower: claim.QualityAdjPower,
+ })
+ })
+}
+
+func (s *state10) ClaimsChanged(other State) (bool, error) {
+ other10, ok := other.(*state10)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+ return !s.State.Claims.Equals(other10.State.Claims), nil
+}
+
+func (s *state10) SetTotalQualityAdjPower(p abi.StoragePower) error {
+ s.State.TotalQualityAdjPower = p
+ return nil
+}
+
+func (s *state10) SetTotalRawBytePower(p abi.StoragePower) error {
+ s.State.TotalRawBytePower = p
+ return nil
+}
+
+func (s *state10) SetThisEpochQualityAdjPower(p abi.StoragePower) error {
+ s.State.ThisEpochQualityAdjPower = p
+ return nil
+}
+
+func (s *state10) SetThisEpochRawBytePower(p abi.StoragePower) error {
+ s.State.ThisEpochRawBytePower = p
+ return nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) claims() (adt.Map, error) {
+ return adt10.AsMap(s.store, s.Claims, builtin10.DefaultHamtBitwidth)
+}
+
+func (s *state10) decodeClaim(val *cbg.Deferred) (Claim, error) {
+ var ci power10.Claim
+ if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return Claim{}, err
+ }
+ return fromV10Claim(ci), nil
+}
+
+func fromV10Claim(v10 power10.Claim) Claim {
+ return Claim{
+ RawBytePower: v10.RawBytePower,
+ QualityAdjPower: v10.QualityAdjPower,
+ }
+}
+
+func (s *state10) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v2.go b/chain/actors/builtin/power/v2.go
index 485819e3e..b4e253024 100644
--- a/chain/actors/builtin/power/v2.go
+++ b/chain/actors/builtin/power/v2.go
@@ -2,15 +2,18 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power"
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -188,3 +191,20 @@ func fromV2Claim(v2 power2.Claim) Claim {
QualityAdjPower: v2.QualityAdjPower,
}
}
+
+func (s *state2) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v3.go b/chain/actors/builtin/power/v3.go
index e33ee2bb5..2b2b75ae7 100644
--- a/chain/actors/builtin/power/v3.go
+++ b/chain/actors/builtin/power/v3.go
@@ -2,16 +2,19 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
power3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/power"
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -184,3 +187,20 @@ func fromV3Claim(v3 power3.Claim) Claim {
QualityAdjPower: v3.QualityAdjPower,
}
}
+
+func (s *state3) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v4.go b/chain/actors/builtin/power/v4.go
index e5c446f07..c40dad92a 100644
--- a/chain/actors/builtin/power/v4.go
+++ b/chain/actors/builtin/power/v4.go
@@ -2,16 +2,19 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power"
adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -184,3 +187,20 @@ func fromV4Claim(v4 power4.Claim) Claim {
QualityAdjPower: v4.QualityAdjPower,
}
}
+
+func (s *state4) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v5.go b/chain/actors/builtin/power/v5.go
index aaf248058..5d740a40b 100644
--- a/chain/actors/builtin/power/v5.go
+++ b/chain/actors/builtin/power/v5.go
@@ -2,16 +2,19 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
power5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/power"
adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -184,3 +187,20 @@ func fromV5Claim(v5 power5.Claim) Claim {
QualityAdjPower: v5.QualityAdjPower,
}
}
+
+func (s *state5) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v6.go b/chain/actors/builtin/power/v6.go
index 072def6e2..45c0db9e8 100644
--- a/chain/actors/builtin/power/v6.go
+++ b/chain/actors/builtin/power/v6.go
@@ -2,16 +2,19 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
power6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/power"
adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -184,3 +187,20 @@ func fromV6Claim(v6 power6.Claim) Claim {
QualityAdjPower: v6.QualityAdjPower,
}
}
+
+func (s *state6) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go
index 0c60b03a0..314318263 100644
--- a/chain/actors/builtin/power/v7.go
+++ b/chain/actors/builtin/power/v7.go
@@ -2,16 +2,19 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power"
adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -184,3 +187,20 @@ func fromV7Claim(v7 power7.Claim) Claim {
QualityAdjPower: v7.QualityAdjPower,
}
}
+
+func (s *state7) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v8.go b/chain/actors/builtin/power/v8.go
index c23da6904..a462b2600 100644
--- a/chain/actors/builtin/power/v8.go
+++ b/chain/actors/builtin/power/v8.go
@@ -2,16 +2,19 @@ package power
import (
"bytes"
+ "fmt"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin8 "github.com/filecoin-project/go-state-types/builtin"
power8 "github.com/filecoin-project/go-state-types/builtin/v8/power"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -184,3 +187,20 @@ func fromV8Claim(v8 power8.Claim) Claim {
QualityAdjPower: v8.QualityAdjPower,
}
}
+
+func (s *state8) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/power/v9.go b/chain/actors/builtin/power/v9.go
new file mode 100644
index 000000000..0e8d5b072
--- /dev/null
+++ b/chain/actors/builtin/power/v9.go
@@ -0,0 +1,206 @@
+package power
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ cbg "github.com/whyrusleeping/cbor-gen"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin9 "github.com/filecoin-project/go-state-types/builtin"
+ power9 "github.com/filecoin-project/go-state-types/builtin/v9/power"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store) (State, error) {
+ out := state9{store: store}
+
+ s, err := power9.ConstructState(store)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state9 struct {
+ power9.State
+ store adt.Store
+}
+
+func (s *state9) TotalLocked() (abi.TokenAmount, error) {
+ return s.TotalPledgeCollateral, nil
+}
+
+func (s *state9) TotalPower() (Claim, error) {
+ return Claim{
+ RawBytePower: s.TotalRawBytePower,
+ QualityAdjPower: s.TotalQualityAdjPower,
+ }, nil
+}
+
+// Committed power to the network. Includes miners below the minimum threshold.
+func (s *state9) TotalCommitted() (Claim, error) {
+ return Claim{
+ RawBytePower: s.TotalBytesCommitted,
+ QualityAdjPower: s.TotalQABytesCommitted,
+ }, nil
+}
+
+func (s *state9) MinerPower(addr address.Address) (Claim, bool, error) {
+ claims, err := s.claims()
+ if err != nil {
+ return Claim{}, false, err
+ }
+ var claim power9.Claim
+ ok, err := claims.Get(abi.AddrKey(addr), &claim)
+ if err != nil {
+ return Claim{}, false, err
+ }
+ return Claim{
+ RawBytePower: claim.RawBytePower,
+ QualityAdjPower: claim.QualityAdjPower,
+ }, ok, nil
+}
+
+func (s *state9) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) {
+ return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a)
+}
+
+func (s *state9) TotalPowerSmoothed() (builtin.FilterEstimate, error) {
+ return builtin.FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil
+}
+
+func (s *state9) MinerCounts() (uint64, uint64, error) {
+ return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil
+}
+
+func (s *state9) ListAllMiners() ([]address.Address, error) {
+ claims, err := s.claims()
+ if err != nil {
+ return nil, err
+ }
+
+ var miners []address.Address
+ err = claims.ForEach(nil, func(k string) error {
+ a, err := address.NewFromBytes([]byte(k))
+ if err != nil {
+ return err
+ }
+ miners = append(miners, a)
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ return miners, nil
+}
+
+func (s *state9) ForEachClaim(cb func(miner address.Address, claim Claim) error) error {
+ claims, err := s.claims()
+ if err != nil {
+ return err
+ }
+
+ var claim power9.Claim
+ return claims.ForEach(&claim, func(k string) error {
+ a, err := address.NewFromBytes([]byte(k))
+ if err != nil {
+ return err
+ }
+ return cb(a, Claim{
+ RawBytePower: claim.RawBytePower,
+ QualityAdjPower: claim.QualityAdjPower,
+ })
+ })
+}
+
+func (s *state9) ClaimsChanged(other State) (bool, error) {
+ other9, ok := other.(*state9)
+ if !ok {
+ // treat an upgrade as a change, always
+ return true, nil
+ }
+ return !s.State.Claims.Equals(other9.State.Claims), nil
+}
+
+func (s *state9) SetTotalQualityAdjPower(p abi.StoragePower) error {
+ s.State.TotalQualityAdjPower = p
+ return nil
+}
+
+func (s *state9) SetTotalRawBytePower(p abi.StoragePower) error {
+ s.State.TotalRawBytePower = p
+ return nil
+}
+
+func (s *state9) SetThisEpochQualityAdjPower(p abi.StoragePower) error {
+ s.State.ThisEpochQualityAdjPower = p
+ return nil
+}
+
+func (s *state9) SetThisEpochRawBytePower(p abi.StoragePower) error {
+ s.State.ThisEpochRawBytePower = p
+ return nil
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) claims() (adt.Map, error) {
+ return adt9.AsMap(s.store, s.Claims, builtin9.DefaultHamtBitwidth)
+}
+
+func (s *state9) decodeClaim(val *cbg.Deferred) (Claim, error) {
+ var ci power9.Claim
+ if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil {
+ return Claim{}, err
+ }
+ return fromV9Claim(ci), nil
+}
+
+func fromV9Claim(v9 power9.Claim) Claim {
+ return Claim{
+ RawBytePower: v9.RawBytePower,
+ QualityAdjPower: v9.QualityAdjPower,
+ }
+}
+
+func (s *state9) ActorKey() string {
+ return actors.PowerKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/registry.go b/chain/actors/builtin/registry.go
new file mode 100644
index 000000000..73c9c117f
--- /dev/null
+++ b/chain/actors/builtin/registry.go
@@ -0,0 +1,352 @@
+package builtin
+
+import (
+ "reflect"
+ "runtime"
+ "strings"
+
+ "github.com/ipfs/go-cid"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/builtin"
+ account10 "github.com/filecoin-project/go-state-types/builtin/v10/account"
+ cron10 "github.com/filecoin-project/go-state-types/builtin/v10/cron"
+ datacap10 "github.com/filecoin-project/go-state-types/builtin/v10/datacap"
+ _init10 "github.com/filecoin-project/go-state-types/builtin/v10/init"
+ market10 "github.com/filecoin-project/go-state-types/builtin/v10/market"
+ miner10 "github.com/filecoin-project/go-state-types/builtin/v10/miner"
+ multisig10 "github.com/filecoin-project/go-state-types/builtin/v10/multisig"
+ paych10 "github.com/filecoin-project/go-state-types/builtin/v10/paych"
+ power10 "github.com/filecoin-project/go-state-types/builtin/v10/power"
+ reward10 "github.com/filecoin-project/go-state-types/builtin/v10/reward"
+ system10 "github.com/filecoin-project/go-state-types/builtin/v10/system"
+ verifreg10 "github.com/filecoin-project/go-state-types/builtin/v10/verifreg"
+ account8 "github.com/filecoin-project/go-state-types/builtin/v8/account"
+ cron8 "github.com/filecoin-project/go-state-types/builtin/v8/cron"
+ _init8 "github.com/filecoin-project/go-state-types/builtin/v8/init"
+ market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ multisig8 "github.com/filecoin-project/go-state-types/builtin/v8/multisig"
+ paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych"
+ power8 "github.com/filecoin-project/go-state-types/builtin/v8/power"
+ reward8 "github.com/filecoin-project/go-state-types/builtin/v8/reward"
+ system8 "github.com/filecoin-project/go-state-types/builtin/v8/system"
+ verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg"
+ account9 "github.com/filecoin-project/go-state-types/builtin/v9/account"
+ cron9 "github.com/filecoin-project/go-state-types/builtin/v9/cron"
+ datacap9 "github.com/filecoin-project/go-state-types/builtin/v9/datacap"
+ _init9 "github.com/filecoin-project/go-state-types/builtin/v9/init"
+ market9 "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ multisig9 "github.com/filecoin-project/go-state-types/builtin/v9/multisig"
+ paych9 "github.com/filecoin-project/go-state-types/builtin/v9/paych"
+ power9 "github.com/filecoin-project/go-state-types/builtin/v9/power"
+ reward9 "github.com/filecoin-project/go-state-types/builtin/v9/reward"
+ system9 "github.com/filecoin-project/go-state-types/builtin/v9/system"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+ "github.com/filecoin-project/go-state-types/cbor"
+ rtt "github.com/filecoin-project/go-state-types/rt"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+)
+
+type RegistryEntry struct {
+ state cbor.Er
+ code cid.Cid
+ methods map[uint64]builtin.MethodMeta
+}
+
+func (r RegistryEntry) State() cbor.Er {
+ return r.state
+}
+
+func (r RegistryEntry) Exports() map[uint64]builtin.MethodMeta {
+ return r.methods
+}
+
+func (r RegistryEntry) Code() cid.Cid {
+ return r.code
+}
+
+func MakeRegistryLegacy(actors []rtt.VMActor) []RegistryEntry {
+ registry := make([]RegistryEntry, 0)
+
+ for _, actor := range actors {
+ methodMap := make(map[uint64]builtin.MethodMeta)
+ for methodNum, method := range actor.Exports() {
+ if method != nil {
+ methodMap[uint64(methodNum)] = makeMethodMeta(method)
+ }
+ }
+ registry = append(registry, RegistryEntry{
+ code: actor.Code(),
+ methods: methodMap,
+ state: actor.State(),
+ })
+ }
+
+ return registry
+}
+
+func makeMethodMeta(method interface{}) builtin.MethodMeta {
+ ev := reflect.ValueOf(method)
+ // Extract the method names using reflection. These
+ // method names always match the field names in the
+ // `builtin.Method*` structs (tested in the specs-actors
+ // tests).
+ fnName := runtime.FuncForPC(ev.Pointer()).Name()
+ fnName = strings.TrimSuffix(fnName[strings.LastIndexByte(fnName, '.')+1:], "-fm")
+ return builtin.MethodMeta{
+ Name: fnName,
+ Method: method,
+ }
+}
+
+func MakeRegistry(av actorstypes.Version) []RegistryEntry {
+ if av < actorstypes.Version8 {
+ panic("expected version v8 and up only, use specs-actors for v0-7")
+ }
+ registry := make([]RegistryEntry, 0)
+
+ codeIDs, err := actors.GetActorCodeIDs(av)
+ if err != nil {
+ panic(err)
+ }
+
+ switch av {
+
+ case actorstypes.Version8:
+ for key, codeID := range codeIDs {
+ switch key {
+ case actors.AccountKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: account8.Methods,
+ state: new(account8.State),
+ })
+ case actors.CronKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: cron8.Methods,
+ state: new(cron8.State),
+ })
+ case actors.InitKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: _init8.Methods,
+ state: new(_init8.State),
+ })
+ case actors.MarketKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: market8.Methods,
+ state: new(market8.State),
+ })
+ case actors.MinerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: miner8.Methods,
+ state: new(miner8.State),
+ })
+ case actors.MultisigKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: multisig8.Methods,
+ state: new(multisig8.State),
+ })
+ case actors.PaychKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: paych8.Methods,
+ state: new(paych8.State),
+ })
+ case actors.PowerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: power8.Methods,
+ state: new(power8.State),
+ })
+ case actors.RewardKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: reward8.Methods,
+ state: new(reward8.State),
+ })
+ case actors.SystemKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: system8.Methods,
+ state: new(system8.State),
+ })
+ case actors.VerifregKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: verifreg8.Methods,
+ state: new(verifreg8.State),
+ })
+
+ }
+ }
+
+ case actorstypes.Version9:
+ for key, codeID := range codeIDs {
+ switch key {
+ case actors.AccountKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: account9.Methods,
+ state: new(account9.State),
+ })
+ case actors.CronKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: cron9.Methods,
+ state: new(cron9.State),
+ })
+ case actors.InitKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: _init9.Methods,
+ state: new(_init9.State),
+ })
+ case actors.MarketKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: market9.Methods,
+ state: new(market9.State),
+ })
+ case actors.MinerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: miner9.Methods,
+ state: new(miner9.State),
+ })
+ case actors.MultisigKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: multisig9.Methods,
+ state: new(multisig9.State),
+ })
+ case actors.PaychKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: paych9.Methods,
+ state: new(paych9.State),
+ })
+ case actors.PowerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: power9.Methods,
+ state: new(power9.State),
+ })
+ case actors.RewardKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: reward9.Methods,
+ state: new(reward9.State),
+ })
+ case actors.SystemKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: system9.Methods,
+ state: new(system9.State),
+ })
+ case actors.VerifregKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: verifreg9.Methods,
+ state: new(verifreg9.State),
+ })
+ case actors.DatacapKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: datacap9.Methods,
+ state: new(datacap9.State),
+ })
+ }
+ }
+
+ case actorstypes.Version10:
+ for key, codeID := range codeIDs {
+ switch key {
+ case actors.AccountKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: account10.Methods,
+ state: new(account10.State),
+ })
+ case actors.CronKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: cron10.Methods,
+ state: new(cron10.State),
+ })
+ case actors.InitKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: _init10.Methods,
+ state: new(_init10.State),
+ })
+ case actors.MarketKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: market10.Methods,
+ state: new(market10.State),
+ })
+ case actors.MinerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: miner10.Methods,
+ state: new(miner10.State),
+ })
+ case actors.MultisigKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: multisig10.Methods,
+ state: new(multisig10.State),
+ })
+ case actors.PaychKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: paych10.Methods,
+ state: new(paych10.State),
+ })
+ case actors.PowerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: power10.Methods,
+ state: new(power10.State),
+ })
+ case actors.RewardKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: reward10.Methods,
+ state: new(reward10.State),
+ })
+ case actors.SystemKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: system10.Methods,
+ state: new(system10.State),
+ })
+ case actors.VerifregKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: verifreg10.Methods,
+ state: new(verifreg10.State),
+ })
+ case actors.DatacapKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: datacap10.Methods,
+ state: new(datacap10.State),
+ })
+ }
+ }
+
+ default:
+ panic("expected version v8 and up only, use specs-actors for v0-7")
+ }
+
+ return registry
+}
diff --git a/chain/actors/builtin/registry.go.template b/chain/actors/builtin/registry.go.template
new file mode 100644
index 000000000..39211c476
--- /dev/null
+++ b/chain/actors/builtin/registry.go.template
@@ -0,0 +1,185 @@
+package builtin
+
+import (
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/ipfs/go-cid"
+ "reflect"
+ "runtime"
+ "strings"
+
+ "github.com/filecoin-project/go-state-types/builtin"
+ {{range .versions}}
+ {{if (ge . 8)}}
+ account{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/account"
+ cron{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/cron"
+ _init{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/init"
+ multisig{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/multisig"
+ miner{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/miner"
+ market{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/market"
+ reward{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/reward"
+ paych{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/paych"
+ power{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/power"
+ system{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/system"
+ verifreg{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/verifreg"
+ {{end}}
+ {{if (ge . 9)}}
+ datacap{{.}} "github.com/filecoin-project/go-state-types/builtin/v{{.}}/datacap"
+ {{end}}
+ {{end}}
+ "github.com/filecoin-project/go-state-types/cbor"
+ rtt "github.com/filecoin-project/go-state-types/rt"
+ "github.com/filecoin-project/lotus/chain/actors"
+)
+
+type RegistryEntry struct {
+ state cbor.Er
+ code cid.Cid
+ methods map[uint64]builtin.MethodMeta
+}
+
+func (r RegistryEntry) State() cbor.Er {
+ return r.state
+}
+
+func (r RegistryEntry) Exports() map[uint64]builtin.MethodMeta {
+ return r.methods
+}
+
+func (r RegistryEntry) Code() cid.Cid {
+ return r.code
+}
+
+func MakeRegistryLegacy(actors []rtt.VMActor) []RegistryEntry {
+ registry := make([]RegistryEntry, 0)
+
+ for _, actor := range actors {
+ methodMap := make(map[uint64]builtin.MethodMeta)
+ for methodNum, method := range actor.Exports() {
+ if method != nil {
+ methodMap[uint64(methodNum)] = makeMethodMeta(method)
+ }
+ }
+ registry = append(registry, RegistryEntry{
+ code: actor.Code(),
+ methods: methodMap,
+ state: actor.State(),
+ })
+ }
+
+ return registry
+}
+
+func makeMethodMeta(method interface{}) builtin.MethodMeta {
+ ev := reflect.ValueOf(method)
+ // Extract the method names using reflection. These
+ // method names always match the field names in the
+ // `builtin.Method*` structs (tested in the specs-actors
+ // tests).
+ fnName := runtime.FuncForPC(ev.Pointer()).Name()
+ fnName = strings.TrimSuffix(fnName[strings.LastIndexByte(fnName, '.')+1:], "-fm")
+ return builtin.MethodMeta{
+ Name: fnName,
+ Method: method,
+ }
+}
+
+func MakeRegistry(av actorstypes.Version) []RegistryEntry {
+ if av < actorstypes.Version8 {
+ panic("expected version v8 and up only, use specs-actors for v0-7")
+ }
+ registry := make([]RegistryEntry, 0)
+
+ codeIDs, err := actors.GetActorCodeIDs(av)
+ if err != nil {
+ panic(err)
+ }
+
+ switch av {
+ {{range .versions}}
+ {{if (ge . 8)}}
+ case actorstypes.Version{{.}}:
+ for key, codeID := range codeIDs {
+ switch key {
+ case actors.AccountKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: account{{.}}.Methods,
+ state: new(account{{.}}.State),
+ })
+ case actors.CronKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: cron{{.}}.Methods,
+ state: new(cron{{.}}.State),
+ })
+ case actors.InitKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: _init{{.}}.Methods,
+ state: new(_init{{.}}.State),
+ })
+ case actors.MarketKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: market{{.}}.Methods,
+ state: new(market{{.}}.State),
+ })
+ case actors.MinerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: miner{{.}}.Methods,
+ state: new(miner{{.}}.State),
+ })
+ case actors.MultisigKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: multisig{{.}}.Methods,
+ state: new(multisig{{.}}.State),
+ })
+ case actors.PaychKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: paych{{.}}.Methods,
+ state: new(paych{{.}}.State),
+ })
+ case actors.PowerKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: power{{.}}.Methods,
+ state: new(power{{.}}.State),
+ })
+ case actors.RewardKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: reward{{.}}.Methods,
+ state: new(reward{{.}}.State),
+ })
+ case actors.SystemKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: system{{.}}.Methods,
+ state: new(system{{.}}.State),
+ })
+ case actors.VerifregKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: verifreg{{.}}.Methods,
+ state: new(verifreg{{.}}.State),
+ })
+ {{if (ge . 9)}}case actors.DatacapKey:
+ registry = append(registry, RegistryEntry{
+ code: codeID,
+ methods: datacap{{.}}.Methods,
+ state: new(datacap{{.}}.State),
+ }){{end}}
+ }
+ }
+ {{end}}
+ {{end}}
+
+ default:
+ panic("expected version v8 and up only, use specs-actors for v0-7")
+ }
+
+ return registry
+}
diff --git a/chain/actors/builtin/reward/actor.go.template b/chain/actors/builtin/reward/actor.go.template
index 3e0e859a3..4fd317c97 100644
--- a/chain/actors/builtin/reward/actor.go.template
+++ b/chain/actors/builtin/reward/actor.go.template
@@ -1,6 +1,8 @@
package reward
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/abi"
reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward"
"github.com/filecoin-project/lotus/chain/actors"
@@ -10,10 +12,9 @@ import (
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
@@ -34,7 +35,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -53,10 +54,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, currRealizedPower abi.StoragePower) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store, currRealizedPower)
{{end}}
}
@@ -66,6 +67,10 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
ThisEpochBaselinePower() (abi.StoragePower, error)
ThisEpochReward() (abi.StoragePower, error)
ThisEpochRewardSmoothed() (builtin.FilterEstimate, error)
@@ -84,3 +89,10 @@ type State interface {
}
type AwardBlockRewardParams = reward0.AwardBlockRewardParams
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go
index 943386f6a..0efbdaf79 100644
--- a/chain/actors/builtin/reward/reward.go
+++ b/chain/actors/builtin/reward/reward.go
@@ -1,10 +1,12 @@
package reward
import (
+ "github.com/ipfs/go-cid"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-state-types/abi"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/go-state-types/cbor"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward"
@@ -22,8 +24,8 @@ import (
)
var (
- Address = builtin8.RewardActorAddr
- Methods = builtin8.MethodsReward
+ Address = builtin10.RewardActorAddr
+ Methods = builtin10.MethodsReward
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -34,9 +36,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -68,33 +76,39 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.StoragePower) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, currRealizedPower abi.StoragePower) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store, currRealizedPower)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store, currRealizedPower)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store, currRealizedPower)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store, currRealizedPower)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store, currRealizedPower)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store, currRealizedPower)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store, currRealizedPower)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store, currRealizedPower)
+ case actorstypes.Version9:
+ return make9(store, currRealizedPower)
+
+ case actorstypes.Version10:
+ return make10(store, currRealizedPower)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
@@ -102,6 +116,10 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
ThisEpochBaselinePower() (abi.StoragePower, error)
ThisEpochReward() (abi.StoragePower, error)
ThisEpochRewardSmoothed() (builtin.FilterEstimate, error)
@@ -120,3 +138,18 @@ type State interface {
}
type AwardBlockRewardParams = reward0.AwardBlockRewardParams
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
diff --git a/chain/actors/builtin/reward/state.go.template b/chain/actors/builtin/reward/state.go.template
index dac3d82a4..104aefbaf 100644
--- a/chain/actors/builtin/reward/state.go.template
+++ b/chain/actors/builtin/reward/state.go.template
@@ -1,9 +1,12 @@
package reward
import (
+ "fmt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/abi"
"github.com/ipfs/go-cid"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
@@ -117,3 +120,20 @@ func (s *state{{.v}}) PreCommitDepositForPower(networkQAPower builtin.FilterEsti
func (s *state{{.v}}) GetState() interface{} {
return &s.State
}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v0.go b/chain/actors/builtin/reward/v0.go
index 12bdee054..332e97128 100644
--- a/chain/actors/builtin/reward/v0.go
+++ b/chain/actors/builtin/reward/v0.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner"
reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward"
smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -93,3 +97,20 @@ func (s *state0) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state0) GetState() interface{} {
return &s.State
}
+
+func (s *state0) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v10.go b/chain/actors/builtin/reward/v10.go
new file mode 100644
index 000000000..75c23e1a6
--- /dev/null
+++ b/chain/actors/builtin/reward/v10.go
@@ -0,0 +1,119 @@
+package reward
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ miner10 "github.com/filecoin-project/go-state-types/builtin/v10/miner"
+ reward10 "github.com/filecoin-project/go-state-types/builtin/v10/reward"
+ smoothing10 "github.com/filecoin-project/go-state-types/builtin/v10/util/smoothing"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, currRealizedPower abi.StoragePower) (State, error) {
+ out := state10{store: store}
+ out.State = *reward10.ConstructState(currRealizedPower)
+ return &out, nil
+}
+
+type state10 struct {
+ reward10.State
+ store adt.Store
+}
+
+func (s *state10) ThisEpochReward() (abi.TokenAmount, error) {
+ return s.State.ThisEpochReward, nil
+}
+
+func (s *state10) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) {
+
+ return builtin.FilterEstimate{
+ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate,
+ VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate,
+ }, nil
+
+}
+
+func (s *state10) ThisEpochBaselinePower() (abi.StoragePower, error) {
+ return s.State.ThisEpochBaselinePower, nil
+}
+
+func (s *state10) TotalStoragePowerReward() (abi.TokenAmount, error) {
+ return s.State.TotalStoragePowerReward, nil
+}
+
+func (s *state10) EffectiveBaselinePower() (abi.StoragePower, error) {
+ return s.State.EffectiveBaselinePower, nil
+}
+
+func (s *state10) EffectiveNetworkTime() (abi.ChainEpoch, error) {
+ return s.State.EffectiveNetworkTime, nil
+}
+
+func (s *state10) CumsumBaseline() (reward10.Spacetime, error) {
+ return s.State.CumsumBaseline, nil
+}
+
+func (s *state10) CumsumRealized() (reward10.Spacetime, error) {
+ return s.State.CumsumRealized, nil
+}
+
+func (s *state10) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) {
+ return miner10.InitialPledgeForPower(
+ qaPower,
+ s.State.ThisEpochBaselinePower,
+ s.State.ThisEpochRewardSmoothed,
+ smoothing10.FilterEstimate{
+ PositionEstimate: networkQAPower.PositionEstimate,
+ VelocityEstimate: networkQAPower.VelocityEstimate,
+ },
+ circSupply,
+ ), nil
+}
+
+func (s *state10) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) {
+ return miner10.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed,
+ smoothing10.FilterEstimate{
+ PositionEstimate: networkQAPower.PositionEstimate,
+ VelocityEstimate: networkQAPower.VelocityEstimate,
+ },
+ sectorWeight), nil
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v2.go b/chain/actors/builtin/reward/v2.go
index ed2481635..33f6c120f 100644
--- a/chain/actors/builtin/reward/v2.go
+++ b/chain/actors/builtin/reward/v2.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner"
reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward"
smoothing2 "github.com/filecoin-project/specs-actors/v2/actors/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -96,3 +100,20 @@ func (s *state2) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state2) GetState() interface{} {
return &s.State
}
+
+func (s *state2) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v3.go b/chain/actors/builtin/reward/v3.go
index d9f4bf369..d727a9861 100644
--- a/chain/actors/builtin/reward/v3.go
+++ b/chain/actors/builtin/reward/v3.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner"
reward3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/reward"
smoothing3 "github.com/filecoin-project/specs-actors/v3/actors/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -96,3 +100,20 @@ func (s *state3) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state3) GetState() interface{} {
return &s.State
}
+
+func (s *state3) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v4.go b/chain/actors/builtin/reward/v4.go
index 160c72ce7..94ebc43c4 100644
--- a/chain/actors/builtin/reward/v4.go
+++ b/chain/actors/builtin/reward/v4.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner"
reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward"
smoothing4 "github.com/filecoin-project/specs-actors/v4/actors/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -96,3 +100,20 @@ func (s *state4) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state4) GetState() interface{} {
return &s.State
}
+
+func (s *state4) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v5.go b/chain/actors/builtin/reward/v5.go
index 838ec8f21..563b8f42a 100644
--- a/chain/actors/builtin/reward/v5.go
+++ b/chain/actors/builtin/reward/v5.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner"
reward5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/reward"
smoothing5 "github.com/filecoin-project/specs-actors/v5/actors/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -96,3 +100,20 @@ func (s *state5) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state5) GetState() interface{} {
return &s.State
}
+
+func (s *state5) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v6.go b/chain/actors/builtin/reward/v6.go
index e056b22f6..523736766 100644
--- a/chain/actors/builtin/reward/v6.go
+++ b/chain/actors/builtin/reward/v6.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner"
reward6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/reward"
smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -96,3 +100,20 @@ func (s *state6) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state6) GetState() interface{} {
return &s.State
}
+
+func (s *state6) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go
index 5fedaa43c..79db860e1 100644
--- a/chain/actors/builtin/reward/v7.go
+++ b/chain/actors/builtin/reward/v7.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner"
reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward"
smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -96,3 +100,20 @@ func (s *state7) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state7) GetState() interface{} {
return &s.State
}
+
+func (s *state7) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v8.go b/chain/actors/builtin/reward/v8.go
index ecc5a94ba..a9d6fae69 100644
--- a/chain/actors/builtin/reward/v8.go
+++ b/chain/actors/builtin/reward/v8.go
@@ -1,13 +1,17 @@
package reward
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner"
reward8 "github.com/filecoin-project/go-state-types/builtin/v8/reward"
smoothing8 "github.com/filecoin-project/go-state-types/builtin/v8/util/smoothing"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
)
@@ -96,3 +100,20 @@ func (s *state8) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate,
func (s *state8) GetState() interface{} {
return &s.State
}
+
+func (s *state8) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/reward/v9.go b/chain/actors/builtin/reward/v9.go
new file mode 100644
index 000000000..34b8a7d34
--- /dev/null
+++ b/chain/actors/builtin/reward/v9.go
@@ -0,0 +1,119 @@
+package reward
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ reward9 "github.com/filecoin-project/go-state-types/builtin/v9/reward"
+ smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store, currRealizedPower abi.StoragePower) (State, error) {
+ out := state9{store: store}
+ out.State = *reward9.ConstructState(currRealizedPower)
+ return &out, nil
+}
+
+type state9 struct {
+ reward9.State
+ store adt.Store
+}
+
+func (s *state9) ThisEpochReward() (abi.TokenAmount, error) {
+ return s.State.ThisEpochReward, nil
+}
+
+func (s *state9) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) {
+
+ return builtin.FilterEstimate{
+ PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate,
+ VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate,
+ }, nil
+
+}
+
+func (s *state9) ThisEpochBaselinePower() (abi.StoragePower, error) {
+ return s.State.ThisEpochBaselinePower, nil
+}
+
+func (s *state9) TotalStoragePowerReward() (abi.TokenAmount, error) {
+ return s.State.TotalStoragePowerReward, nil
+}
+
+func (s *state9) EffectiveBaselinePower() (abi.StoragePower, error) {
+ return s.State.EffectiveBaselinePower, nil
+}
+
+func (s *state9) EffectiveNetworkTime() (abi.ChainEpoch, error) {
+ return s.State.EffectiveNetworkTime, nil
+}
+
+func (s *state9) CumsumBaseline() (reward9.Spacetime, error) {
+ return s.State.CumsumBaseline, nil
+}
+
+func (s *state9) CumsumRealized() (reward9.Spacetime, error) {
+ return s.State.CumsumRealized, nil
+}
+
+func (s *state9) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) {
+ return miner9.InitialPledgeForPower(
+ qaPower,
+ s.State.ThisEpochBaselinePower,
+ s.State.ThisEpochRewardSmoothed,
+ smoothing9.FilterEstimate{
+ PositionEstimate: networkQAPower.PositionEstimate,
+ VelocityEstimate: networkQAPower.VelocityEstimate,
+ },
+ circSupply,
+ ), nil
+}
+
+func (s *state9) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) {
+ return miner9.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed,
+ smoothing9.FilterEstimate{
+ PositionEstimate: networkQAPower.PositionEstimate,
+ VelocityEstimate: networkQAPower.VelocityEstimate,
+ },
+ sectorWeight), nil
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) ActorKey() string {
+ return actors.RewardKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/actor.go.template b/chain/actors/builtin/system/actor.go.template
index c5e1af3e4..a6442c6a9 100644
--- a/chain/actors/builtin/system/actor.go.template
+++ b/chain/actors/builtin/system/actor.go.template
@@ -1,6 +1,8 @@
package system
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
@@ -11,10 +13,9 @@ import (
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
)
var (
@@ -30,7 +31,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -49,10 +50,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, builtinActors cid.Cid) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, builtinActors cid.Cid) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store{{if (ge . 8)}}, builtinActors{{end}})
{{end}}
}
@@ -60,6 +61,18 @@ func MakeState(store adt.Store, av actors.Version, builtinActors cid.Cid) (State
}
type State interface {
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
GetState() interface{}
GetBuiltinActors() cid.Cid
+ SetBuiltinActors(cid.Cid) error
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
}
diff --git a/chain/actors/builtin/system/state.go.template b/chain/actors/builtin/system/state.go.template
index 21b057ad5..62dba041a 100644
--- a/chain/actors/builtin/system/state.go.template
+++ b/chain/actors/builtin/system/state.go.template
@@ -1,12 +1,17 @@
package system
import (
+ "fmt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+
"github.com/ipfs/go-cid"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors"
{{if (le .v 7)}}
system{{.v}} "github.com/filecoin-project/specs-actors{{.import}}actors/builtin/system"
+ "golang.org/x/xerrors"
{{else}}
system{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}system"
{{end}}
@@ -46,4 +51,30 @@ func (s *state{{.v}}) GetBuiltinActors() cid.Cid {
{{else}}
return s.State.BuiltinActors
{{end}}
-}
\ No newline at end of file
+}
+
+func (s *state{{.v}}) SetBuiltinActors(c cid.Cid) error {
+{{if (le .v 7)}}
+ return xerrors.New("cannot set manifest cid before v8")
+{{else}}
+ s.State.BuiltinActors = c
+ return nil
+{{end}}
+}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go
index 24cf47d55..747563cc0 100644
--- a/chain/actors/builtin/system/system.go
+++ b/chain/actors/builtin/system/system.go
@@ -4,7 +4,8 @@ import (
"github.com/ipfs/go-cid"
"golang.org/x/xerrors"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
@@ -19,7 +20,7 @@ import (
)
var (
- Address = builtin8.SystemActorAddr
+ Address = builtin10.SystemActorAddr
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -30,9 +31,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -64,38 +71,64 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, builtinActors cid.Cid) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, builtinActors cid.Cid) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store, builtinActors)
+ case actorstypes.Version9:
+ return make9(store, builtinActors)
+
+ case actorstypes.Version10:
+ return make10(store, builtinActors)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
type State interface {
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
GetState() interface{}
GetBuiltinActors() cid.Cid
+ SetBuiltinActors(cid.Cid) error
+}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
}
diff --git a/chain/actors/builtin/system/v0.go b/chain/actors/builtin/system/v0.go
index efa0741ce..17fa9e8c7 100644
--- a/chain/actors/builtin/system/v0.go
+++ b/chain/actors/builtin/system/v0.go
@@ -1,10 +1,15 @@
package system
import (
- "github.com/ipfs/go-cid"
+ "fmt"
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system0 "github.com/filecoin-project/specs-actors/actors/builtin/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -39,3 +44,26 @@ func (s *state0) GetBuiltinActors() cid.Cid {
return cid.Undef
}
+
+func (s *state0) SetBuiltinActors(c cid.Cid) error {
+
+ return xerrors.New("cannot set manifest cid before v8")
+
+}
+
+func (s *state0) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v10.go b/chain/actors/builtin/system/v10.go
new file mode 100644
index 000000000..e6d6fbe96
--- /dev/null
+++ b/chain/actors/builtin/system/v10.go
@@ -0,0 +1,71 @@
+package system
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ system10 "github.com/filecoin-project/go-state-types/builtin/v10/system"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, builtinActors cid.Cid) (State, error) {
+ out := state10{store: store}
+ out.State = system10.State{
+ BuiltinActors: builtinActors,
+ }
+ return &out, nil
+}
+
+type state10 struct {
+ system10.State
+ store adt.Store
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) GetBuiltinActors() cid.Cid {
+
+ return s.State.BuiltinActors
+
+}
+
+func (s *state10) SetBuiltinActors(c cid.Cid) error {
+
+ s.State.BuiltinActors = c
+ return nil
+
+}
+
+func (s *state10) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v2.go b/chain/actors/builtin/system/v2.go
index e4fefd08d..7821bee58 100644
--- a/chain/actors/builtin/system/v2.go
+++ b/chain/actors/builtin/system/v2.go
@@ -1,10 +1,15 @@
package system
import (
- "github.com/ipfs/go-cid"
+ "fmt"
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -39,3 +44,26 @@ func (s *state2) GetBuiltinActors() cid.Cid {
return cid.Undef
}
+
+func (s *state2) SetBuiltinActors(c cid.Cid) error {
+
+ return xerrors.New("cannot set manifest cid before v8")
+
+}
+
+func (s *state2) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v3.go b/chain/actors/builtin/system/v3.go
index d2b59c8a8..0c80218c4 100644
--- a/chain/actors/builtin/system/v3.go
+++ b/chain/actors/builtin/system/v3.go
@@ -1,10 +1,15 @@
package system
import (
- "github.com/ipfs/go-cid"
+ "fmt"
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -39,3 +44,26 @@ func (s *state3) GetBuiltinActors() cid.Cid {
return cid.Undef
}
+
+func (s *state3) SetBuiltinActors(c cid.Cid) error {
+
+ return xerrors.New("cannot set manifest cid before v8")
+
+}
+
+func (s *state3) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v4.go b/chain/actors/builtin/system/v4.go
index 9528c1779..e41792110 100644
--- a/chain/actors/builtin/system/v4.go
+++ b/chain/actors/builtin/system/v4.go
@@ -1,10 +1,15 @@
package system
import (
- "github.com/ipfs/go-cid"
+ "fmt"
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -39,3 +44,26 @@ func (s *state4) GetBuiltinActors() cid.Cid {
return cid.Undef
}
+
+func (s *state4) SetBuiltinActors(c cid.Cid) error {
+
+ return xerrors.New("cannot set manifest cid before v8")
+
+}
+
+func (s *state4) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v5.go b/chain/actors/builtin/system/v5.go
index adc1d4553..a2760b096 100644
--- a/chain/actors/builtin/system/v5.go
+++ b/chain/actors/builtin/system/v5.go
@@ -1,10 +1,15 @@
package system
import (
- "github.com/ipfs/go-cid"
+ "fmt"
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -39,3 +44,26 @@ func (s *state5) GetBuiltinActors() cid.Cid {
return cid.Undef
}
+
+func (s *state5) SetBuiltinActors(c cid.Cid) error {
+
+ return xerrors.New("cannot set manifest cid before v8")
+
+}
+
+func (s *state5) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v6.go b/chain/actors/builtin/system/v6.go
index 0cebadce0..0de085a5e 100644
--- a/chain/actors/builtin/system/v6.go
+++ b/chain/actors/builtin/system/v6.go
@@ -1,10 +1,15 @@
package system
import (
- "github.com/ipfs/go-cid"
+ "fmt"
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -39,3 +44,26 @@ func (s *state6) GetBuiltinActors() cid.Cid {
return cid.Undef
}
+
+func (s *state6) SetBuiltinActors(c cid.Cid) error {
+
+ return xerrors.New("cannot set manifest cid before v8")
+
+}
+
+func (s *state6) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go
index 0009773da..2753251c0 100644
--- a/chain/actors/builtin/system/v7.go
+++ b/chain/actors/builtin/system/v7.go
@@ -1,10 +1,15 @@
package system
import (
- "github.com/ipfs/go-cid"
+ "fmt"
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -39,3 +44,26 @@ func (s *state7) GetBuiltinActors() cid.Cid {
return cid.Undef
}
+
+func (s *state7) SetBuiltinActors(c cid.Cid) error {
+
+ return xerrors.New("cannot set manifest cid before v8")
+
+}
+
+func (s *state7) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v8.go b/chain/actors/builtin/system/v8.go
index 48f150fb9..00cafdfed 100644
--- a/chain/actors/builtin/system/v8.go
+++ b/chain/actors/builtin/system/v8.go
@@ -1,10 +1,14 @@
package system
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system8 "github.com/filecoin-project/go-state-types/builtin/v8/system"
+ "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
@@ -41,3 +45,27 @@ func (s *state8) GetBuiltinActors() cid.Cid {
return s.State.BuiltinActors
}
+
+func (s *state8) SetBuiltinActors(c cid.Cid) error {
+
+ s.State.BuiltinActors = c
+ return nil
+
+}
+
+func (s *state8) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/system/v9.go b/chain/actors/builtin/system/v9.go
new file mode 100644
index 000000000..8bf96a917
--- /dev/null
+++ b/chain/actors/builtin/system/v9.go
@@ -0,0 +1,71 @@
+package system
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ system9 "github.com/filecoin-project/go-state-types/builtin/v9/system"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store, builtinActors cid.Cid) (State, error) {
+ out := state9{store: store}
+ out.State = system9.State{
+ BuiltinActors: builtinActors,
+ }
+ return &out, nil
+}
+
+type state9 struct {
+ system9.State
+ store adt.Store
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) GetBuiltinActors() cid.Cid {
+
+ return s.State.BuiltinActors
+
+}
+
+func (s *state9) SetBuiltinActors(c cid.Cid) error {
+
+ s.State.BuiltinActors = c
+ return nil
+
+}
+
+func (s *state9) ActorKey() string {
+ return actors.SystemKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/actor.go.template b/chain/actors/builtin/verifreg/actor.go.template
index 3df256004..97d1417f7 100644
--- a/chain/actors/builtin/verifreg/actor.go.template
+++ b/chain/actors/builtin/verifreg/actor.go.template
@@ -1,6 +1,8 @@
package verifreg
import (
+ "github.com/ipfs/go-cid"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
@@ -10,14 +12,14 @@ import (
{{range .versions}}
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
- {{else}}
- builtin{{.}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
{{end}}
+ builtin{{.latestVersion}} "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
)
var (
@@ -34,7 +36,7 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
{{range .versions}}
{{if (ge . 8)}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
@@ -53,10 +55,10 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, rootKeyAddress address.Address) (State, error) {
switch av {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return make{{.}}(store, rootKeyAddress)
{{end}}
}
@@ -66,11 +68,31 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
RootKey() (address.Address, error)
VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error)
VerifierDataCap(address.Address) (bool, abi.StoragePower, error)
RemoveDataCapProposalID(verifier address.Address, client address.Address) (bool, uint64, error)
ForEachVerifier(func(addr address.Address, dcap abi.StoragePower) error) error
ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error
+ GetAllocation(clientIdAddr address.Address, allocationId AllocationId) (*Allocation, bool, error)
+ GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error)
+ GetClaim(providerIdAddr address.Address, claimId ClaimId) (*Claim, bool, error)
+ GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error)
GetState() interface{}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{ {{range .versions}}
+ (&state{{.}}{}).Code(),
+ {{- end}}
+ }
+}
+
+type Allocation = verifregtypes.Allocation
+type AllocationId = verifregtypes.AllocationId
+type Claim = verifregtypes.Claim
+type ClaimId = verifregtypes.ClaimId
\ No newline at end of file
diff --git a/chain/actors/builtin/verifreg/state.go.template b/chain/actors/builtin/verifreg/state.go.template
index aaca86905..960b2b604 100644
--- a/chain/actors/builtin/verifreg/state.go.template
+++ b/chain/actors/builtin/verifreg/state.go.template
@@ -1,12 +1,15 @@
package verifreg
import (
+ "fmt"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/ipfs/go-cid"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "golang.org/x/xerrors"
{{if (le .v 7)}}
{{if (ge .v 3)}}
@@ -19,6 +22,14 @@ import (
adt{{.v}} "github.com/filecoin-project/go-state-types/builtin{{.import}}util/adt"
builtin{{.v}} "github.com/filecoin-project/go-state-types/builtin"
{{end}}
+{{if (ge .v 9)}}
+ "github.com/filecoin-project/go-state-types/big"
+{{if (gt .v 9)}}
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+{{end}}
+{{else}}
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+{{end}}
)
var _ State = (*state{{.v}})(nil)
@@ -62,7 +73,11 @@ func (s *state{{.v}}) RootKey() (address.Address, error) {
}
func (s *state{{.v}}) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+{{if (le .v 8)}}
return getDataCap(s.store, actors.Version{{.v}}, s.verifiedClients, addr)
+{{else}}
+ return false, big.Zero(), xerrors.Errorf("unsupported in actors v{{.v}}")
+{{end}}
}
func (s *state{{.v}}) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -78,11 +93,19 @@ func (s *state{{.v}}) ForEachVerifier(cb func(addr address.Address, dcap abi.Sto
}
func (s *state{{.v}}) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+{{if (le .v 8)}}
return forEachCap(s.store, actors.Version{{.v}}, s.verifiedClients, cb)
+{{else}}
+ return xerrors.Errorf("unsupported in actors v{{.v}}")
+{{end}}
}
func (s *state{{.v}}) verifiedClients() (adt.Map, error) {
+{{if (le .v 8)}}
return adt{{.v}}.AsMap(s.store, s.VerifiedClients{{if (ge .v 3)}}, builtin{{.v}}.DefaultHamtBitwidth{{end}})
+{{else}}
+ return nil, xerrors.Errorf("unsupported in actors v{{.v}}")
+{{end}}
}
func (s *state{{.v}}) verifiers() (adt.Map, error) {
@@ -96,4 +119,69 @@ func (s *state{{.v}}) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state{{.v}}) GetState() interface{} {
return &s.State
-}
\ No newline at end of file
+}
+
+func (s *state{{.v}}) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+{{if (le .v 8)}}
+ return nil, false, xerrors.Errorf("unsupported in actors v{{.v}}")
+{{else}}
+ alloc, ok, err := s.FindAllocation(s.store, clientIdAddr, verifreg{{.v}}.AllocationId(allocationId))
+ return (*Allocation)(alloc), ok, err{{end}}
+}
+
+func (s *state{{.v}}) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+{{if (le .v 8)}}
+ return nil, xerrors.Errorf("unsupported in actors v{{.v}}")
+{{else}}
+ v{{.v}}Map, err := s.LoadAllocationsToMap(s.store, clientIdAddr)
+
+ retMap := make(map[AllocationId]Allocation, len(v{{.v}}Map))
+ for k, v := range v{{.v}}Map {
+ retMap[AllocationId(k)] = Allocation(v)
+ }
+
+ return retMap, err
+{{end}}
+}
+
+func (s *state{{.v}}) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+{{if (le .v 8)}}
+ return nil, false, xerrors.Errorf("unsupported in actors v{{.v}}")
+{{else}}
+ claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg{{.v}}.ClaimId(claimId))
+ return (*Claim)(claim), ok, err
+{{end}}
+}
+
+func (s *state{{.v}}) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+{{if (le .v 8)}}
+ return nil, xerrors.Errorf("unsupported in actors v{{.v}}")
+{{else}}
+ v{{.v}}Map, err := s.LoadClaimsToMap(s.store, providerIdAddr)
+
+ retMap := make(map[ClaimId]Claim, len(v{{.v}}Map))
+ for k, v := range v{{.v}}Map {
+ retMap[ClaimId(k)] = Claim(v)
+ }
+
+ return retMap, err
+
+{{end}}
+}
+
+func (s *state{{.v}}) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state{{.v}}) ActorVersion() actorstypes.Version {
+ return actorstypes.Version{{.v}}
+}
+
+func (s *state{{.v}}) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v0.go b/chain/actors/builtin/verifreg/v0.go
index 8eaf83120..4917667ea 100644
--- a/chain/actors/builtin/verifreg/v0.go
+++ b/chain/actors/builtin/verifreg/v0.go
@@ -1,10 +1,15 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
verifreg0 "github.com/filecoin-project/specs-actors/actors/builtin/verifreg"
adt0 "github.com/filecoin-project/specs-actors/actors/util/adt"
@@ -46,7 +51,9 @@ func (s *state0) RootKey() (address.Address, error) {
}
func (s *state0) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version0, s.verifiedClients, addr)
+
}
func (s *state0) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -62,11 +69,15 @@ func (s *state0) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state0) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version0, s.verifiedClients, cb)
+
}
func (s *state0) verifiedClients() (adt.Map, error) {
+
return adt0.AsMap(s.store, s.VerifiedClients)
+
}
func (s *state0) verifiers() (adt.Map, error) {
@@ -81,3 +92,44 @@ func (s *state0) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state0) GetState() interface{} {
return &s.State
}
+
+func (s *state0) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v0")
+
+}
+
+func (s *state0) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v0")
+
+}
+
+func (s *state0) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v0")
+
+}
+
+func (s *state0) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v0")
+
+}
+
+func (s *state0) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state0) ActorVersion() actorstypes.Version {
+ return actorstypes.Version0
+}
+
+func (s *state0) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v10.go b/chain/actors/builtin/verifreg/v10.go
new file mode 100644
index 000000000..a510d1970
--- /dev/null
+++ b/chain/actors/builtin/verifreg/v10.go
@@ -0,0 +1,151 @@
+package verifreg
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/big"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ adt10 "github.com/filecoin-project/go-state-types/builtin/v10/util/adt"
+ verifreg10 "github.com/filecoin-project/go-state-types/builtin/v10/verifreg"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state10)(nil)
+
+func load10(store adt.Store, root cid.Cid) (State, error) {
+ out := state10{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make10(store adt.Store, rootKeyAddress address.Address) (State, error) {
+ out := state10{store: store}
+
+ s, err := verifreg10.ConstructState(store, rootKeyAddress)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state10 struct {
+ verifreg10.State
+ store adt.Store
+}
+
+func (s *state10) RootKey() (address.Address, error) {
+ return s.State.RootKey, nil
+}
+
+func (s *state10) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
+ return false, big.Zero(), xerrors.Errorf("unsupported in actors v10")
+
+}
+
+func (s *state10) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+ return getDataCap(s.store, actors.Version10, s.verifiers, addr)
+}
+
+func (s *state10) RemoveDataCapProposalID(verifier address.Address, client address.Address) (bool, uint64, error) {
+ return getRemoveDataCapProposalID(s.store, actors.Version10, s.removeDataCapProposalIDs, verifier, client)
+}
+
+func (s *state10) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+ return forEachCap(s.store, actors.Version10, s.verifiers, cb)
+}
+
+func (s *state10) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
+ return xerrors.Errorf("unsupported in actors v10")
+
+}
+
+func (s *state10) verifiedClients() (adt.Map, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v10")
+
+}
+
+func (s *state10) verifiers() (adt.Map, error) {
+ return adt10.AsMap(s.store, s.Verifiers, builtin10.DefaultHamtBitwidth)
+}
+
+func (s *state10) removeDataCapProposalIDs() (adt.Map, error) {
+ return adt10.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin10.DefaultHamtBitwidth)
+}
+
+func (s *state10) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state10) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ alloc, ok, err := s.FindAllocation(s.store, clientIdAddr, verifreg10.AllocationId(allocationId))
+ return (*Allocation)(alloc), ok, err
+}
+
+func (s *state10) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ v10Map, err := s.LoadAllocationsToMap(s.store, clientIdAddr)
+
+ retMap := make(map[AllocationId]Allocation, len(v10Map))
+ for k, v := range v10Map {
+ retMap[AllocationId(k)] = Allocation(v)
+ }
+
+ return retMap, err
+
+}
+
+func (s *state10) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg10.ClaimId(claimId))
+ return (*Claim)(claim), ok, err
+
+}
+
+func (s *state10) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ v10Map, err := s.LoadClaimsToMap(s.store, providerIdAddr)
+
+ retMap := make(map[ClaimId]Claim, len(v10Map))
+ for k, v := range v10Map {
+ retMap[ClaimId(k)] = Claim(v)
+ }
+
+ return retMap, err
+
+}
+
+func (s *state10) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state10) ActorVersion() actorstypes.Version {
+ return actorstypes.Version10
+}
+
+func (s *state10) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v2.go b/chain/actors/builtin/verifreg/v2.go
index 1857a02e4..28061c2d1 100644
--- a/chain/actors/builtin/verifreg/v2.go
+++ b/chain/actors/builtin/verifreg/v2.go
@@ -1,10 +1,15 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
verifreg2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/verifreg"
adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
@@ -46,7 +51,9 @@ func (s *state2) RootKey() (address.Address, error) {
}
func (s *state2) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version2, s.verifiedClients, addr)
+
}
func (s *state2) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -62,11 +69,15 @@ func (s *state2) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state2) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version2, s.verifiedClients, cb)
+
}
func (s *state2) verifiedClients() (adt.Map, error) {
+
return adt2.AsMap(s.store, s.VerifiedClients)
+
}
func (s *state2) verifiers() (adt.Map, error) {
@@ -81,3 +92,44 @@ func (s *state2) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state2) GetState() interface{} {
return &s.State
}
+
+func (s *state2) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v2")
+
+}
+
+func (s *state2) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v2")
+
+}
+
+func (s *state2) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v2")
+
+}
+
+func (s *state2) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v2")
+
+}
+
+func (s *state2) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state2) ActorVersion() actorstypes.Version {
+ return actorstypes.Version2
+}
+
+func (s *state2) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v3.go b/chain/actors/builtin/verifreg/v3.go
index 98f529a61..4096059a6 100644
--- a/chain/actors/builtin/verifreg/v3.go
+++ b/chain/actors/builtin/verifreg/v3.go
@@ -1,10 +1,15 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
verifreg3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/verifreg"
adt3 "github.com/filecoin-project/specs-actors/v3/actors/util/adt"
@@ -47,7 +52,9 @@ func (s *state3) RootKey() (address.Address, error) {
}
func (s *state3) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version3, s.verifiedClients, addr)
+
}
func (s *state3) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -63,11 +70,15 @@ func (s *state3) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state3) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version3, s.verifiedClients, cb)
+
}
func (s *state3) verifiedClients() (adt.Map, error) {
+
return adt3.AsMap(s.store, s.VerifiedClients, builtin3.DefaultHamtBitwidth)
+
}
func (s *state3) verifiers() (adt.Map, error) {
@@ -82,3 +93,44 @@ func (s *state3) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state3) GetState() interface{} {
return &s.State
}
+
+func (s *state3) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v3")
+
+}
+
+func (s *state3) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v3")
+
+}
+
+func (s *state3) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v3")
+
+}
+
+func (s *state3) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v3")
+
+}
+
+func (s *state3) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state3) ActorVersion() actorstypes.Version {
+ return actorstypes.Version3
+}
+
+func (s *state3) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v4.go b/chain/actors/builtin/verifreg/v4.go
index 08aac0c7d..457704504 100644
--- a/chain/actors/builtin/verifreg/v4.go
+++ b/chain/actors/builtin/verifreg/v4.go
@@ -1,10 +1,15 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
verifreg4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg"
adt4 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
@@ -47,7 +52,9 @@ func (s *state4) RootKey() (address.Address, error) {
}
func (s *state4) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version4, s.verifiedClients, addr)
+
}
func (s *state4) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -63,11 +70,15 @@ func (s *state4) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state4) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version4, s.verifiedClients, cb)
+
}
func (s *state4) verifiedClients() (adt.Map, error) {
+
return adt4.AsMap(s.store, s.VerifiedClients, builtin4.DefaultHamtBitwidth)
+
}
func (s *state4) verifiers() (adt.Map, error) {
@@ -82,3 +93,44 @@ func (s *state4) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state4) GetState() interface{} {
return &s.State
}
+
+func (s *state4) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v4")
+
+}
+
+func (s *state4) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v4")
+
+}
+
+func (s *state4) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v4")
+
+}
+
+func (s *state4) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v4")
+
+}
+
+func (s *state4) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state4) ActorVersion() actorstypes.Version {
+ return actorstypes.Version4
+}
+
+func (s *state4) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v5.go b/chain/actors/builtin/verifreg/v5.go
index 303b10cd1..b1e6db424 100644
--- a/chain/actors/builtin/verifreg/v5.go
+++ b/chain/actors/builtin/verifreg/v5.go
@@ -1,10 +1,15 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
verifreg5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/verifreg"
adt5 "github.com/filecoin-project/specs-actors/v5/actors/util/adt"
@@ -47,7 +52,9 @@ func (s *state5) RootKey() (address.Address, error) {
}
func (s *state5) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version5, s.verifiedClients, addr)
+
}
func (s *state5) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -63,11 +70,15 @@ func (s *state5) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state5) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version5, s.verifiedClients, cb)
+
}
func (s *state5) verifiedClients() (adt.Map, error) {
+
return adt5.AsMap(s.store, s.VerifiedClients, builtin5.DefaultHamtBitwidth)
+
}
func (s *state5) verifiers() (adt.Map, error) {
@@ -82,3 +93,44 @@ func (s *state5) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state5) GetState() interface{} {
return &s.State
}
+
+func (s *state5) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v5")
+
+}
+
+func (s *state5) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v5")
+
+}
+
+func (s *state5) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v5")
+
+}
+
+func (s *state5) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v5")
+
+}
+
+func (s *state5) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state5) ActorVersion() actorstypes.Version {
+ return actorstypes.Version5
+}
+
+func (s *state5) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v6.go b/chain/actors/builtin/verifreg/v6.go
index c1bcd0071..d66ae105c 100644
--- a/chain/actors/builtin/verifreg/v6.go
+++ b/chain/actors/builtin/verifreg/v6.go
@@ -1,10 +1,15 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg"
adt6 "github.com/filecoin-project/specs-actors/v6/actors/util/adt"
@@ -47,7 +52,9 @@ func (s *state6) RootKey() (address.Address, error) {
}
func (s *state6) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version6, s.verifiedClients, addr)
+
}
func (s *state6) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -63,11 +70,15 @@ func (s *state6) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state6) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version6, s.verifiedClients, cb)
+
}
func (s *state6) verifiedClients() (adt.Map, error) {
+
return adt6.AsMap(s.store, s.VerifiedClients, builtin6.DefaultHamtBitwidth)
+
}
func (s *state6) verifiers() (adt.Map, error) {
@@ -82,3 +93,44 @@ func (s *state6) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state6) GetState() interface{} {
return &s.State
}
+
+func (s *state6) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v6")
+
+}
+
+func (s *state6) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v6")
+
+}
+
+func (s *state6) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v6")
+
+}
+
+func (s *state6) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v6")
+
+}
+
+func (s *state6) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state6) ActorVersion() actorstypes.Version {
+ return actorstypes.Version6
+}
+
+func (s *state6) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go
index edce5f560..72235e268 100644
--- a/chain/actors/builtin/verifreg/v7.go
+++ b/chain/actors/builtin/verifreg/v7.go
@@ -1,10 +1,15 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg"
adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt"
@@ -47,7 +52,9 @@ func (s *state7) RootKey() (address.Address, error) {
}
func (s *state7) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version7, s.verifiedClients, addr)
+
}
func (s *state7) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -63,11 +70,15 @@ func (s *state7) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state7) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version7, s.verifiedClients, cb)
+
}
func (s *state7) verifiedClients() (adt.Map, error) {
+
return adt7.AsMap(s.store, s.VerifiedClients, builtin7.DefaultHamtBitwidth)
+
}
func (s *state7) verifiers() (adt.Map, error) {
@@ -81,3 +92,44 @@ func (s *state7) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state7) GetState() interface{} {
return &s.State
}
+
+func (s *state7) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v7")
+
+}
+
+func (s *state7) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v7")
+
+}
+
+func (s *state7) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v7")
+
+}
+
+func (s *state7) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v7")
+
+}
+
+func (s *state7) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state7) ActorVersion() actorstypes.Version {
+ return actorstypes.Version7
+}
+
+func (s *state7) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v8.go b/chain/actors/builtin/verifreg/v8.go
index 00e0636ef..b39895bd9 100644
--- a/chain/actors/builtin/verifreg/v8.go
+++ b/chain/actors/builtin/verifreg/v8.go
@@ -1,13 +1,18 @@
package verifreg
import (
+ "fmt"
+
"github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
builtin8 "github.com/filecoin-project/go-state-types/builtin"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
@@ -47,7 +52,9 @@ func (s *state8) RootKey() (address.Address, error) {
}
func (s *state8) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
return getDataCap(s.store, actors.Version8, s.verifiedClients, addr)
+
}
func (s *state8) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
@@ -63,11 +70,15 @@ func (s *state8) ForEachVerifier(cb func(addr address.Address, dcap abi.StorageP
}
func (s *state8) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
return forEachCap(s.store, actors.Version8, s.verifiedClients, cb)
+
}
func (s *state8) verifiedClients() (adt.Map, error) {
+
return adt8.AsMap(s.store, s.VerifiedClients, builtin8.DefaultHamtBitwidth)
+
}
func (s *state8) verifiers() (adt.Map, error) {
@@ -81,3 +92,44 @@ func (s *state8) removeDataCapProposalIDs() (adt.Map, error) {
func (s *state8) GetState() interface{} {
return &s.State
}
+
+func (s *state8) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v8")
+
+}
+
+func (s *state8) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v8")
+
+}
+
+func (s *state8) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ return nil, false, xerrors.Errorf("unsupported in actors v8")
+
+}
+
+func (s *state8) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v8")
+
+}
+
+func (s *state8) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state8) ActorVersion() actorstypes.Version {
+ return actorstypes.Version8
+}
+
+func (s *state8) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/v9.go b/chain/actors/builtin/verifreg/v9.go
new file mode 100644
index 000000000..2348007e6
--- /dev/null
+++ b/chain/actors/builtin/verifreg/v9.go
@@ -0,0 +1,150 @@
+package verifreg
+
+import (
+ "fmt"
+
+ "github.com/ipfs/go-cid"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/big"
+ builtin9 "github.com/filecoin-project/go-state-types/builtin"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+)
+
+var _ State = (*state9)(nil)
+
+func load9(store adt.Store, root cid.Cid) (State, error) {
+ out := state9{store: store}
+ err := store.Get(store.Context(), root, &out)
+ if err != nil {
+ return nil, err
+ }
+ return &out, nil
+}
+
+func make9(store adt.Store, rootKeyAddress address.Address) (State, error) {
+ out := state9{store: store}
+
+ s, err := verifreg9.ConstructState(store, rootKeyAddress)
+ if err != nil {
+ return nil, err
+ }
+
+ out.State = *s
+
+ return &out, nil
+}
+
+type state9 struct {
+ verifreg9.State
+ store adt.Store
+}
+
+func (s *state9) RootKey() (address.Address, error) {
+ return s.State.RootKey, nil
+}
+
+func (s *state9) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+
+ return false, big.Zero(), xerrors.Errorf("unsupported in actors v9")
+
+}
+
+func (s *state9) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) {
+ return getDataCap(s.store, actors.Version9, s.verifiers, addr)
+}
+
+func (s *state9) RemoveDataCapProposalID(verifier address.Address, client address.Address) (bool, uint64, error) {
+ return getRemoveDataCapProposalID(s.store, actors.Version9, s.removeDataCapProposalIDs, verifier, client)
+}
+
+func (s *state9) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+ return forEachCap(s.store, actors.Version9, s.verifiers, cb)
+}
+
+func (s *state9) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error {
+
+ return xerrors.Errorf("unsupported in actors v9")
+
+}
+
+func (s *state9) verifiedClients() (adt.Map, error) {
+
+ return nil, xerrors.Errorf("unsupported in actors v9")
+
+}
+
+func (s *state9) verifiers() (adt.Map, error) {
+ return adt9.AsMap(s.store, s.Verifiers, builtin9.DefaultHamtBitwidth)
+}
+
+func (s *state9) removeDataCapProposalIDs() (adt.Map, error) {
+ return adt9.AsMap(s.store, s.RemoveDataCapProposalIDs, builtin9.DefaultHamtBitwidth)
+}
+
+func (s *state9) GetState() interface{} {
+ return &s.State
+}
+
+func (s *state9) GetAllocation(clientIdAddr address.Address, allocationId verifreg9.AllocationId) (*Allocation, bool, error) {
+
+ alloc, ok, err := s.FindAllocation(s.store, clientIdAddr, verifreg9.AllocationId(allocationId))
+ return (*Allocation)(alloc), ok, err
+}
+
+func (s *state9) GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error) {
+
+ v9Map, err := s.LoadAllocationsToMap(s.store, clientIdAddr)
+
+ retMap := make(map[AllocationId]Allocation, len(v9Map))
+ for k, v := range v9Map {
+ retMap[AllocationId(k)] = Allocation(v)
+ }
+
+ return retMap, err
+
+}
+
+func (s *state9) GetClaim(providerIdAddr address.Address, claimId verifreg9.ClaimId) (*Claim, bool, error) {
+
+ claim, ok, err := s.FindClaim(s.store, providerIdAddr, verifreg9.ClaimId(claimId))
+ return (*Claim)(claim), ok, err
+
+}
+
+func (s *state9) GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error) {
+
+ v9Map, err := s.LoadClaimsToMap(s.store, providerIdAddr)
+
+ retMap := make(map[ClaimId]Claim, len(v9Map))
+ for k, v := range v9Map {
+ retMap[ClaimId(k)] = Claim(v)
+ }
+
+ return retMap, err
+
+}
+
+func (s *state9) ActorKey() string {
+ return actors.VerifregKey
+}
+
+func (s *state9) ActorVersion() actorstypes.Version {
+ return actorstypes.Version9
+}
+
+func (s *state9) Code() cid.Cid {
+ code, ok := actors.GetActorCodeID(s.ActorVersion(), s.ActorKey())
+ if !ok {
+ panic(fmt.Errorf("didn't find actor %v code id for actor version %d", s.ActorKey(), s.ActorVersion()))
+ }
+
+ return code
+}
diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go
index 0e35af648..82c630c0f 100644
--- a/chain/actors/builtin/verifreg/verifreg.go
+++ b/chain/actors/builtin/verifreg/verifreg.go
@@ -1,11 +1,14 @@
package verifreg
import (
+ "github.com/ipfs/go-cid"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/cbor"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
@@ -21,8 +24,8 @@ import (
)
var (
- Address = builtin8.VerifiedRegistryActorAddr
- Methods = builtin8.MethodsVerifiedRegistry
+ Address = builtin10.VerifiedRegistryActorAddr
+ Methods = builtin10.MethodsVerifiedRegistry
)
func Load(store adt.Store, act *types.Actor) (State, error) {
@@ -33,9 +36,15 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
switch av {
- case actors.Version8:
+ case actorstypes.Version8:
return load8(store, act.Head)
+ case actorstypes.Version9:
+ return load9(store, act.Head)
+
+ case actorstypes.Version10:
+ return load10(store, act.Head)
+
}
}
@@ -67,33 +76,39 @@ func Load(store adt.Store, act *types.Actor) (State, error) {
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
-func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Address) (State, error) {
+func MakeState(store adt.Store, av actorstypes.Version, rootKeyAddress address.Address) (State, error) {
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
return make0(store, rootKeyAddress)
- case actors.Version2:
+ case actorstypes.Version2:
return make2(store, rootKeyAddress)
- case actors.Version3:
+ case actorstypes.Version3:
return make3(store, rootKeyAddress)
- case actors.Version4:
+ case actorstypes.Version4:
return make4(store, rootKeyAddress)
- case actors.Version5:
+ case actorstypes.Version5:
return make5(store, rootKeyAddress)
- case actors.Version6:
+ case actorstypes.Version6:
return make6(store, rootKeyAddress)
- case actors.Version7:
+ case actorstypes.Version7:
return make7(store, rootKeyAddress)
- case actors.Version8:
+ case actorstypes.Version8:
return make8(store, rootKeyAddress)
+ case actorstypes.Version9:
+ return make9(store, rootKeyAddress)
+
+ case actorstypes.Version10:
+ return make10(store, rootKeyAddress)
+
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
@@ -101,11 +116,39 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres
type State interface {
cbor.Marshaler
+ Code() cid.Cid
+ ActorKey() string
+ ActorVersion() actorstypes.Version
+
RootKey() (address.Address, error)
VerifiedClientDataCap(address.Address) (bool, abi.StoragePower, error)
VerifierDataCap(address.Address) (bool, abi.StoragePower, error)
RemoveDataCapProposalID(verifier address.Address, client address.Address) (bool, uint64, error)
ForEachVerifier(func(addr address.Address, dcap abi.StoragePower) error) error
ForEachClient(func(addr address.Address, dcap abi.StoragePower) error) error
+ GetAllocation(clientIdAddr address.Address, allocationId AllocationId) (*Allocation, bool, error)
+ GetAllocations(clientIdAddr address.Address) (map[AllocationId]Allocation, error)
+ GetClaim(providerIdAddr address.Address, claimId ClaimId) (*Claim, bool, error)
+ GetClaims(providerIdAddr address.Address) (map[ClaimId]Claim, error)
GetState() interface{}
}
+
+func AllCodes() []cid.Cid {
+ return []cid.Cid{
+ (&state0{}).Code(),
+ (&state2{}).Code(),
+ (&state3{}).Code(),
+ (&state4{}).Code(),
+ (&state5{}).Code(),
+ (&state6{}).Code(),
+ (&state7{}).Code(),
+ (&state8{}).Code(),
+ (&state9{}).Code(),
+ (&state10{}).Code(),
+ }
+}
+
+type Allocation = verifregtypes.Allocation
+type AllocationId = verifregtypes.AllocationId
+type Claim = verifregtypes.Claim
+type ClaimId = verifregtypes.ClaimId
diff --git a/chain/actors/manifest.go b/chain/actors/manifest.go
index 52ed3e77d..225c8b990 100644
--- a/chain/actors/manifest.go
+++ b/chain/actors/manifest.go
@@ -9,13 +9,14 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/manifest"
"github.com/filecoin-project/lotus/chain/actors/adt"
)
-var manifestCids map[Version]cid.Cid = make(map[Version]cid.Cid)
-var manifests map[Version]map[string]cid.Cid = make(map[Version]map[string]cid.Cid)
+var manifestCids map[actorstypes.Version]cid.Cid = make(map[actorstypes.Version]cid.Cid)
+var manifests map[actorstypes.Version]map[string]cid.Cid = make(map[actorstypes.Version]map[string]cid.Cid)
var actorMeta map[cid.Cid]actorEntry = make(map[cid.Cid]actorEntry)
const (
@@ -30,10 +31,14 @@ const (
RewardKey = "reward"
SystemKey = "system"
VerifregKey = "verifiedregistry"
+ DatacapKey = "datacap"
+ EvmKey = "evm"
+ EamKey = "eam"
+ EmbryoKey = "embryo"
)
-func GetBuiltinActorsKeys() []string {
- return []string{
+func GetBuiltinActorsKeys(av actorstypes.Version) []string {
+ keys := []string{
AccountKey,
CronKey,
InitKey,
@@ -46,6 +51,13 @@ func GetBuiltinActorsKeys() []string {
SystemKey,
VerifregKey,
}
+ if av >= 9 {
+ keys = append(keys, DatacapKey)
+ }
+ if av >= 10 {
+ keys = append(keys, EvmKey, EamKey, EmbryoKey)
+ }
+ return keys
}
var (
@@ -54,21 +66,21 @@ var (
type actorEntry struct {
name string
- version Version
+ version actorstypes.Version
}
-// ClearManifest clears all known manifests. This is usually used in tests that need to switch networks.
+// ClearManifests clears all known manifests. This is usually used in tests that need to switch networks.
func ClearManifests() {
manifestMx.Lock()
defer manifestMx.Unlock()
- manifestCids = make(map[Version]cid.Cid)
- manifests = make(map[Version]map[string]cid.Cid)
+ manifestCids = make(map[actorstypes.Version]cid.Cid)
+ manifests = make(map[actorstypes.Version]map[string]cid.Cid)
actorMeta = make(map[cid.Cid]actorEntry)
}
// RegisterManifest registers an actors manifest with lotus.
-func RegisterManifest(av Version, manifestCid cid.Cid, entries map[string]cid.Cid) {
+func RegisterManifest(av actorstypes.Version, manifestCid cid.Cid, entries map[string]cid.Cid) {
manifestMx.Lock()
defer manifestMx.Unlock()
@@ -81,7 +93,7 @@ func RegisterManifest(av Version, manifestCid cid.Cid, entries map[string]cid.Ci
}
// GetManifest gets a loaded manifest.
-func GetManifest(av Version) (cid.Cid, bool) {
+func GetManifest(av actorstypes.Version) (cid.Cid, bool) {
manifestMx.RLock()
defer manifestMx.RUnlock()
@@ -102,19 +114,21 @@ func ReadManifest(ctx context.Context, store cbor.IpldStore, mfCid cid.Cid) (map
return nil, xerrors.Errorf("error loading manifest (cid: %s): %w", mfCid, err)
}
- actorKeys := GetBuiltinActorsKeys() // TODO: we should be able to enumerate manifests directly.
- metadata := make(map[string]cid.Cid, len(actorKeys))
- for _, name := range actorKeys {
- if c, ok := mf.Get(name); ok {
- metadata[name] = c
- }
+ var manifestData manifest.ManifestData
+ if err := store.Get(ctx, mf.Data, &manifestData); err != nil {
+ return nil, xerrors.Errorf("error loading manifest data: %w", err)
+ }
+
+ metadata := make(map[string]cid.Cid)
+ for _, entry := range manifestData.Entries {
+ metadata[entry.Name] = entry.Code
}
return metadata, nil
}
// GetActorCodeIDsFromManifest looks up all builtin actor's code CIDs by actor version for versions that have a manifest.
-func GetActorCodeIDsFromManifest(av Version) (map[string]cid.Cid, bool) {
+func GetActorCodeIDsFromManifest(av actorstypes.Version) (map[string]cid.Cid, bool) {
manifestMx.RLock()
defer manifestMx.RUnlock()
@@ -137,7 +151,7 @@ func LoadManifest(ctx context.Context, mfCid cid.Cid, adtStore adt.Store) (*mani
return &mf, nil
}
-func GetActorMetaByCode(c cid.Cid) (string, Version, bool) {
+func GetActorMetaByCode(c cid.Cid) (string, actorstypes.Version, bool) {
manifestMx.RLock()
defer manifestMx.RUnlock()
diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go
index 746b19287..eff7ba899 100644
--- a/chain/actors/policy/policy.go
+++ b/chain/actors/policy/policy.go
@@ -1,17 +1,24 @@
package policy
import (
- "sort"
-
"golang.org/x/xerrors"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
+ builtin10 "github.com/filecoin-project/go-state-types/builtin"
builtin8 "github.com/filecoin-project/go-state-types/builtin"
+ builtin9 "github.com/filecoin-project/go-state-types/builtin"
+ market10 "github.com/filecoin-project/go-state-types/builtin/v10/market"
+ miner10 "github.com/filecoin-project/go-state-types/builtin/v10/miner"
+ paych10 "github.com/filecoin-project/go-state-types/builtin/v10/paych"
+ verifreg10 "github.com/filecoin-project/go-state-types/builtin/v10/verifreg"
market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
miner8 "github.com/filecoin-project/go-state-types/builtin/v8/miner"
- paych8 "github.com/filecoin-project/go-state-types/builtin/v8/paych"
verifreg8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg"
+ market9 "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/network"
market0 "github.com/filecoin-project/specs-actors/actors/builtin/market"
miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner"
@@ -41,15 +48,13 @@ import (
market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market"
miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner"
verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg"
-
- "github.com/filecoin-project/lotus/chain/actors"
)
const (
- ChainFinality = miner8.ChainFinality
+ ChainFinality = miner10.ChainFinality
SealRandomnessLookback = ChainFinality
- PaychSettleDelay = paych8.SettleDelay
- MaxPreCommitRandomnessLookback = builtin8.EpochsInDay + SealRandomnessLookback
+ PaychSettleDelay = paych10.SettleDelay
+ MaxPreCommitRandomnessLookback = builtin10.EpochsInDay + SealRandomnessLookback
)
// SetSupportedProofTypes sets supported proof types, across all actor versions.
@@ -76,8 +81,6 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) {
miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types))
- miner8.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types))
-
AddSupportedProofTypes(types...)
}
@@ -134,15 +137,6 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) {
miner7.WindowPoStProofTypes[wpp] = struct{}{}
- miner8.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{}
- wpp, err = t.RegisteredWindowPoStProof()
- if err != nil {
- // Fine to panic, this is a test-only method
- panic(err)
- }
-
- miner8.WindowPoStProofTypes[wpp] = struct{}{}
-
}
}
@@ -167,11 +161,15 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) {
miner8.PreCommitChallengeDelay = delay
+ miner9.PreCommitChallengeDelay = delay
+
+ miner10.PreCommitChallengeDelay = delay
+
}
// TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay.
func GetPreCommitChallengeDelay() abi.ChainEpoch {
- return miner8.PreCommitChallengeDelay
+ return miner10.PreCommitChallengeDelay
}
// SetConsensusMinerMinPower sets the minimum power of an individual miner must
@@ -209,6 +207,14 @@ func SetConsensusMinerMinPower(p abi.StoragePower) {
policy.ConsensusMinerMinPower = p
}
+ for _, policy := range builtin9.PoStProofPolicies {
+ policy.ConsensusMinerMinPower = p
+ }
+
+ for _, policy := range builtin10.PoStProofPolicies {
+ policy.ConsensusMinerMinPower = p
+ }
+
}
// SetMinVerifiedDealSize sets the minimum size of a verified deal. This should
@@ -231,43 +237,55 @@ func SetMinVerifiedDealSize(size abi.StoragePower) {
verifreg8.MinVerifiedDealSize = size
+ verifreg9.MinVerifiedDealSize = size
+
+ verifreg10.MinVerifiedDealSize = size
+
}
-func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) {
+func GetMaxProveCommitDuration(ver actorstypes.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) {
switch ver {
- case actors.Version0:
+ case actorstypes.Version0:
return miner0.MaxSealDuration[t], nil
- case actors.Version2:
+ case actorstypes.Version2:
return miner2.MaxProveCommitDuration[t], nil
- case actors.Version3:
+ case actorstypes.Version3:
return miner3.MaxProveCommitDuration[t], nil
- case actors.Version4:
+ case actorstypes.Version4:
return miner4.MaxProveCommitDuration[t], nil
- case actors.Version5:
+ case actorstypes.Version5:
return miner5.MaxProveCommitDuration[t], nil
- case actors.Version6:
+ case actorstypes.Version6:
return miner6.MaxProveCommitDuration[t], nil
- case actors.Version7:
+ case actorstypes.Version7:
return miner7.MaxProveCommitDuration[t], nil
- case actors.Version8:
+ case actorstypes.Version8:
return miner8.MaxProveCommitDuration[t], nil
+ case actorstypes.Version9:
+
+ return miner9.MaxProveCommitDuration[t], nil
+
+ case actorstypes.Version10:
+
+ return miner10.MaxProveCommitDuration[t], nil
+
default:
return 0, xerrors.Errorf("unsupported actors version")
}
@@ -313,6 +331,16 @@ func SetProviderCollateralSupplyTarget(num, denom big.Int) {
Denominator: denom,
}
+ market9.ProviderCollateralSupplyTarget = builtin9.BigFrac{
+ Numerator: num,
+ Denominator: denom,
+ }
+
+ market10.ProviderCollateralSupplyTarget = builtin10.BigFrac{
+ Numerator: num,
+ Denominator: denom,
+ }
+
}
func DealProviderCollateralBounds(
@@ -320,59 +348,69 @@ func DealProviderCollateralBounds(
rawBytePower, qaPower, baselinePower abi.StoragePower,
circulatingFil abi.TokenAmount, nwVer network.Version,
) (min, max abi.TokenAmount, err error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return big.Zero(), big.Zero(), err
}
switch v {
- case actors.Version0:
+ case actorstypes.Version0:
min, max := market0.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer)
return min, max, nil
- case actors.Version2:
+ case actorstypes.Version2:
min, max := market2.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
return min, max, nil
- case actors.Version3:
+ case actorstypes.Version3:
min, max := market3.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
return min, max, nil
- case actors.Version4:
+ case actorstypes.Version4:
min, max := market4.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
return min, max, nil
- case actors.Version5:
+ case actorstypes.Version5:
min, max := market5.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
return min, max, nil
- case actors.Version6:
+ case actorstypes.Version6:
min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
return min, max, nil
- case actors.Version7:
+ case actorstypes.Version7:
min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
return min, max, nil
- case actors.Version8:
+ case actorstypes.Version8:
min, max := market8.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
return min, max, nil
+ case actorstypes.Version9:
+
+ min, max := market9.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
+ return min, max, nil
+
+ case actorstypes.Version10:
+
+ min, max := market10.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil)
+ return min, max, nil
+
default:
return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version")
}
}
func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) {
- return market8.DealDurationBounds(pieceSize)
+ return market10.DealDurationBounds(pieceSize)
}
// Sets the challenge window and scales the proving period to match (such that
@@ -427,6 +465,20 @@ func SetWPoStChallengeWindow(period abi.ChainEpoch) {
// scale it if we're scaling the challenge period.
miner8.WPoStDisputeWindow = period * 30
+ miner9.WPoStChallengeWindow = period
+ miner9.WPoStProvingPeriod = period * abi.ChainEpoch(miner9.WPoStPeriodDeadlines)
+
+ // by default, this is 2x finality which is 30 periods.
+ // scale it if we're scaling the challenge period.
+ miner9.WPoStDisputeWindow = period * 30
+
+ miner10.WPoStChallengeWindow = period
+ miner10.WPoStProvingPeriod = period * abi.ChainEpoch(miner10.WPoStPeriodDeadlines)
+
+ // by default, this is 2x finality which is 30 periods.
+ // scale it if we're scaling the challenge period.
+ miner10.WPoStDisputeWindow = period * 30
+
}
func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch {
@@ -439,15 +491,15 @@ func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch {
}
func GetMaxSectorExpirationExtension() abi.ChainEpoch {
- return miner8.MaxSectorExpirationExtension
+ return miner10.MaxSectorExpirationExtension
}
func GetMinSectorExpiration() abi.ChainEpoch {
- return miner8.MinSectorExpiration
+ return miner10.MinSectorExpiration
}
func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) {
- sectorsPerPart, err := builtin8.PoStProofWindowPoStPartitionSectors(p)
+ sectorsPerPart, err := builtin10.PoStProofWindowPoStPartitionSectors(p)
if err != nil {
return 0, err
}
@@ -458,25 +510,6 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e
return int(uint64(maxSectors) / sectorsPerPart), nil
}
-func GetDefaultSectorSize() abi.SectorSize {
- // supported sector sizes are the same across versions.
- szs := make([]abi.SectorSize, 0, len(miner8.PreCommitSealProofTypesV8))
- for spt := range miner8.PreCommitSealProofTypesV8 {
- ss, err := spt.SectorSize()
- if err != nil {
- panic(err)
- }
-
- szs = append(szs, ss)
- }
-
- sort.Slice(szs, func(i, j int) bool {
- return szs[i] < szs[j]
- })
-
- return szs[0]
-}
-
func GetDefaultAggregationProof() abi.RegisteredAggregationProof {
return abi.RegisteredAggregationProof_SnarkPackV1
}
@@ -486,173 +519,203 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version)
return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime
}
- return builtin8.SealProofPoliciesV11[proof].SectorMaxLifetime
+ return builtin10.SealProofPoliciesV11[proof].SectorMaxLifetime
}
func GetAddressedSectorsMax(nwVer network.Version) (int, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return 0, err
}
switch v {
- case actors.Version0:
+ case actorstypes.Version0:
return miner0.AddressedSectorsMax, nil
- case actors.Version2:
+ case actorstypes.Version2:
return miner2.AddressedSectorsMax, nil
- case actors.Version3:
+ case actorstypes.Version3:
return miner3.AddressedSectorsMax, nil
- case actors.Version4:
+ case actorstypes.Version4:
return miner4.AddressedSectorsMax, nil
- case actors.Version5:
+ case actorstypes.Version5:
return miner5.AddressedSectorsMax, nil
- case actors.Version6:
+ case actorstypes.Version6:
return miner6.AddressedSectorsMax, nil
- case actors.Version7:
+ case actorstypes.Version7:
return miner7.AddressedSectorsMax, nil
- case actors.Version8:
+ case actorstypes.Version8:
return miner8.AddressedSectorsMax, nil
+ case actorstypes.Version9:
+ return miner9.AddressedSectorsMax, nil
+
+ case actorstypes.Version10:
+ return miner10.AddressedSectorsMax, nil
+
default:
return 0, xerrors.Errorf("unsupported network version")
}
}
func GetDeclarationsMax(nwVer network.Version) (int, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return 0, err
}
switch v {
- case actors.Version0:
+ case actorstypes.Version0:
// TODO: Should we instead error here since the concept doesn't exist yet?
return miner0.AddressedPartitionsMax, nil
- case actors.Version2:
+ case actorstypes.Version2:
return miner2.DeclarationsMax, nil
- case actors.Version3:
+ case actorstypes.Version3:
return miner3.DeclarationsMax, nil
- case actors.Version4:
+ case actorstypes.Version4:
return miner4.DeclarationsMax, nil
- case actors.Version5:
+ case actorstypes.Version5:
return miner5.DeclarationsMax, nil
- case actors.Version6:
+ case actorstypes.Version6:
return miner6.DeclarationsMax, nil
- case actors.Version7:
+ case actorstypes.Version7:
return miner7.DeclarationsMax, nil
- case actors.Version8:
+ case actorstypes.Version8:
return miner8.DeclarationsMax, nil
+ case actorstypes.Version9:
+
+ return miner9.DeclarationsMax, nil
+
+ case actorstypes.Version10:
+
+ return miner10.DeclarationsMax, nil
+
default:
return 0, xerrors.Errorf("unsupported network version")
}
}
func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return big.Zero(), err
}
switch v {
- case actors.Version0:
+ case actorstypes.Version0:
return big.Zero(), nil
- case actors.Version2:
+ case actorstypes.Version2:
return big.Zero(), nil
- case actors.Version3:
+ case actorstypes.Version3:
return big.Zero(), nil
- case actors.Version4:
+ case actorstypes.Version4:
return big.Zero(), nil
- case actors.Version5:
+ case actorstypes.Version5:
return miner5.AggregateNetworkFee(aggregateSize, baseFee), nil
- case actors.Version6:
+ case actorstypes.Version6:
return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil
- case actors.Version7:
+ case actorstypes.Version7:
return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil
- case actors.Version8:
+ case actorstypes.Version8:
return miner8.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil
+ case actorstypes.Version9:
+
+ return miner9.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil
+
+ case actorstypes.Version10:
+
+ return miner10.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil
+
default:
return big.Zero(), xerrors.Errorf("unsupported network version")
}
}
func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return big.Zero(), err
}
switch v {
- case actors.Version0:
+ case actorstypes.Version0:
return big.Zero(), nil
- case actors.Version2:
+ case actorstypes.Version2:
return big.Zero(), nil
- case actors.Version3:
+ case actorstypes.Version3:
return big.Zero(), nil
- case actors.Version4:
+ case actorstypes.Version4:
return big.Zero(), nil
- case actors.Version5:
+ case actorstypes.Version5:
return big.Zero(), nil
- case actors.Version6:
+ case actorstypes.Version6:
return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil
- case actors.Version7:
+ case actorstypes.Version7:
return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil
- case actors.Version8:
+ case actorstypes.Version8:
return miner8.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil
+ case actorstypes.Version9:
+
+ return miner9.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil
+
+ case actorstypes.Version10:
+
+ return miner10.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil
+
default:
return big.Zero(), xerrors.Errorf("unsupported network version")
}
diff --git a/chain/actors/policy/policy.go.template b/chain/actors/policy/policy.go.template
index 090e91165..f5178500a 100644
--- a/chain/actors/policy/policy.go.template
+++ b/chain/actors/policy/policy.go.template
@@ -1,14 +1,13 @@
package policy
import (
- "sort"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/network"
- "github.com/filecoin-project/lotus/chain/actors"
{{range .versions}}
{{if (ge . 8)}}
@@ -50,7 +49,7 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) {
miner{{.}}.PreCommitSealProofTypesV0 = make(map[abi.RegisteredSealProof]struct{}, len(types))
miner{{.}}.PreCommitSealProofTypesV7 = make(map[abi.RegisteredSealProof]struct{}, len(types)*2)
miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types))
- {{else}}
+ {{else if (le . 7)}}
miner{{.}}.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types))
{{end}}
{{end}}
@@ -84,7 +83,7 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) {
}
miner{{.}}.WindowPoStProofTypes[wpp] = struct{}{}
- {{else}}
+ {{else if (le . 7)}}
miner{{.}}.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{}
wpp, err = t.RegisteredWindowPoStProof()
if err != nil {
@@ -139,10 +138,10 @@ func SetMinVerifiedDealSize(size abi.StoragePower) {
{{end}}
}
-func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) {
+func GetMaxProveCommitDuration(ver actorstypes.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) {
switch ver {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
{{if (eq . 0)}}
return miner{{.}}.MaxSealDuration[t], nil
{{else}}
@@ -173,13 +172,13 @@ func DealProviderCollateralBounds(
rawBytePower, qaPower, baselinePower abi.StoragePower,
circulatingFil abi.TokenAmount, nwVer network.Version,
) (min, max abi.TokenAmount, err error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return big.Zero(), big.Zero(), err
}
switch v {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
{{if (eq . 0)}}
min, max := market{{.}}.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil, nwVer)
return min, max, nil
@@ -240,25 +239,6 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e
return int(uint64(maxSectors) / sectorsPerPart), nil
}
-func GetDefaultSectorSize() abi.SectorSize {
- // supported sector sizes are the same across versions.
- szs := make([]abi.SectorSize, 0, len(miner{{.latestVersion}}.PreCommitSealProofTypesV8))
- for spt := range miner{{.latestVersion}}.PreCommitSealProofTypesV8 {
- ss, err := spt.SectorSize()
- if err != nil {
- panic(err)
- }
-
- szs = append(szs, ss)
- }
-
- sort.Slice(szs, func(i, j int) bool {
- return szs[i] < szs[j]
- })
-
- return szs[0]
-}
-
func GetDefaultAggregationProof() abi.RegisteredAggregationProof {
return abi.RegisteredAggregationProof_SnarkPackV1
}
@@ -272,13 +252,13 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version)
}
func GetAddressedSectorsMax(nwVer network.Version) (int, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return 0, err
}
switch v {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
return miner{{.}}.AddressedSectorsMax, nil
{{end}}
default:
@@ -287,13 +267,13 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) {
}
func GetDeclarationsMax(nwVer network.Version) (int, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return 0, err
}
switch v {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
{{if (eq . 0)}}
// TODO: Should we instead error here since the concept doesn't exist yet?
return miner{{.}}.AddressedPartitionsMax, nil
@@ -307,13 +287,13 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) {
}
func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return big.Zero(), err
}
switch v {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
{{if (ge . 6)}}
return miner{{.}}.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil
{{else if (eq . 5)}}
@@ -328,13 +308,13 @@ func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, ba
}
func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, baseFee abi.TokenAmount) (abi.TokenAmount, error) {
- v, err := actors.VersionForNetwork(nwVer)
+ v, err := actorstypes.VersionForNetwork(nwVer)
if err != nil {
return big.Zero(), err
}
switch v {
{{range .versions}}
- case actors.Version{{.}}:
+ case actorstypes.Version{{.}}:
{{if (ge . 6)}}
return miner{{.}}.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil
{{else}}
diff --git a/chain/actors/version.go b/chain/actors/version.go
index 1a17a6972..34e9a88bf 100644
--- a/chain/actors/version.go
+++ b/chain/actors/version.go
@@ -1,11 +1,5 @@
package actors
-import (
- "fmt"
-
- "github.com/filecoin-project/go-state-types/network"
-)
-
type Version int
/* inline-gen template
@@ -20,43 +14,21 @@ const ({{range .actorVersions}}
/* inline-gen start */
-var LatestVersion = 8
+var LatestVersion = 10
-var Versions = []int{0, 2, 3, 4, 5, 6, 7, 8}
+var Versions = []int{0, 2, 3, 4, 5, 6, 7, 8, 9, 10}
const (
- Version0 Version = 0
- Version2 Version = 2
- Version3 Version = 3
- Version4 Version = 4
- Version5 Version = 5
- Version6 Version = 6
- Version7 Version = 7
- Version8 Version = 8
+ Version0 Version = 0
+ Version2 Version = 2
+ Version3 Version = 3
+ Version4 Version = 4
+ Version5 Version = 5
+ Version6 Version = 6
+ Version7 Version = 7
+ Version8 Version = 8
+ Version9 Version = 9
+ Version10 Version = 10
)
/* inline-gen end */
-
-// Converts a network version into an actors adt version.
-func VersionForNetwork(version network.Version) (Version, error) {
- switch version {
- case network.Version0, network.Version1, network.Version2, network.Version3:
- return Version0, nil
- case network.Version4, network.Version5, network.Version6, network.Version7, network.Version8, network.Version9:
- return Version2, nil
- case network.Version10, network.Version11:
- return Version3, nil
- case network.Version12:
- return Version4, nil
- case network.Version13:
- return Version5, nil
- case network.Version14:
- return Version6, nil
- case network.Version15:
- return Version7, nil
- case network.Version16:
- return Version8, nil
- default:
- return -1, fmt.Errorf("unsupported network version %d", version)
- }
-}
diff --git a/chain/beacon/drand/drand.go b/chain/beacon/drand/drand.go
index 5b6cc45bd..181fa3046 100644
--- a/chain/beacon/drand/drand.go
+++ b/chain/beacon/drand/drand.go
@@ -107,7 +107,7 @@ func NewDrandBeacon(genesisTs, interval uint64, ps *pubsub.PubSub, config dtypes
client, err := dclient.Wrap(clients, opts...)
if err != nil {
- return nil, xerrors.Errorf("creating drand client")
+ return nil, xerrors.Errorf("creating drand client: %w", err)
}
lc, err := lru.New(1024)
diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go
index e735f362e..ece973798 100644
--- a/chain/consensus/filcns/compute_state.go
+++ b/chain/consensus/filcns/compute_state.go
@@ -4,20 +4,6 @@ import (
"context"
"sync/atomic"
- /* inline-gen template
- {{range .actorVersions}}
- exported{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin/exported"{{end}}
- /* inline-gen start */
- exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported"
- exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported"
- exported3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/exported"
- exported4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/exported"
- exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported"
- exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported"
- exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported"
- exported8 "github.com/filecoin-project/specs-actors/v8/actors/builtin/exported"
-
- /* inline-gen end */
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"go.opencensus.io/stats"
@@ -25,8 +11,16 @@ import (
"golang.org/x/xerrors"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
+ exported0 "github.com/filecoin-project/specs-actors/actors/builtin/exported"
blockadt "github.com/filecoin-project/specs-actors/actors/util/adt"
+ exported2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/exported"
+ exported3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/exported"
+ exported4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/exported"
+ exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported"
+ exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported"
+ exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported"
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/build"
@@ -45,23 +39,16 @@ import (
func NewActorRegistry() *vm.ActorRegistry {
inv := vm.NewActorRegistry()
- /* inline-gen template
- {{range .actorVersions}}
- inv.Register(actors.Version{{.}}, vm.ActorsVersionPredicate(actors.Version{{.}}), exported{{.}}.BuiltinActors()...){{end}}
-
-
- /* inline-gen start */
-
- inv.Register(actors.Version0, vm.ActorsVersionPredicate(actors.Version0), exported0.BuiltinActors()...)
- inv.Register(actors.Version2, vm.ActorsVersionPredicate(actors.Version2), exported2.BuiltinActors()...)
- inv.Register(actors.Version3, vm.ActorsVersionPredicate(actors.Version3), exported3.BuiltinActors()...)
- inv.Register(actors.Version4, vm.ActorsVersionPredicate(actors.Version4), exported4.BuiltinActors()...)
- inv.Register(actors.Version5, vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...)
- inv.Register(actors.Version6, vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...)
- inv.Register(actors.Version7, vm.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...)
- inv.Register(actors.Version8, vm.ActorsVersionPredicate(actors.Version8), exported8.BuiltinActors()...)
-
- /* inline-gen end */
+ inv.Register(actorstypes.Version0, vm.ActorsVersionPredicate(actorstypes.Version0), builtin.MakeRegistryLegacy(exported0.BuiltinActors()))
+ inv.Register(actorstypes.Version2, vm.ActorsVersionPredicate(actorstypes.Version2), builtin.MakeRegistryLegacy(exported2.BuiltinActors()))
+ inv.Register(actorstypes.Version3, vm.ActorsVersionPredicate(actorstypes.Version3), builtin.MakeRegistryLegacy(exported3.BuiltinActors()))
+ inv.Register(actorstypes.Version4, vm.ActorsVersionPredicate(actorstypes.Version4), builtin.MakeRegistryLegacy(exported4.BuiltinActors()))
+ inv.Register(actorstypes.Version5, vm.ActorsVersionPredicate(actorstypes.Version5), builtin.MakeRegistryLegacy(exported5.BuiltinActors()))
+ inv.Register(actorstypes.Version6, vm.ActorsVersionPredicate(actorstypes.Version6), builtin.MakeRegistryLegacy(exported6.BuiltinActors()))
+ inv.Register(actorstypes.Version7, vm.ActorsVersionPredicate(actorstypes.Version7), builtin.MakeRegistryLegacy(exported7.BuiltinActors()))
+ inv.Register(actorstypes.Version8, vm.ActorsVersionPredicate(actorstypes.Version8), builtin.MakeRegistry(actorstypes.Version8))
+ inv.Register(actorstypes.Version9, vm.ActorsVersionPredicate(actorstypes.Version9), builtin.MakeRegistry(actorstypes.Version9))
+ inv.Register(actorstypes.Version10, vm.ActorsVersionPredicate(actorstypes.Version10), builtin.MakeRegistry(actorstypes.Version10))
return inv
}
@@ -114,6 +101,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context,
NetworkVersion: sm.GetNetworkVersion(ctx, e),
BaseFee: baseFee,
LookbackState: stmgr.LookbackStateGetterForTipset(sm, ts),
+ TipSetGetter: stmgr.TipSetGetterForTipset(sm.ChainStore(), ts),
Tracing: vmTracing,
}
diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go
index d5e6b45fd..f3345ea7d 100644
--- a/chain/consensus/filcns/upgrades.go
+++ b/chain/consensus/filcns/upgrades.go
@@ -4,7 +4,9 @@ import (
"context"
_ "embed"
"fmt"
+ "os"
"runtime"
+ "strconv"
"time"
"github.com/docker/go-units"
@@ -14,7 +16,9 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
+ nv17 "github.com/filecoin-project/go-state-types/builtin/v9/migration"
"github.com/filecoin-project/go-state-types/manifest"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/go-state-types/rt"
@@ -51,6 +55,29 @@ import (
//go:embed FVMLiftoff.txt
var fvmLiftoffBanner string
+var (
+ MigrationMaxWorkerCount int
+ EnvMigrationMaxWorkerCount = "LOTUS_MIGRATION_MAX_WORKER_COUNT"
+)
+
+func init() {
+ // the default calculation used for migration worker count
+ MigrationMaxWorkerCount = runtime.NumCPU()
+ // check if an alternative value was request by environment
+ if mwcs := os.Getenv(EnvMigrationMaxWorkerCount); mwcs != "" {
+ mwc, err := strconv.ParseInt(mwcs, 10, 32)
+ if err != nil {
+ log.Warnf("invalid value for %s (%s) defaulting to %d: %s", EnvMigrationMaxWorkerCount, mwcs, MigrationMaxWorkerCount, err)
+ return
+ }
+ // use value from environment
+ log.Infof("migration worker cound set from %s (%d)", EnvMigrationMaxWorkerCount, mwc)
+ MigrationMaxWorkerCount = int(mwc)
+ return
+ }
+ log.Infof("migration worker count: %d", MigrationMaxWorkerCount)
+}
+
func DefaultUpgradeSchedule() stmgr.UpgradeSchedule {
var us stmgr.UpgradeSchedule
@@ -189,7 +216,24 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule {
StopWithin: 5,
}},
Expensive: true,
+ }, {
+ Height: build.UpgradeSharkHeight,
+ Network: network.Version17,
+ Migration: UpgradeActorsV9,
+ PreMigrations: []stmgr.PreMigration{{
+ PreMigration: PreUpgradeActorsV9,
+ StartWithin: 240,
+ DontStartWithin: 60,
+ StopWithin: 20,
+ }, {
+ PreMigration: PreUpgradeActorsV9,
+ StartWithin: 15,
+ DontStartWithin: 10,
+ StopWithin: 5,
+ }},
+ Expensive: true,
},
+ // TODO v10 upgrade
}
for _, u := range updates {
@@ -872,7 +916,7 @@ func UpgradeCalico(ctx context.Context, sm *stmgr.StateManager, _ stmgr.Migratio
func UpgradeActorsV3(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
// Use all the CPUs except 3.
- workerCount := runtime.NumCPU() - 3
+ workerCount := MigrationMaxWorkerCount - 3
if workerCount <= 0 {
workerCount = 1
}
@@ -910,7 +954,7 @@ func UpgradeActorsV3(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi
func PreUpgradeActorsV3(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error {
// Use half the CPUs for pre-migration, but leave at least 3.
- workerCount := runtime.NumCPU()
+ workerCount := MigrationMaxWorkerCount
if workerCount <= 4 {
workerCount = 1
} else {
@@ -974,7 +1018,7 @@ func upgradeActorsV3Common(
func UpgradeActorsV4(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
// Use all the CPUs except 3.
- workerCount := runtime.NumCPU() - 3
+ workerCount := MigrationMaxWorkerCount - 3
if workerCount <= 0 {
workerCount = 1
}
@@ -996,7 +1040,7 @@ func UpgradeActorsV4(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi
func PreUpgradeActorsV4(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error {
// Use half the CPUs for pre-migration, but leave at least 3.
- workerCount := runtime.NumCPU()
+ workerCount := MigrationMaxWorkerCount
if workerCount <= 4 {
workerCount = 1
} else {
@@ -1060,7 +1104,7 @@ func upgradeActorsV4Common(
func UpgradeActorsV5(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
// Use all the CPUs except 3.
- workerCount := runtime.NumCPU() - 3
+ workerCount := MigrationMaxWorkerCount - 3
if workerCount <= 0 {
workerCount = 1
}
@@ -1082,7 +1126,7 @@ func UpgradeActorsV5(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi
func PreUpgradeActorsV5(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error {
// Use half the CPUs for pre-migration, but leave at least 3.
- workerCount := runtime.NumCPU()
+ workerCount := MigrationMaxWorkerCount
if workerCount <= 4 {
workerCount = 1
} else {
@@ -1146,7 +1190,7 @@ func upgradeActorsV5Common(
func UpgradeActorsV6(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
// Use all the CPUs except 3.
- workerCount := runtime.NumCPU() - 3
+ workerCount := MigrationMaxWorkerCount - 3
if workerCount <= 0 {
workerCount = 1
}
@@ -1168,7 +1212,7 @@ func UpgradeActorsV6(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi
func PreUpgradeActorsV6(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error {
// Use half the CPUs for pre-migration, but leave at least 3.
- workerCount := runtime.NumCPU()
+ workerCount := MigrationMaxWorkerCount
if workerCount <= 4 {
workerCount = 1
} else {
@@ -1232,7 +1276,7 @@ func upgradeActorsV6Common(
func UpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
// Use all the CPUs except 3.
- workerCount := runtime.NumCPU() - 3
+ workerCount := MigrationMaxWorkerCount - 3
if workerCount <= 0 {
workerCount = 1
}
@@ -1254,7 +1298,7 @@ func UpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi
func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error {
// Use half the CPUs for pre-migration, but leave at least 3.
- workerCount := runtime.NumCPU()
+ workerCount := MigrationMaxWorkerCount
if workerCount <= 4 {
workerCount = 1
} else {
@@ -1325,7 +1369,7 @@ func upgradeActorsV7Common(
func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
// Use all the CPUs except 3.
- workerCount := runtime.NumCPU() - 3
+ workerCount := MigrationMaxWorkerCount - 3
if workerCount <= 0 {
workerCount = 1
}
@@ -1349,7 +1393,7 @@ func UpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi
func PreUpgradeActorsV8(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error {
// Use half the CPUs for pre-migration, but leave at least 3.
- workerCount := runtime.NumCPU()
+ workerCount := MigrationMaxWorkerCount
if workerCount <= 4 {
workerCount = 1
} else {
@@ -1377,7 +1421,7 @@ func upgradeActorsV8Common(
store := store.ActorStore(ctx, buf)
// ensure that the manifest is loaded in the blockstore
- if err := bundle.LoadBundles(ctx, buf, actors.Version8); err != nil {
+ if err := bundle.LoadBundles(ctx, buf, actorstypes.Version8); err != nil {
return cid.Undef, xerrors.Errorf("failed to load manifest bundle: %w", err)
}
@@ -1394,7 +1438,7 @@ func upgradeActorsV8Common(
)
}
- manifest, ok := actors.GetManifest(actors.Version8)
+ manifest, ok := actors.GetManifest(actorstypes.Version8)
if !ok {
return cid.Undef, xerrors.Errorf("no manifest CID for v8 upgrade")
}
@@ -1429,6 +1473,120 @@ func upgradeActorsV8Common(
return newRoot, nil
}
+func UpgradeActorsV9(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor,
+ root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
+ // Use all the CPUs except 3.
+ workerCount := MigrationMaxWorkerCount - 3
+ if workerCount <= 0 {
+ workerCount = 1
+ }
+
+ config := nv17.Config{
+ MaxWorkers: uint(workerCount),
+ JobQueueSize: 1000,
+ ResultQueueSize: 100,
+ ProgressLogPeriod: 10 * time.Second,
+ }
+
+ newRoot, err := upgradeActorsV9Common(ctx, sm, cache, root, epoch, ts, config)
+ if err != nil {
+ return cid.Undef, xerrors.Errorf("migrating actors v8 state: %w", err)
+ }
+
+ return newRoot, nil
+}
+
+func PreUpgradeActorsV9(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid,
+ epoch abi.ChainEpoch, ts *types.TipSet) error {
+ // Use half the CPUs for pre-migration, but leave at least 3.
+ workerCount := MigrationMaxWorkerCount
+ if workerCount <= 4 {
+ workerCount = 1
+ } else {
+ workerCount /= 2
+ }
+
+ lbts, lbRoot, err := stmgr.GetLookbackTipSetForRound(ctx, sm, ts, epoch)
+ if err != nil {
+ return xerrors.Errorf("error getting lookback ts for premigration: %w", err)
+ }
+
+ config := nv17.Config{MaxWorkers: uint(workerCount),
+ ProgressLogPeriod: time.Minute * 5}
+
+ _, err = upgradeActorsV9Common(ctx, sm, cache, lbRoot, epoch, lbts, config)
+ return err
+}
+
+func upgradeActorsV9Common(
+ ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache,
+ root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet,
+ config nv17.Config,
+) (cid.Cid, error) {
+ writeStore := blockstore.NewAutobatch(ctx, sm.ChainStore().StateBlockstore(), units.GiB/4)
+ store := store.ActorStore(ctx, writeStore)
+
+ // ensure that the manifest is loaded in the blockstore
+ if err := bundle.LoadBundles(ctx, sm.ChainStore().StateBlockstore(), actorstypes.Version9); err != nil {
+ return cid.Undef, xerrors.Errorf("failed to load manifest bundle: %w", err)
+ }
+
+ // Load the state root.
+ var stateRoot types.StateRoot
+ if err := store.Get(ctx, root, &stateRoot); err != nil {
+ return cid.Undef, xerrors.Errorf("failed to decode state root: %w", err)
+ }
+
+ if stateRoot.Version != types.StateTreeVersion4 {
+ return cid.Undef, xerrors.Errorf(
+ "expected state root version 4 for actors v9 upgrade, got %d",
+ stateRoot.Version,
+ )
+ }
+
+ manifest, ok := actors.GetManifest(actorstypes.Version9)
+ if !ok {
+ return cid.Undef, xerrors.Errorf("no manifest CID for v9 upgrade")
+ }
+
+ // Perform the migration
+ newHamtRoot, err := nv17.MigrateStateTree(ctx, store, manifest, stateRoot.Actors, epoch, config,
+ migrationLogger{}, cache)
+ if err != nil {
+ return cid.Undef, xerrors.Errorf("upgrading to actors v9: %w", err)
+ }
+
+ // Persist the result.
+ newRoot, err := store.Put(ctx, &types.StateRoot{
+ Version: types.StateTreeVersion4,
+ Actors: newHamtRoot,
+ Info: stateRoot.Info,
+ })
+ if err != nil {
+ return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err)
+ }
+
+ // Persists the new tree and shuts down the flush worker
+ if err := writeStore.Flush(ctx); err != nil {
+ return cid.Undef, xerrors.Errorf("writeStore flush failed: %w", err)
+ }
+
+ if err := writeStore.Shutdown(ctx); err != nil {
+ return cid.Undef, xerrors.Errorf("writeStore shutdown failed: %w", err)
+ }
+
+ return newRoot, nil
+}
+
+func UpgradeActorsV10(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor,
+ root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) {
+
+ // TODO migration
+ // - the init actor state to include the (empty) installed actors field
+ // - state tree migration to v5
+ return cid.Undef, fmt.Errorf("IMPLEMENTME: v10 migration")
+}
+
// Example upgrade function if upgrade requires only code changes
//func UpgradeActorsV9(ctx context.Context, sm *stmgr.StateManager, _ stmgr.MigrationCache, _ stmgr.ExecMonitor, root cid.Cid, _ abi.ChainEpoch, _ *types.TipSet) (cid.Cid, error) {
// buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync())
@@ -1453,7 +1611,7 @@ func upgradeActorsV8Common(
// return LiteMigration(ctx, bstore, newActorsManifestCid, root, av, types.StateTreeVersion4, newStateTreeVersion)
//}
-func LiteMigration(ctx context.Context, bstore blockstore.Blockstore, newActorsManifestCid cid.Cid, root cid.Cid, av actors.Version, oldStateTreeVersion types.StateTreeVersion, newStateTreeVersion types.StateTreeVersion) (cid.Cid, error) {
+func LiteMigration(ctx context.Context, bstore blockstore.Blockstore, newActorsManifestCid cid.Cid, root cid.Cid, oldAv actorstypes.Version, newAv actorstypes.Version, oldStateTreeVersion types.StateTreeVersion, newStateTreeVersion types.StateTreeVersion) (cid.Cid, error) {
buf := blockstore.NewTieredBstore(bstore, blockstore.NewMemorySync())
store := store.ActorStore(ctx, buf)
adtStore := gstStore.WrapStore(ctx, store)
@@ -1493,10 +1651,10 @@ func LiteMigration(ctx context.Context, bstore blockstore.Blockstore, newActorsM
return cid.Undef, xerrors.Errorf("error loading new manifest data: %w", err)
}
- if len(oldManifestData.Entries) != len(actors.GetBuiltinActorsKeys()) {
+ if len(oldManifestData.Entries) != len(actors.GetBuiltinActorsKeys(oldAv)) {
return cid.Undef, xerrors.Errorf("incomplete old manifest with %d code CIDs", len(oldManifestData.Entries))
}
- if len(newManifestData.Entries) != len(actors.GetBuiltinActorsKeys()) {
+ if len(newManifestData.Entries) != len(actors.GetBuiltinActorsKeys(newAv)) {
return cid.Undef, xerrors.Errorf("incomplete new manifest with %d code CIDs", len(newManifestData.Entries))
}
@@ -1528,7 +1686,7 @@ func LiteMigration(ctx context.Context, bstore blockstore.Blockstore, newActorsM
}
var head cid.Cid
if addr == system.Address {
- newSystemState, err := system.MakeState(store, av, newManifest.Data)
+ newSystemState, err := system.MakeState(store, newAv, newManifest.Data)
if err != nil {
return xerrors.Errorf("could not make system actor state: %w", err)
}
diff --git a/chain/consensus/filcns/weight.go b/chain/consensus/filcns/weight.go
index f5966aa19..ab90840c5 100644
--- a/chain/consensus/filcns/weight.go
+++ b/chain/consensus/filcns/weight.go
@@ -29,7 +29,7 @@ func Weight(ctx context.Context, stateBs bstore.Blockstore, ts *types.TipSet) (t
// >>> wFunction(totalPowerAtTipset(ts)) * 2^8 <<< + (wFunction(totalPowerAtTipset(ts)) * sum(ts.blocks[].ElectionProof.WinCount) * wRatio_num * 2^8) / (e * wRatio_den)
- tpow := big2.Zero()
+ var tpow big2.Int
{
cst := cbor.NewCborStore(stateBs)
state, err := state.LoadStateTree(cst, ts.ParentState())
diff --git a/chain/events/events_called.go b/chain/events/events_called.go
index 7fc92e6a9..3ac02b2f7 100644
--- a/chain/events/events_called.go
+++ b/chain/events/events_called.go
@@ -554,7 +554,7 @@ func (me *messageEvents) Called(ctx context.Context, check CheckFunc, msgHnd Msg
id, err := me.hcAPI.onHeadChanged(ctx, check, hnd, rev, confidence, timeout)
if err != nil {
- return err
+ return xerrors.Errorf("on head changed error: %w", err)
}
me.lk.Lock()
diff --git a/chain/gen/genesis/f00_system.go b/chain/gen/genesis/f00_system.go
index 1cd50f5e1..93849bcc9 100644
--- a/chain/gen/genesis/f00_system.go
+++ b/chain/gen/genesis/f00_system.go
@@ -7,8 +7,8 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
- systemtypes "github.com/filecoin-project/go-state-types/builtin/v8/system"
"github.com/filecoin-project/go-state-types/manifest"
bstore "github.com/filecoin-project/lotus/blockstore"
@@ -18,7 +18,7 @@ import (
"github.com/filecoin-project/lotus/chain/types"
)
-func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) {
+func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
// TODO pass in built-in actors cid for V8 and later
@@ -27,7 +27,7 @@ func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Versi
return nil, err
}
- if av >= actors.Version8 {
+ if av >= actorstypes.Version8 {
mfCid, ok := actors.GetManifest(av)
if !ok {
return nil, xerrors.Errorf("missing manifest for actors version %d", av)
@@ -38,8 +38,9 @@ func SetupSystemActor(ctx context.Context, bs bstore.Blockstore, av actors.Versi
return nil, xerrors.Errorf("loading manifest for actors version %d: %w", av, err)
}
- st8 := st.GetState().(*systemtypes.State)
- st8.BuiltinActors = mf.Data
+ if err := st.SetBuiltinActors(mf.Data); err != nil {
+ return nil, xerrors.Errorf("failed to set manifest data: %w", err)
+ }
}
statecid, err := cst.Put(ctx, st.GetState())
diff --git a/chain/gen/genesis/f01_init.go b/chain/gen/genesis/f01_init.go
index ddb448de9..26062cf27 100644
--- a/chain/gen/genesis/f01_init.go
+++ b/chain/gen/genesis/f01_init.go
@@ -11,6 +11,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/specs-actors/actors/util/adt"
@@ -21,7 +22,7 @@ import (
"github.com/filecoin-project/lotus/genesis"
)
-func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []genesis.Actor, rootVerifier genesis.Actor, remainder genesis.Actor, av actors.Version) (int64, *types.Actor, map[address.Address]address.Address, error) {
+func SetupInitActor(ctx context.Context, bs bstore.Blockstore, netname string, initialActors []genesis.Actor, rootVerifier genesis.Actor, remainder genesis.Actor, av actorstypes.Version) (int64, *types.Actor, map[address.Address]address.Address, error) {
if len(initialActors) > MaxAccounts {
return 0, nil, nil, xerrors.New("too many initial actors")
}
diff --git a/chain/gen/genesis/f02_reward.go b/chain/gen/genesis/f02_reward.go
index 0d0c1db0f..4a5ac9fa1 100644
--- a/chain/gen/genesis/f02_reward.go
+++ b/chain/gen/genesis/f02_reward.go
@@ -6,6 +6,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
bstore "github.com/filecoin-project/lotus/blockstore"
@@ -16,7 +17,7 @@ import (
"github.com/filecoin-project/lotus/chain/types"
)
-func SetupRewardActor(ctx context.Context, bs bstore.Blockstore, qaPower big.Int, av actors.Version) (*types.Actor, error) {
+func SetupRewardActor(ctx context.Context, bs bstore.Blockstore, qaPower big.Int, av actorstypes.Version) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
rst, err := reward.MakeState(adt.WrapStore(ctx, cst), av, qaPower)
if err != nil {
diff --git a/chain/gen/genesis/f03_cron.go b/chain/gen/genesis/f03_cron.go
index c9fe7c118..16396c437 100644
--- a/chain/gen/genesis/f03_cron.go
+++ b/chain/gen/genesis/f03_cron.go
@@ -6,6 +6,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
bstore "github.com/filecoin-project/lotus/blockstore"
@@ -15,7 +16,7 @@ import (
"github.com/filecoin-project/lotus/chain/types"
)
-func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) {
+func SetupCronActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
st, err := cron.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av)
if err != nil {
diff --git a/chain/gen/genesis/f04_power.go b/chain/gen/genesis/f04_power.go
index 20232c9b2..f05b0c746 100644
--- a/chain/gen/genesis/f04_power.go
+++ b/chain/gen/genesis/f04_power.go
@@ -6,6 +6,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/specs-actors/actors/util/adt"
@@ -15,7 +16,7 @@ import (
"github.com/filecoin-project/lotus/chain/types"
)
-func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) {
+func SetupStoragePowerActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
pst, err := power.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av)
diff --git a/chain/gen/genesis/f05_market.go b/chain/gen/genesis/f05_market.go
index 9109e2784..28a258c40 100644
--- a/chain/gen/genesis/f05_market.go
+++ b/chain/gen/genesis/f05_market.go
@@ -6,6 +6,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
bstore "github.com/filecoin-project/lotus/blockstore"
@@ -15,7 +16,7 @@ import (
"github.com/filecoin-project/lotus/chain/types"
)
-func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) {
+func SetupStorageMarketActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
mst, err := market.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av)
if err != nil {
diff --git a/chain/gen/genesis/f06_vreg.go b/chain/gen/genesis/f06_vreg.go
index 381a115d4..1b3582d4d 100644
--- a/chain/gen/genesis/f06_vreg.go
+++ b/chain/gen/genesis/f06_vreg.go
@@ -7,6 +7,7 @@ import (
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/specs-actors/actors/util/adt"
@@ -28,7 +29,7 @@ func init() {
RootVerifierID = idk
}
-func SetupVerifiedRegistryActor(ctx context.Context, bs bstore.Blockstore, av actors.Version) (*types.Actor, error) {
+func SetupVerifiedRegistryActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) {
cst := cbor.NewCborStore(bs)
vst, err := verifreg.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av, RootVerifierID)
if err != nil {
diff --git a/chain/gen/genesis/f07_dcap.go b/chain/gen/genesis/f07_dcap.go
new file mode 100644
index 000000000..235cb0ce3
--- /dev/null
+++ b/chain/gen/genesis/f07_dcap.go
@@ -0,0 +1,56 @@
+package genesis
+
+import (
+ "context"
+
+ cbor "github.com/ipfs/go-ipld-cbor"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/builtin"
+ "github.com/filecoin-project/specs-actors/actors/util/adt"
+
+ bstore "github.com/filecoin-project/lotus/blockstore"
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/datacap"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+var GovernorId address.Address
+
+func init() {
+ idk, err := address.NewFromString("t06")
+ if err != nil {
+ panic(err)
+ }
+
+ GovernorId = idk
+}
+
+func SetupDatacapActor(ctx context.Context, bs bstore.Blockstore, av actorstypes.Version) (*types.Actor, error) {
+ cst := cbor.NewCborStore(bs)
+ dst, err := datacap.MakeState(adt.WrapStore(ctx, cbor.NewCborStore(bs)), av, GovernorId, builtin.DefaultTokenActorBitwidth)
+ if err != nil {
+ return nil, err
+ }
+
+ statecid, err := cst.Put(ctx, dst.GetState())
+ if err != nil {
+ return nil, err
+ }
+
+ actcid, ok := actors.GetActorCodeID(av, actors.DatacapKey)
+ if !ok {
+ return nil, xerrors.Errorf("failed to get datacap actor code ID for actors version %d", av)
+ }
+
+ act := &types.Actor{
+ Code: actcid,
+ Head: statecid,
+ Balance: big.Zero(),
+ }
+
+ return act, nil
+}
diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go
index 4eaed56aa..964dc2f1c 100644
--- a/chain/gen/genesis/genesis.go
+++ b/chain/gen/genesis/genesis.go
@@ -14,6 +14,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/network"
@@ -28,6 +29,7 @@ import (
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors/builtin/account"
"github.com/filecoin-project/lotus/chain/actors/builtin/cron"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/datacap"
init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
"github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
@@ -137,7 +139,7 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge
return nil, nil, xerrors.Errorf("making new state tree: %w", err)
}
- av, err := actors.VersionForNetwork(template.NetworkVersion)
+ av, err := actorstypes.VersionForNetwork(template.NetworkVersion)
if err != nil {
return nil, nil, xerrors.Errorf("getting network version: %w", err)
}
@@ -214,6 +216,17 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge
return nil, nil, xerrors.Errorf("set verified registry actor: %w", err)
}
+ // Create datacap actor
+ if av >= 9 {
+ dcapact, err := SetupDatacapActor(ctx, bs, av)
+ if err != nil {
+ return nil, nil, xerrors.Errorf("setup datacap actor: %w", err)
+ }
+ if err := state.SetActor(datacap.Address, dcapact); err != nil {
+ return nil, nil, xerrors.Errorf("set datacap actor: %w", err)
+ }
+ }
+
bact, err := MakeAccountActor(ctx, cst, av, builtin.BurntFundsActorAddr, big.Zero())
if err != nil {
return nil, nil, xerrors.Errorf("setup burnt funds actor state: %w", err)
@@ -356,7 +369,7 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge
return state, keyIDs, nil
}
-func MakeAccountActor(ctx context.Context, cst cbor.IpldStore, av actors.Version, addr address.Address, bal types.BigInt) (*types.Actor, error) {
+func MakeAccountActor(ctx context.Context, cst cbor.IpldStore, av actorstypes.Version, addr address.Address, bal types.BigInt) (*types.Actor, error) {
ast, err := account.MakeState(adt.WrapStore(ctx, cst), av, addr)
if err != nil {
return nil, err
@@ -376,12 +389,13 @@ func MakeAccountActor(ctx context.Context, cst cbor.IpldStore, av actors.Version
Code: actcid,
Head: statecid,
Balance: bal,
+ Address: &addr,
}
return act, nil
}
-func CreateAccountActor(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, info genesis.Actor, keyIDs map[address.Address]address.Address, av actors.Version) error {
+func CreateAccountActor(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, info genesis.Actor, keyIDs map[address.Address]address.Address, av actorstypes.Version) error {
var ainfo genesis.AccountMeta
if err := json.Unmarshal(info.Meta, &ainfo); err != nil {
return xerrors.Errorf("unmarshaling account meta: %w", err)
@@ -404,7 +418,7 @@ func CreateAccountActor(ctx context.Context, cst cbor.IpldStore, state *state.St
return nil
}
-func CreateMultisigAccount(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, ida address.Address, info genesis.Actor, keyIDs map[address.Address]address.Address, av actors.Version) error {
+func CreateMultisigAccount(ctx context.Context, cst cbor.IpldStore, state *state.StateTree, ida address.Address, info genesis.Actor, keyIDs map[address.Address]address.Address, av actorstypes.Version) error {
if info.Type != genesis.TMultisig {
return fmt.Errorf("can only call CreateMultisigAccount with multisig Actor info")
}
diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go
index a4f43e7fa..ed237c1a5 100644
--- a/chain/gen/genesis/miners.go
+++ b/chain/gen/genesis/miners.go
@@ -14,27 +14,25 @@ import (
"github.com/filecoin-project/go-address"
cborutil "github.com/filecoin-project/go-cbor-util"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
builtintypes "github.com/filecoin-project/go-state-types/builtin"
- markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ smoothing9 "github.com/filecoin-project/go-state-types/builtin/v9/util/smoothing"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/network"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
- market0 "github.com/filecoin-project/specs-actors/actors/builtin/market"
miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner"
power0 "github.com/filecoin-project/specs-actors/actors/builtin/power"
reward0 "github.com/filecoin-project/specs-actors/actors/builtin/reward"
- smoothing0 "github.com/filecoin-project/specs-actors/actors/util/smoothing"
- market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market"
reward2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/reward"
- market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market"
power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power"
reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
runtime7 "github.com/filecoin-project/specs-actors/v7/actors/runtime"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
@@ -81,7 +79,7 @@ func mkFakedSigSyscalls(base vm.SyscallBuilder) vm.SyscallBuilder {
func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.SyscallBuilder, sroot cid.Cid, miners []genesis.Miner, nv network.Version) (cid.Cid, error) {
cst := cbor.NewCborStore(cs.StateBlockstore())
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return cid.Undef, xerrors.Errorf("failed to get network version: %w", err)
}
@@ -120,10 +118,12 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
presealExp abi.ChainEpoch
- dealIDs []abi.DealID
+ dealIDs []abi.DealID
+ sectorWeight []abi.StoragePower
}, len(miners))
maxPeriods := policy.GetMaxSectorExpirationExtension() / minertypes.WPoStProvingPeriod
+ rawPow, qaPow := big.NewInt(0), big.NewInt(0)
for i, m := range miners {
// Create miner through power actor
i := i
@@ -197,7 +197,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
}
}
- // Publish preseal deals
+ // Publish preseal deals, and calculate the QAPower
{
publish := func(params *markettypes.PublishStorageDealsParams) error {
@@ -234,7 +234,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
ClientSignature: crypto.Signature{Type: crypto.SigTypeBLS},
}
- if av >= actors.Version8 {
+ if av >= actorstypes.Version8 {
buf, err := cborutil.Dump(&preseal.Deal)
if err != nil {
return cid.Undef, fmt.Errorf("failed to marshal proposal: %w", err)
@@ -257,6 +257,11 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
params = &markettypes.PublishStorageDealsParams{}
}
+
+ rawPow = big.Add(rawPow, big.NewInt(int64(m.SectorSize)))
+ sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, big.Zero(), markettypes.DealWeight(&preseal.Deal))
+ minerInfos[i].sectorWeight = append(minerInfos[i].sectorWeight, sectorWeight)
+ qaPow = big.Add(qaPow, sectorWeight)
}
if len(params.Deals) > 0 {
@@ -267,24 +272,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
}
}
- // adjust total network power for equal pledge per sector
- rawPow, qaPow := big.NewInt(0), big.NewInt(0)
{
- for i, m := range miners {
- for pi := range m.Sectors {
- rawPow = types.BigAdd(rawPow, types.NewInt(uint64(m.SectorSize)))
-
- dweight, vdweight, err := dealWeight(ctx, genesisVm, minerInfos[i].maddr, []abi.DealID{minerInfos[i].dealIDs[pi]}, 0, minerInfos[i].presealExp, av)
- if err != nil {
- return cid.Undef, xerrors.Errorf("getting deal weight: %w", err)
- }
-
- sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, dweight, vdweight)
-
- qaPow = types.BigAdd(qaPow, sectorWeight)
- }
- }
-
nh, err := genesisVm.Flush(ctx)
if err != nil {
return cid.Undef, xerrors.Errorf("flushing vm: %w", err)
@@ -369,12 +357,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
Expiration: minerInfos[i].presealExp, // TODO: Allow setting externally!
}
- dweight, vdweight, err := dealWeight(ctx, genesisVm, minerInfos[i].maddr, params.DealIDs, 0, minerInfos[i].presealExp, av)
- if err != nil {
- return cid.Undef, xerrors.Errorf("getting deal weight: %w", err)
- }
-
- sectorWeight := builtin.QAPowerForWeight(m.SectorSize, minerInfos[i].presealExp, dweight, vdweight)
+ sectorWeight := minerInfos[i].sectorWeight[pi]
// we've added fake power for this sector above, remove it now
@@ -442,20 +425,18 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
return cid.Undef, xerrors.Errorf("getting current total power: %w", err)
}
- pcd := miner0.PreCommitDepositForPower((*smoothing0.FilterEstimate)(&rewardSmoothed), tpow.QualityAdjPowerSmoothed, sectorWeight)
+ pcd := miner9.PreCommitDepositForPower(smoothing9.FilterEstimate(rewardSmoothed), smoothing9.FilterEstimate(*tpow.QualityAdjPowerSmoothed), miner9.QAPowerMax(m.SectorSize))
- pledge := miner0.InitialPledgeForPower(
+ pledge := miner9.InitialPledgeForPower(
sectorWeight,
baselinePower,
- tpow.PledgeCollateral,
- (*smoothing0.FilterEstimate)(&rewardSmoothed),
- tpow.QualityAdjPowerSmoothed,
+ smoothing9.FilterEstimate(rewardSmoothed),
+ smoothing9.FilterEstimate(*tpow.QualityAdjPowerSmoothed),
big.Zero(),
)
pledge = big.Add(pcd, pledge)
- fmt.Println(types.FIL(pledge))
_, err = doExecValue(ctx, genesisVm, minerInfos[i].maddr, m.Worker, pledge, builtintypes.MethodsMiner.PreCommitSector, mustEnc(params))
if err != nil {
return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", err)
@@ -464,7 +445,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
// Commit one-by-one, otherwise pledge math tends to explode
var paramBytes []byte
- if av >= actors.Version6 {
+ if av >= actorstypes.Version6 {
// TODO: fixup
confirmParams := &builtin6.ConfirmSectorProofsParams{
Sectors: []abi.SectorNumber{preseal.SectorID},
@@ -484,7 +465,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal
return cid.Undef, xerrors.Errorf("failed to confirm presealed sectors: %w", err)
}
- if av >= actors.Version2 {
+ if av >= actorstypes.Version2 {
// post v0, we need to explicitly Claim this power since ConfirmSectorProofsValid doesn't do it anymore
claimParams := &power4.UpdateClaimedPowerParams{
RawByteDelta: types.NewInt(uint64(m.SectorSize)),
@@ -617,67 +598,7 @@ func currentTotalPower(ctx context.Context, vm vm.Interface, maddr address.Addre
return &pwr, nil
}
-func dealWeight(ctx context.Context, vm vm.Interface, maddr address.Address, dealIDs []abi.DealID, sectorStart, sectorExpiry abi.ChainEpoch, av actors.Version) (abi.DealWeight, abi.DealWeight, error) {
- // TODO: This hack should move to market actor wrapper
- if av <= actors.Version2 {
- params := &market0.VerifyDealsForActivationParams{
- DealIDs: dealIDs,
- SectorStart: sectorStart,
- SectorExpiry: sectorExpiry,
- }
-
- ret, err := doExecValue(ctx, vm,
- market.Address,
- maddr,
- abi.NewTokenAmount(0),
- builtin0.MethodsMarket.VerifyDealsForActivation,
- mustEnc(params),
- )
- if err != nil {
- return big.Zero(), big.Zero(), err
- }
- var weight, verifiedWeight abi.DealWeight
- if av < actors.Version2 {
- var dealWeights market0.VerifyDealsForActivationReturn
- err = dealWeights.UnmarshalCBOR(bytes.NewReader(ret))
- weight = dealWeights.DealWeight
- verifiedWeight = dealWeights.VerifiedDealWeight
- } else {
- var dealWeights market2.VerifyDealsForActivationReturn
- err = dealWeights.UnmarshalCBOR(bytes.NewReader(ret))
- weight = dealWeights.DealWeight
- verifiedWeight = dealWeights.VerifiedDealWeight
- }
- if err != nil {
- return big.Zero(), big.Zero(), err
- }
-
- return weight, verifiedWeight, nil
- }
- params := &market4.VerifyDealsForActivationParams{Sectors: []market4.SectorDeals{{
- SectorExpiry: sectorExpiry,
- DealIDs: dealIDs,
- }}}
-
- var dealWeights market4.VerifyDealsForActivationReturn
- ret, err := doExecValue(ctx, vm,
- market.Address,
- maddr,
- abi.NewTokenAmount(0),
- market.Methods.VerifyDealsForActivation,
- mustEnc(params),
- )
- if err != nil {
- return big.Zero(), big.Zero(), err
- }
- if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret)); err != nil {
- return big.Zero(), big.Zero(), err
- }
-
- return dealWeights.Sectors[0].DealWeight, dealWeights.Sectors[0].VerifiedDealWeight, nil
-}
-
-func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address.Address, av actors.Version) (abi.StoragePower, builtin.FilterEstimate, error) {
+func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address.Address, av actorstypes.Version) (abi.StoragePower, builtin.FilterEstimate, error) {
rwret, err := doExecValue(ctx, vm, reward.Address, maddr, big.Zero(), reward.Methods.ThisEpochReward, nil)
if err != nil {
return big.Zero(), builtin.FilterEstimate{}, err
@@ -685,7 +606,7 @@ func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address
// TODO: This hack should move to reward actor wrapper
switch av {
- case actors.Version0:
+ case actorstypes.Version0:
var epochReward reward0.ThisEpochRewardReturn
if err := epochReward.UnmarshalCBOR(bytes.NewReader(rwret)); err != nil {
@@ -693,7 +614,7 @@ func currentEpochBlockReward(ctx context.Context, vm vm.Interface, maddr address
}
return epochReward.ThisEpochBaselinePower, builtin.FilterEstimate(*epochReward.ThisEpochRewardSmoothed), nil
- case actors.Version2:
+ case actorstypes.Version2:
var epochReward reward2.ThisEpochRewardReturn
if err := epochReward.UnmarshalCBOR(bytes.NewReader(rwret)); err != nil {
diff --git a/chain/market/fundmanager.go b/chain/market/fundmanager.go
index 7b6b86719..fab71dfef 100644
--- a/chain/market/fundmanager.go
+++ b/chain/market/fundmanager.go
@@ -14,7 +14,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
diff --git a/chain/market/fundmanager_test.go b/chain/market/fundmanager_test.go
index 89063ec58..d79afbc51 100644
--- a/chain/market/fundmanager_test.go
+++ b/chain/market/fundmanager_test.go
@@ -15,7 +15,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
tutils "github.com/filecoin-project/specs-actors/v2/support/testing"
"github.com/filecoin-project/lotus/api"
@@ -105,7 +105,7 @@ func TestFundManagerBasic(t *testing.T) {
// Note: Expect failure because there is no available balance to withdraw:
// balance - reserved = 16 - 16 = 0
amt = abi.NewTokenAmount(1)
- sentinel, err = s.fm.Withdraw(s.ctx, s.walletAddr, s.acctAddr, amt)
+ _, err = s.fm.Withdraw(s.ctx, s.walletAddr, s.acctAddr, amt)
require.Error(t, err)
}
diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go
index def161171..0724f145f 100644
--- a/chain/messagepool/messagepool.go
+++ b/chain/messagepool/messagepool.go
@@ -82,6 +82,7 @@ var (
ErrRBFTooLowPremium = errors.New("replace by fee has too low GasPremium")
ErrTooManyPendingMessages = errors.New("too many pending messages for actor")
ErrNonceGap = errors.New("unfulfilled nonce gap")
+ ErrExistingNonce = errors.New("message with nonce already exists")
)
const (
@@ -112,7 +113,7 @@ type MessagePoolEvtMessage struct {
func init() {
// if the republish interval is too short compared to the pubsub timecache, adjust it
- minInterval := pubsub.TimeCacheDuration + time.Duration(build.PropagationDelaySecs)
+ minInterval := pubsub.TimeCacheDuration + time.Duration(build.PropagationDelaySecs)*time.Second
if RepublishInterval < minInterval {
RepublishInterval = minInterval
}
@@ -218,6 +219,7 @@ func CapGasFee(mff dtypes.DefaultMaxFeeFunc, msg *types.Message, sendSpec *api.M
totalFee := types.BigMul(msg.GasFeeCap, gl)
if totalFee.LessThanEqual(maxFee) {
+ msg.GasPremium = big.Min(msg.GasFeeCap, msg.GasPremium) // cap premium at FeeCap
return
}
@@ -276,7 +278,7 @@ func (ms *msgSet) add(m *types.SignedMessage, mp *MessagePool, strict, untrusted
}
} else {
return false, xerrors.Errorf("message from %s with nonce %d already in mpool: %w",
- m.Message.From, m.Message.Nonce, ErrSoftValidationFailure)
+ m.Message.From, m.Message.Nonce, ErrExistingNonce)
}
ms.requiredFunds.Sub(ms.requiredFunds, exms.Message.RequiredFunds().Int)
@@ -624,11 +626,11 @@ func (mp *MessagePool) addLocal(ctx context.Context, m *types.SignedMessage) err
// sufficiently.
// For non local messages, if the message cannot be included in the next 20 blocks it returns
// a (soft) validation error.
-func (mp *MessagePool) verifyMsgBeforeAdd(m *types.SignedMessage, curTs *types.TipSet, local bool) (bool, error) {
+func (mp *MessagePool) verifyMsgBeforeAdd(ctx context.Context, m *types.SignedMessage, curTs *types.TipSet, local bool) (bool, error) {
epoch := curTs.Height() + 1
minGas := vm.PricelistByEpoch(epoch).OnChainMessage(m.ChainLength())
- if err := m.VMMessage().ValidForBlockInclusion(minGas.Total(), build.NewestNetworkVersion); err != nil {
+ if err := m.VMMessage().ValidForBlockInclusion(minGas.Total(), mp.api.StateNetworkVersion(ctx, epoch)); err != nil {
return false, xerrors.Errorf("message will not be included in a block: %w", err)
}
@@ -667,11 +669,13 @@ func (mp *MessagePool) verifyMsgBeforeAdd(m *types.SignedMessage, curTs *types.T
return publish, nil
}
-func (mp *MessagePool) Push(ctx context.Context, m *types.SignedMessage) (cid.Cid, error) {
+// Push checks the signed message for any violations, adds the message to the message pool and
+// publishes the message if the publish flag is set
+func (mp *MessagePool) Push(ctx context.Context, m *types.SignedMessage, publish bool) (cid.Cid, error) {
done := metrics.Timer(ctx, metrics.MpoolPushDuration)
defer done()
- err := mp.checkMessage(m)
+ err := mp.checkMessage(ctx, m)
if err != nil {
return cid.Undef, err
}
@@ -683,14 +687,14 @@ func (mp *MessagePool) Push(ctx context.Context, m *types.SignedMessage) (cid.Ci
}()
mp.curTsLk.Lock()
- publish, err := mp.addTs(ctx, m, mp.curTs, true, false)
+ ok, err := mp.addTs(ctx, m, mp.curTs, true, false)
if err != nil {
mp.curTsLk.Unlock()
return cid.Undef, err
}
mp.curTsLk.Unlock()
- if publish {
+ if ok && publish {
msgb, err := m.Serialize()
if err != nil {
return cid.Undef, xerrors.Errorf("error serializing message: %w", err)
@@ -705,14 +709,14 @@ func (mp *MessagePool) Push(ctx context.Context, m *types.SignedMessage) (cid.Ci
return m.Cid(), nil
}
-func (mp *MessagePool) checkMessage(m *types.SignedMessage) error {
+func (mp *MessagePool) checkMessage(ctx context.Context, m *types.SignedMessage) error {
// big messages are bad, anti DOS
if m.Size() > MaxMessageSize {
return xerrors.Errorf("mpool message too large (%dB): %w", m.Size(), ErrMessageTooBig)
}
// Perform syntactic validation, minGas=0 as we check the actual mingas before we add it
- if err := m.Message.ValidForBlockInclusion(0, build.NewestNetworkVersion); err != nil {
+ if err := m.Message.ValidForBlockInclusion(0, mp.api.StateNetworkVersion(ctx, mp.curTs.Height())); err != nil {
return xerrors.Errorf("message not valid for block inclusion: %w", err)
}
@@ -740,7 +744,7 @@ func (mp *MessagePool) Add(ctx context.Context, m *types.SignedMessage) error {
done := metrics.Timer(ctx, metrics.MpoolAddDuration)
defer done()
- err := mp.checkMessage(m)
+ err := mp.checkMessage(ctx, m)
if err != nil {
return err
}
@@ -845,7 +849,7 @@ func (mp *MessagePool) addTs(ctx context.Context, m *types.SignedMessage, curTs
mp.lk.Lock()
defer mp.lk.Unlock()
- publish, err := mp.verifyMsgBeforeAdd(m, curTs, local)
+ publish, err := mp.verifyMsgBeforeAdd(ctx, m, curTs, local)
if err != nil {
return false, err
}
@@ -870,7 +874,7 @@ func (mp *MessagePool) addTs(ctx context.Context, m *types.SignedMessage, curTs
}
func (mp *MessagePool) addLoaded(ctx context.Context, m *types.SignedMessage) error {
- err := mp.checkMessage(m)
+ err := mp.checkMessage(ctx, m)
if err != nil {
return err
}
@@ -890,7 +894,7 @@ func (mp *MessagePool) addLoaded(ctx context.Context, m *types.SignedMessage) er
return xerrors.Errorf("minimum expected nonce is %d: %w", snonce, ErrNonceTooLow)
}
- _, err = mp.verifyMsgBeforeAdd(m, curTs, true)
+ _, err = mp.verifyMsgBeforeAdd(ctx, m, curTs, true)
if err != nil {
return err
}
@@ -1060,7 +1064,7 @@ func (mp *MessagePool) getStateBalance(ctx context.Context, addr address.Address
// - extra strict add checks are used when adding the messages to the msgSet
// that means: no nonce gaps, at most 10 pending messages for the actor
func (mp *MessagePool) PushUntrusted(ctx context.Context, m *types.SignedMessage) (cid.Cid, error) {
- err := mp.checkMessage(m)
+ err := mp.checkMessage(ctx, m)
if err != nil {
return cid.Undef, err
}
@@ -1583,3 +1587,8 @@ func getBaseFeeLowerBound(baseFee, factor types.BigInt) types.BigInt {
return baseFeeLowerBound
}
+
+type MpoolNonceAPI interface {
+ GetNonce(context.Context, address.Address, types.TipSetKey) (uint64, error)
+ GetActor(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)
+}
diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go
index 7751f7978..9495400c6 100644
--- a/chain/messagepool/messagepool_test.go
+++ b/chain/messagepool/messagepool_test.go
@@ -15,9 +15,11 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/crypto"
+ "github.com/filecoin-project/go-state-types/network"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
"github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/consensus/filcns"
"github.com/filecoin-project/lotus/chain/messagepool/gasguess"
"github.com/filecoin-project/lotus/chain/types"
@@ -166,6 +168,10 @@ func (tma *testMpoolAPI) StateAccountKeyAtFinality(ctx context.Context, addr add
return addr, nil
}
+func (tma *testMpoolAPI) StateNetworkVersion(ctx context.Context, h abi.ChainEpoch) network.Version {
+ return build.TestNetworkVersion
+}
+
func (tma *testMpoolAPI) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) {
return nil, tma.bmsgs[h.Cid()], nil
}
@@ -539,7 +545,7 @@ func TestLoadLocal(t *testing.T) {
for i := 0; i < 10; i++ {
m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1))
//stm: @CHAIN_MEMPOOL_PUSH_001
- cid, err := mp.Push(context.TODO(), m)
+ cid, err := mp.Push(context.TODO(), m, true)
if err != nil {
t.Fatal(err)
}
@@ -612,7 +618,7 @@ func TestClearAll(t *testing.T) {
for i := 0; i < 10; i++ {
m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1))
//stm: @CHAIN_MEMPOOL_PUSH_001
- _, err := mp.Push(context.TODO(), m)
+ _, err := mp.Push(context.TODO(), m, true)
if err != nil {
t.Fatal(err)
}
@@ -670,7 +676,7 @@ func TestClearNonLocal(t *testing.T) {
for i := 0; i < 10; i++ {
m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1))
//stm: @CHAIN_MEMPOOL_PUSH_001
- _, err := mp.Push(context.TODO(), m)
+ _, err := mp.Push(context.TODO(), m, true)
if err != nil {
t.Fatal(err)
}
@@ -743,7 +749,7 @@ func TestUpdates(t *testing.T) {
for i := 0; i < 10; i++ {
m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1))
//stm: @CHAIN_MEMPOOL_PUSH_001
- _, err := mp.Push(context.TODO(), m)
+ _, err := mp.Push(context.TODO(), m, true)
if err != nil {
t.Fatal(err)
}
@@ -1075,3 +1081,40 @@ func TestRemoveMessage(t *testing.T) {
assert.Len(t, msgs, 0)
}
}
+
+func TestCapGasFee(t *testing.T) {
+ t.Run("use default maxfee", func(t *testing.T) {
+ msg := &types.Message{
+ GasLimit: 100_000_000,
+ GasFeeCap: abi.NewTokenAmount(100_000_000),
+ GasPremium: abi.NewTokenAmount(100_000),
+ }
+ CapGasFee(func() (abi.TokenAmount, error) {
+ return abi.NewTokenAmount(100_000_000_000), nil
+ }, msg, nil)
+ assert.Equal(t, msg.GasFeeCap.Int64(), int64(1000))
+ assert.Equal(t, msg.GasPremium.Int.Int64(), int64(1000))
+ })
+
+ t.Run("use spec maxfee", func(t *testing.T) {
+ msg := &types.Message{
+ GasLimit: 100_000_000,
+ GasFeeCap: abi.NewTokenAmount(100_000_000),
+ GasPremium: abi.NewTokenAmount(100_000),
+ }
+ CapGasFee(nil, msg, &api.MessageSendSpec{MaxFee: abi.NewTokenAmount(100_000_000_000)})
+ assert.Equal(t, msg.GasFeeCap.Int64(), int64(1000))
+ assert.Equal(t, msg.GasPremium.Int.Int64(), int64(1000))
+ })
+
+ t.Run("use smaller feecap value when fee is enough", func(t *testing.T) {
+ msg := &types.Message{
+ GasLimit: 100_000_000,
+ GasFeeCap: abi.NewTokenAmount(100_000),
+ GasPremium: abi.NewTokenAmount(100_000_000),
+ }
+ CapGasFee(nil, msg, &api.MessageSendSpec{MaxFee: abi.NewTokenAmount(100_000_000_000_000)})
+ assert.Equal(t, msg.GasFeeCap.Int64(), int64(100_000))
+ assert.Equal(t, msg.GasPremium.Int.Int64(), int64(100_000))
+ })
+}
diff --git a/chain/messagepool/provider.go b/chain/messagepool/provider.go
index 5618ec603..f8bbbc01e 100644
--- a/chain/messagepool/provider.go
+++ b/chain/messagepool/provider.go
@@ -9,8 +9,9 @@ import (
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/network"
- "github.com/filecoin-project/lotus/chain/messagesigner"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
@@ -28,6 +29,7 @@ type Provider interface {
PubSubPublish(string, []byte) error
GetActorAfter(address.Address, *types.TipSet) (*types.Actor, error)
StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error)
+ StateNetworkVersion(context.Context, abi.ChainEpoch) network.Version
MessagesForBlock(context.Context, *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error)
MessagesForTipset(context.Context, *types.TipSet) ([]types.ChainMsg, error)
LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error)
@@ -39,7 +41,7 @@ type mpoolProvider struct {
sm *stmgr.StateManager
ps *pubsub.PubSub
- lite messagesigner.MpoolNonceAPI
+ lite MpoolNonceAPI
}
var _ Provider = (*mpoolProvider)(nil)
@@ -48,7 +50,7 @@ func NewProvider(sm *stmgr.StateManager, ps *pubsub.PubSub) Provider {
return &mpoolProvider{sm: sm, ps: ps}
}
-func NewProviderLite(sm *stmgr.StateManager, ps *pubsub.PubSub, noncer messagesigner.MpoolNonceAPI) Provider {
+func NewProviderLite(sm *stmgr.StateManager, ps *pubsub.PubSub, noncer MpoolNonceAPI) Provider {
return &mpoolProvider{sm: sm, ps: ps, lite: noncer}
}
@@ -104,6 +106,10 @@ func (mpp *mpoolProvider) StateAccountKeyAtFinality(ctx context.Context, addr ad
return mpp.sm.ResolveToKeyAddressAtFinality(ctx, addr, ts)
}
+func (mpp *mpoolProvider) StateNetworkVersion(ctx context.Context, height abi.ChainEpoch) network.Version {
+ return mpp.sm.GetNetworkVersion(ctx, height)
+}
+
func (mpp *mpoolProvider) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) {
return mpp.sm.ChainStore().MessagesForBlock(ctx, h)
}
diff --git a/chain/messagepool/repub.go b/chain/messagepool/repub.go
index c4f1b26e3..9a1e19b60 100644
--- a/chain/messagepool/repub.go
+++ b/chain/messagepool/repub.go
@@ -79,7 +79,7 @@ func (mp *MessagePool) republishPendingMessages(ctx context.Context) error {
return chains[i].Before(chains[j])
})
- gasLimit := int64(build.BlockGasLimit)
+ gasLimit := build.BlockGasLimit
minGas := int64(gasguess.MinGas)
var msgs []*types.SignedMessage
loop:
diff --git a/chain/messagepool/repub_test.go b/chain/messagepool/repub_test.go
index f6130282c..9cdabc02f 100644
--- a/chain/messagepool/repub_test.go
+++ b/chain/messagepool/repub_test.go
@@ -60,7 +60,7 @@ func TestRepubMessages(t *testing.T) {
for i := 0; i < 10; i++ {
m := makeTestMessage(w1, a1, a2, uint64(i), gasLimit, uint64(i+1))
//stm: @CHAIN_MEMPOOL_PUSH_001
- _, err := mp.Push(context.TODO(), m)
+ _, err := mp.Push(context.TODO(), m, true)
if err != nil {
t.Fatal(err)
}
diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go
index 0d93f2af9..e84962869 100644
--- a/chain/messagepool/selection.go
+++ b/chain/messagepool/selection.go
@@ -258,7 +258,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ
nextChain := 0
partitions := make([][]*msgChain, MaxBlocks)
for i := 0; i < MaxBlocks && nextChain < len(chains); i++ {
- gasLimit := int64(build.BlockGasLimit)
+ gasLimit := build.BlockGasLimit
msgLimit := build.BlockMessageLimit
for nextChain < len(chains) {
chain := chains[nextChain]
@@ -590,7 +590,7 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a
mpCfg := mp.getConfig()
result := &selectedMessages{
msgs: make([]*types.SignedMessage, 0, mpCfg.SizeLimitLow),
- gasLimit: int64(build.BlockGasLimit),
+ gasLimit: build.BlockGasLimit,
blsLimit: cbg.MaxLength,
secpLimit: cbg.MaxLength,
}
diff --git a/chain/messagesigner/messagesigner.go b/chain/messagesigner/messagesigner.go
index 249639d2a..96457e9f8 100644
--- a/chain/messagesigner/messagesigner.go
+++ b/chain/messagesigner/messagesigner.go
@@ -15,6 +15,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/messagepool"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/modules/dtypes"
)
@@ -24,9 +25,12 @@ const dsKeyMsgUUIDSet = "MsgUuidSet"
var log = logging.Logger("messagesigner")
-type MpoolNonceAPI interface {
- GetNonce(context.Context, address.Address, types.TipSetKey) (uint64, error)
- GetActor(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)
+type MsgSigner interface {
+ SignMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, cb func(*types.SignedMessage) error) (*types.SignedMessage, error)
+ GetSignedMessage(ctx context.Context, uuid uuid.UUID) (*types.SignedMessage, error)
+ StoreSignedMessage(ctx context.Context, uuid uuid.UUID, message *types.SignedMessage) error
+ NextNonce(ctx context.Context, addr address.Address) (uint64, error)
+ SaveNonce(ctx context.Context, addr address.Address, nonce uint64) error
}
// MessageSigner keeps track of nonces per address, and increments the nonce
@@ -34,11 +38,11 @@ type MpoolNonceAPI interface {
type MessageSigner struct {
wallet api.Wallet
lk sync.Mutex
- mpool MpoolNonceAPI
+ mpool messagepool.MpoolNonceAPI
ds datastore.Batching
}
-func NewMessageSigner(wallet api.Wallet, mpool MpoolNonceAPI, ds dtypes.MetadataDS) *MessageSigner {
+func NewMessageSigner(wallet api.Wallet, mpool messagepool.MpoolNonceAPI, ds dtypes.MetadataDS) *MessageSigner {
ds = namespace.Wrap(ds, datastore.NewKey("/message-signer/"))
return &MessageSigner{
wallet: wallet,
@@ -49,12 +53,12 @@ func NewMessageSigner(wallet api.Wallet, mpool MpoolNonceAPI, ds dtypes.Metadata
// SignMessage increments the nonce for the message From address, and signs
// the message
-func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb func(*types.SignedMessage) error) (*types.SignedMessage, error) {
+func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, cb func(*types.SignedMessage) error) (*types.SignedMessage, error) {
ms.lk.Lock()
defer ms.lk.Unlock()
// Get the next message nonce
- nonce, err := ms.nextNonce(ctx, msg.From)
+ nonce, err := ms.NextNonce(ctx, msg.From)
if err != nil {
return nil, xerrors.Errorf("failed to create nonce: %w", err)
}
@@ -72,7 +76,7 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb
Extra: mb.RawData(),
})
if err != nil {
- return nil, xerrors.Errorf("failed to sign message: %w", err)
+ return nil, xerrors.Errorf("failed to sign message: %w, addr=%s", err, msg.From)
}
// Callback with the signed message
@@ -80,13 +84,14 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb
Message: *msg,
Signature: *sig,
}
+
err = cb(smsg)
if err != nil {
return nil, err
}
// If the callback executed successfully, write the nonce to the datastore
- if err := ms.saveNonce(ctx, msg.From, nonce); err != nil {
+ if err := ms.SaveNonce(ctx, msg.From, nonce); err != nil {
return nil, xerrors.Errorf("failed to save nonce: %w", err)
}
@@ -113,9 +118,9 @@ func (ms *MessageSigner) StoreSignedMessage(ctx context.Context, uuid uuid.UUID,
return ms.ds.Put(ctx, key, serializedMsg)
}
-// nextNonce gets the next nonce for the given address.
+// NextNonce gets the next nonce for the given address.
// If there is no nonce in the datastore, gets the nonce from the message pool.
-func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (uint64, error) {
+func (ms *MessageSigner) NextNonce(ctx context.Context, addr address.Address) (uint64, error) {
// Nonces used to be created by the mempool and we need to support nodes
// that have mempool nonces, so first check the mempool for a nonce for
// this address. Note that the mempool returns the actor state's nonce
@@ -159,9 +164,9 @@ func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (u
}
}
-// saveNonce increments the nonce for this address and writes it to the
+// SaveNonce increments the nonce for this address and writes it to the
// datastore
-func (ms *MessageSigner) saveNonce(ctx context.Context, addr address.Address, nonce uint64) error {
+func (ms *MessageSigner) SaveNonce(ctx context.Context, addr address.Address, nonce uint64) error {
// Increment the nonce
nonce++
diff --git a/chain/messagesigner/messagesigner_consensus.go b/chain/messagesigner/messagesigner_consensus.go
new file mode 100644
index 000000000..905bb7199
--- /dev/null
+++ b/chain/messagesigner/messagesigner_consensus.go
@@ -0,0 +1,98 @@
+package messagesigner
+
+import (
+ "context"
+
+ "github.com/google/uuid"
+ "github.com/ipfs/go-datastore"
+ "github.com/ipfs/go-datastore/namespace"
+ "github.com/libp2p/go-libp2p/core/peer"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/messagepool"
+ "github.com/filecoin-project/lotus/chain/types"
+ consensus "github.com/filecoin-project/lotus/lib/consensus/raft"
+ "github.com/filecoin-project/lotus/node/modules/dtypes"
+)
+
+type MessageSignerConsensus struct {
+ MsgSigner
+ Consensus *consensus.Consensus
+}
+
+func NewMessageSignerConsensus(
+ wallet api.Wallet,
+ mpool messagepool.MpoolNonceAPI,
+ ds dtypes.MetadataDS,
+ consensus *consensus.Consensus) *MessageSignerConsensus {
+
+ ds = namespace.Wrap(ds, datastore.NewKey("/message-signer-consensus/"))
+ return &MessageSignerConsensus{
+ MsgSigner: &MessageSigner{
+ wallet: wallet,
+ mpool: mpool,
+ ds: ds,
+ },
+ Consensus: consensus,
+ }
+}
+
+func (ms *MessageSignerConsensus) IsLeader(ctx context.Context) bool {
+ return ms.Consensus.IsLeader(ctx)
+}
+
+func (ms *MessageSignerConsensus) RedirectToLeader(ctx context.Context, method string, arg interface{}, ret interface{}) (bool, error) {
+ ok, err := ms.Consensus.RedirectToLeader(method, arg, ret.(*types.SignedMessage))
+ if err != nil {
+ return ok, err
+ }
+ return ok, nil
+}
+
+func (ms *MessageSignerConsensus) SignMessage(
+ ctx context.Context,
+ msg *types.Message,
+ spec *api.MessageSendSpec,
+ cb func(*types.SignedMessage) error) (*types.SignedMessage, error) {
+
+ signedMsg, err := ms.MsgSigner.SignMessage(ctx, msg, spec, cb)
+ if err != nil {
+ return nil, err
+ }
+
+ op := &consensus.ConsensusOp{
+ Nonce: signedMsg.Message.Nonce,
+ Uuid: spec.MsgUuid,
+ Addr: signedMsg.Message.From,
+ SignedMsg: signedMsg,
+ }
+ err = ms.Consensus.Commit(ctx, op)
+ if err != nil {
+ return nil, err
+ }
+
+ return signedMsg, nil
+}
+
+func (ms *MessageSignerConsensus) GetSignedMessage(ctx context.Context, uuid uuid.UUID) (*types.SignedMessage, error) {
+ cstate, err := ms.Consensus.State(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ //cstate := state.(Consensus.RaftState)
+ msg, ok := cstate.MsgUuids[uuid]
+ if !ok {
+ return nil, xerrors.Errorf("Msg with Uuid %s not available", uuid)
+ }
+ return msg, nil
+}
+
+func (ms *MessageSignerConsensus) GetRaftState(ctx context.Context) (*consensus.RaftState, error) {
+ return ms.Consensus.State(ctx)
+}
+
+func (ms *MessageSignerConsensus) Leader(ctx context.Context) (peer.ID, error) {
+ return ms.Consensus.Leader(ctx)
+}
diff --git a/chain/messagesigner/messagesigner_test.go b/chain/messagesigner/messagesigner_test.go
index 87a5e8615..637f17b46 100644
--- a/chain/messagesigner/messagesigner_test.go
+++ b/chain/messagesigner/messagesigner_test.go
@@ -13,6 +13,7 @@ import (
"github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/lotus/chain/messagepool"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet"
)
@@ -22,7 +23,7 @@ type mockMpool struct {
nonces map[address.Address]uint64
}
-var _ MpoolNonceAPI = (*mockMpool)(nil)
+var _ messagepool.MpoolNonceAPI = (*mockMpool)(nil)
func newMockMpool() *mockMpool {
return &mockMpool{nonces: make(map[address.Address]uint64)}
@@ -187,7 +188,7 @@ func TestMessageSignerSignMessage(t *testing.T) {
mpool.setNonce(m.msg.From, m.mpoolNonce[0])
}
merr := m.cbErr
- smsg, err := ms.SignMessage(ctx, m.msg, func(message *types.SignedMessage) error {
+ smsg, err := ms.SignMessage(ctx, m.msg, nil, func(message *types.SignedMessage) error {
return merr
})
diff --git a/chain/state/statetree.go b/chain/state/statetree.go
index 970ac3c72..62d70eff7 100644
--- a/chain/state/statetree.go
+++ b/chain/state/statetree.go
@@ -14,6 +14,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ builtin_types "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/go-state-types/network"
states0 "github.com/filecoin-project/specs-actors/actors/states"
states2 "github.com/filecoin-project/specs-actors/v2/actors/states"
@@ -152,16 +153,12 @@ func VersionForNetwork(ver network.Version) (types.StateTreeVersion, error) {
case network.Version12:
return types.StateTreeVersion3, nil
- /* inline-gen template
- {{$lastNv := .latestNetworkVersion}}
- case{{range .networkVersions}} {{if (ge . 13.)}} network.Version{{.}}{{if (lt . $lastNv)}},{{end}}{{end}}{{end}}:
-
- /* inline-gen start */
-
- case network.Version13, network.Version14, network.Version15, network.Version16:
-
- /* inline-gen end */
+ case network.Version13, network.Version14, network.Version15, network.Version16, network.Version17:
return types.StateTreeVersion4, nil
+
+ case network.Version18:
+ return types.StateTreeVersion5, nil
+
default:
panic(fmt.Sprintf("unsupported network version %d", ver))
}
@@ -172,7 +169,7 @@ func NewStateTree(cst cbor.IpldStore, ver types.StateTreeVersion) (*StateTree, e
switch ver {
case types.StateTreeVersion0:
// info is undefined
- case types.StateTreeVersion1, types.StateTreeVersion2, types.StateTreeVersion3, types.StateTreeVersion4:
+ case types.StateTreeVersion1, types.StateTreeVersion2, types.StateTreeVersion3, types.StateTreeVersion4, types.StateTreeVersion5:
var err error
info, err = cst.Put(context.TODO(), new(types.StateInfo0))
if err != nil {
@@ -215,6 +212,13 @@ func NewStateTree(cst cbor.IpldStore, ver types.StateTreeVersion) (*StateTree, e
return nil, xerrors.Errorf("failed to create state tree: %w", err)
}
hamt = tree.Map
+ case types.StateTreeVersion5:
+ tree, err := builtin_types.NewTree(store)
+ if err != nil {
+ return nil, xerrors.Errorf("failed to create state tree: %w", err)
+ }
+ hamt = tree.Map
+
default:
return nil, xerrors.Errorf("unsupported state tree version: %d", ver)
}
@@ -276,6 +280,13 @@ func LoadStateTree(cst cbor.IpldStore, c cid.Cid) (*StateTree, error) {
if tree != nil {
hamt = tree.Map
}
+ case types.StateTreeVersion5:
+ var tree *builtin_types.ActorTree
+ tree, err = builtin_types.LoadTree(store, root.Actors)
+ if tree != nil {
+ hamt = tree.Map
+ }
+
default:
return nil, xerrors.Errorf("unsupported state tree version: %d", root.Version)
}
@@ -374,7 +385,17 @@ func (st *StateTree) GetActor(addr address.Address) (*types.Actor, error) {
}
var act types.Actor
- if found, err := st.root.Get(abi.AddrKey(addr), &act); err != nil {
+ var found bool
+ if st.version <= types.StateTreeVersion4 {
+ var act4 types.ActorV4
+ found, err = st.root.Get(abi.AddrKey(addr), &act4)
+ if found {
+ act = *types.AsActorV5(&act4)
+ }
+ } else {
+ found, err = st.root.Get(abi.AddrKey(addr), &act)
+ }
+ if err != nil {
return nil, xerrors.Errorf("hamt find failed: %w", err)
} else if !found {
return nil, types.ErrActorNotFound
@@ -423,8 +444,15 @@ func (st *StateTree) Flush(ctx context.Context) (cid.Cid, error) {
return cid.Undef, err
}
} else {
- if err := st.root.Put(abi.AddrKey(addr), &sto.Act); err != nil {
- return cid.Undef, err
+ if st.version <= types.StateTreeVersion4 {
+ act4 := types.AsActorV4(&sto.Act)
+ if err := st.root.Put(abi.AddrKey(addr), act4); err != nil {
+ return cid.Undef, err
+ }
+ } else {
+ if err := st.root.Put(abi.AddrKey(addr), &sto.Act); err != nil {
+ return cid.Undef, err
+ }
}
}
}
@@ -532,6 +560,25 @@ func (st *StateTree) ForEach(f func(address.Address, *types.Actor) error) error
}
// Now walk through the saved actors.
+ if st.version <= types.StateTreeVersion4 {
+ var act types.ActorV4
+ return st.root.ForEach(&act, func(k string) error {
+ act := act // copy
+ addr, err := address.NewFromBytes([]byte(k))
+ if err != nil {
+ return xerrors.Errorf("invalid address (%x) found in state tree key: %w", []byte(k), err)
+ }
+
+ // no need to record anything here, there are no duplicates in the actors HAMT
+ // iself.
+ if _, ok := seen[addr]; ok {
+ return nil
+ }
+
+ return f(addr, types.AsActorV5(&act))
+ })
+ }
+
var act types.Actor
return st.root.ForEach(&act, func(k string) error {
act := act // copy
@@ -567,8 +614,6 @@ func Diff(ctx context.Context, oldTree, newTree *StateTree) (map[string]types.Ac
case <-ctx.Done():
return ctx.Err()
default:
- var act types.Actor
-
addr, err := address.NewFromBytes([]byte(k))
if err != nil {
return xerrors.Errorf("address in state tree was not valid: %w", err)
@@ -583,16 +628,33 @@ func Diff(ctx context.Context, oldTree, newTree *StateTree) (map[string]types.Ac
return nil // not changed
}
- buf.Reset(ncval.Raw)
- err = act.UnmarshalCBOR(buf)
- buf.Reset(nil)
+ if newTree.version <= types.StateTreeVersion4 {
+ var act types.ActorV4
- if err != nil {
- return err
+ buf.Reset(ncval.Raw)
+ err = act.UnmarshalCBOR(buf)
+ buf.Reset(nil)
+
+ if err != nil {
+ return err
+ }
+
+ out[addr.String()] = *types.AsActorV5(&act)
+
+ } else {
+ var act types.Actor
+
+ buf.Reset(ncval.Raw)
+ err = act.UnmarshalCBOR(buf)
+ buf.Reset(nil)
+
+ if err != nil {
+ return err
+ }
+
+ out[addr.String()] = act
}
- out[addr.String()] = act
-
return nil
}
}); err != nil {
diff --git a/chain/state/statetree_test.go b/chain/state/statetree_test.go
index e15fed489..9a221751a 100644
--- a/chain/state/statetree_test.go
+++ b/chain/state/statetree_test.go
@@ -48,7 +48,7 @@ func BenchmarkStateTreeSet(b *testing.B) {
func BenchmarkStateTreeSetFlush(b *testing.B) {
//stm: @CHAIN_STATETREE_SET_ACTOR_001
cst := cbor.NewMemCborStore()
- sv, err := VersionForNetwork(build.NewestNetworkVersion)
+ sv, err := VersionForNetwork(build.TestNetworkVersion)
if err != nil {
b.Fatal(err)
}
@@ -85,7 +85,7 @@ func TestResolveCache(t *testing.T) {
//stm: @CHAIN_STATETREE_SET_ACTOR_001, @CHAIN_STATETREE_GET_ACTOR_001, @CHAIN_STATETREE_VERSION_FOR_NETWORK_001
//stm: @CHAIN_STATETREE_SNAPSHOT_001, @CHAIN_STATETREE_SNAPSHOT_CLEAR_001
cst := cbor.NewMemCborStore()
- sv, err := VersionForNetwork(build.NewestNetworkVersion)
+ sv, err := VersionForNetwork(build.TestNetworkVersion)
if err != nil {
t.Fatal(err)
}
@@ -189,7 +189,7 @@ func BenchmarkStateTree10kGetActor(b *testing.B) {
//stm: @CHAIN_STATETREE_SET_ACTOR_001, @CHAIN_STATETREE_GET_ACTOR_001, @CHAIN_STATETREE_VERSION_FOR_NETWORK_001
//stm: @CHAIN_STATETREE_FLUSH_001
cst := cbor.NewMemCborStore()
- sv, err := VersionForNetwork(build.NewestNetworkVersion)
+ sv, err := VersionForNetwork(build.TestNetworkVersion)
if err != nil {
b.Fatal(err)
}
@@ -237,7 +237,7 @@ func BenchmarkStateTree10kGetActor(b *testing.B) {
func TestSetCache(t *testing.T) {
//stm: @CHAIN_STATETREE_SET_ACTOR_001, @CHAIN_STATETREE_GET_ACTOR_001, @CHAIN_STATETREE_VERSION_FOR_NETWORK_001
cst := cbor.NewMemCborStore()
- sv, err := VersionForNetwork(build.NewestNetworkVersion)
+ sv, err := VersionForNetwork(build.TestNetworkVersion)
if err != nil {
t.Fatal(err)
}
@@ -282,7 +282,7 @@ func TestSnapshots(t *testing.T) {
ctx := context.Background()
cst := cbor.NewMemCborStore()
- sv, err := VersionForNetwork(build.NewestNetworkVersion)
+ sv, err := VersionForNetwork(build.TestNetworkVersion)
if err != nil {
t.Fatal(err)
}
diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go
index 3ef5a3af9..0c2524b7b 100644
--- a/chain/stmgr/actors.go
+++ b/chain/stmgr/actors.go
@@ -12,7 +12,6 @@ import (
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- miner_types "github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/network"
@@ -22,6 +21,7 @@ import (
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
"github.com/filecoin-project/lotus/chain/actors/builtin/paych"
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
"github.com/filecoin-project/lotus/chain/beacon"
"github.com/filecoin-project/lotus/chain/rand"
"github.com/filecoin-project/lotus/chain/types"
@@ -89,7 +89,7 @@ func GetPowerRaw(ctx context.Context, sm *StateManager, st cid.Cid, maddr addres
return mpow, tpow, minpow, nil
}
-func PreCommitInfo(ctx context.Context, sm *StateManager, maddr address.Address, sid abi.SectorNumber, ts *types.TipSet) (*miner_types.SectorPreCommitOnChainInfo, error) {
+func PreCommitInfo(ctx context.Context, sm *StateManager, maddr address.Address, sid abi.SectorNumber, ts *types.TipSet) (*miner.SectorPreCommitOnChainInfo, error) {
act, err := sm.LoadActor(ctx, maddr, ts)
if err != nil {
return nil, xerrors.Errorf("(get sset) failed to load miner actor: %w", err)
@@ -103,6 +103,7 @@ func PreCommitInfo(ctx context.Context, sm *StateManager, maddr address.Address,
return mas.GetPrecommittedSector(sid)
}
+// Returns nil, nil if sector is not found
func MinerSectorInfo(ctx context.Context, sm *StateManager, maddr address.Address, sid abi.SectorNumber, ts *types.TipSet) (*miner.SectorOnChainInfo, error) {
act, err := sm.LoadActor(ctx, maddr, ts)
if err != nil {
@@ -252,13 +253,13 @@ func GetStorageDeal(ctx context.Context, sm *StateManager, dealID abi.DealID, ts
proposals, err := state.Proposals()
if err != nil {
- return nil, err
+ return nil, xerrors.Errorf("failed to get proposals from state : %w", err)
}
proposal, found, err := proposals.Get(dealID)
if err != nil {
- return nil, err
+ return nil, xerrors.Errorf("failed to get proposal : %w", err)
} else if !found {
return nil, xerrors.Errorf(
"deal %d not found "+
@@ -269,12 +270,12 @@ func GetStorageDeal(ctx context.Context, sm *StateManager, dealID abi.DealID, ts
states, err := state.States()
if err != nil {
- return nil, err
+ return nil, xerrors.Errorf("failed to get states : %w", err)
}
st, found, err := states.Get(dealID)
if err != nil {
- return nil, err
+ return nil, xerrors.Errorf("failed to get state : %w", err)
}
if !found {
@@ -517,6 +518,24 @@ func (sm *StateManager) GetMarketState(ctx context.Context, ts *types.TipSet) (m
return actState, nil
}
+func (sm *StateManager) GetVerifregState(ctx context.Context, ts *types.TipSet) (verifreg.State, error) {
+ st, err := sm.ParentState(ts)
+ if err != nil {
+ return nil, err
+ }
+
+ act, err := st.GetActor(verifreg.Address)
+ if err != nil {
+ return nil, err
+ }
+
+ actState, err := verifreg.Load(sm.cs.ActorStore(ctx), act)
+ if err != nil {
+ return nil, err
+ }
+ return actState, nil
+}
+
func (sm *StateManager) MarketBalance(ctx context.Context, addr address.Address, ts *types.TipSet) (api.MarketBalance, error) {
mstate, err := sm.GetMarketState(ctx, ts)
if err != nil {
diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go
index 2d0d8f047..c110dd4bd 100644
--- a/chain/stmgr/call.go
+++ b/chain/stmgr/call.go
@@ -14,6 +14,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/crypto"
+ "github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/blockstore"
@@ -29,74 +30,7 @@ var ErrExpensiveFork = errors.New("refusing explicit call due to state fork at e
// Call applies the given message to the given tipset's parent state, at the epoch following the
// tipset's parent. In the presence of null blocks, the height at which the message is invoked may
// be less than the specified tipset.
-//
-// - If no tipset is specified, the first tipset without an expensive migration is used.
-// - If executing a message at a given tipset would trigger an expensive migration, the call will
-// fail with ErrExpensiveFork.
func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types.TipSet) (*api.InvocResult, error) {
- ctx, span := trace.StartSpan(ctx, "statemanager.Call")
- defer span.End()
-
- var pheight abi.ChainEpoch = -1
-
- // If no tipset is provided, try to find one without a fork.
- if ts == nil {
- ts = sm.cs.GetHeaviestTipSet()
- // Search back till we find a height with no fork, or we reach the beginning.
- for ts.Height() > 0 {
- pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents())
- if err != nil {
- return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err)
- }
- if !sm.hasExpensiveFork(pts.Height()) {
- pheight = pts.Height()
- break
- }
- ts = pts
- }
- } else if ts.Height() > 0 {
- pts, err := sm.cs.LoadTipSet(ctx, ts.Parents())
- if err != nil {
- return nil, xerrors.Errorf("failed to load parent tipset: %w", err)
- }
- pheight = pts.Height()
- if sm.hasExpensiveFork(pheight) {
- return nil, ErrExpensiveFork
- }
- } else {
- // We can't get the parent tipset in this case.
- pheight = ts.Height() - 1
- }
-
- // Since we're simulating a future message, pretend we're applying it in the "next" tipset
- vmHeight := pheight + 1
- bstate := ts.ParentState()
-
- // Run the (not expensive) migration.
- bstate, err := sm.HandleStateForks(ctx, bstate, pheight, nil, ts)
- if err != nil {
- return nil, fmt.Errorf("failed to handle fork: %w", err)
- }
-
- vmopt := &vm.VMOpts{
- StateBase: bstate,
- Epoch: vmHeight,
- Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion),
- Bstore: sm.cs.StateBlockstore(),
- Actors: sm.tsExec.NewActorRegistry(),
- Syscalls: sm.Syscalls,
- CircSupplyCalc: sm.GetVMCirculatingSupply,
- NetworkVersion: sm.GetNetworkVersion(ctx, pheight+1),
- BaseFee: types.NewInt(0),
- LookbackState: LookbackStateGetterForTipset(sm, ts),
- Tracing: true,
- }
-
- vmi, err := sm.newVM(ctx, vmopt)
- if err != nil {
- return nil, xerrors.Errorf("failed to set up vm: %w", err)
- }
-
if msg.GasLimit == 0 {
msg.GasLimit = build.BlockGasLimit
}
@@ -106,62 +40,43 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types.
if msg.GasPremium == types.EmptyInt {
msg.GasPremium = types.NewInt(0)
}
-
if msg.Value == types.EmptyInt {
msg.Value = types.NewInt(0)
}
- if span.IsRecordingEvents() {
- span.AddAttributes(
- trace.Int64Attribute("gas_limit", msg.GasLimit),
- trace.StringAttribute("gas_feecap", msg.GasFeeCap.String()),
- trace.StringAttribute("value", msg.Value.String()),
- )
- }
-
- stTree, err := sm.StateTree(bstate)
- if err != nil {
- return nil, xerrors.Errorf("failed to load state tree: %w", err)
- }
-
- fromActor, err := stTree.GetActor(msg.From)
- if err != nil {
- return nil, xerrors.Errorf("call raw get actor: %s", err)
- }
-
- msg.Nonce = fromActor.Nonce
-
- // TODO: maybe just use the invoker directly?
- ret, err := vmi.ApplyImplicitMessage(ctx, msg)
- if err != nil {
- return nil, xerrors.Errorf("apply message failed: %w", err)
- }
-
- var errs string
- if ret.ActorErr != nil {
- errs = ret.ActorErr.Error()
- log.Warnf("chain call failed: %s", ret.ActorErr)
- }
-
- return &api.InvocResult{
- MsgCid: msg.Cid(),
- Msg: msg,
- MsgRct: &ret.MessageReceipt,
- ExecutionTrace: ret.ExecutionTrace,
- Error: errs,
- Duration: ret.Duration,
- }, nil
-
+ return sm.callInternal(ctx, msg, nil, ts, cid.Undef, sm.GetNetworkVersion, false)
}
+// CallWithGas calculates the state for a given tipset, and then applies the given message on top of that state.
func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, priorMsgs []types.ChainMsg, ts *types.TipSet) (*api.InvocResult, error) {
- ctx, span := trace.StartSpan(ctx, "statemanager.CallWithGas")
+ return sm.callInternal(ctx, msg, priorMsgs, ts, cid.Undef, sm.GetNetworkVersion, true)
+}
+
+// CallAtStateAndVersion allows you to specify a message to execute on the given stateCid and network version.
+// This should mostly be used for gas modelling on a migrated state.
+// Tipset here is not needed because stateCid and network version fully describe execution we want. The internal function
+// will get the heaviest tipset for use for things like basefee, which we don't really care about here.
+func (sm *StateManager) CallAtStateAndVersion(ctx context.Context, msg *types.Message, stateCid cid.Cid, v network.Version) (*api.InvocResult, error) {
+ nvGetter := func(context.Context, abi.ChainEpoch) network.Version {
+ return v
+ }
+
+ return sm.callInternal(ctx, msg, nil, nil, stateCid, nvGetter, true)
+}
+
+// - If no tipset is specified, the first tipset without an expensive migration or one in its parent is used.
+// - If executing a message at a given tipset or its parent would trigger an expensive migration, the call will
+// fail with ErrExpensiveFork.
+func (sm *StateManager) callInternal(ctx context.Context, msg *types.Message, priorMsgs []types.ChainMsg, ts *types.TipSet, stateCid cid.Cid, nvGetter rand.NetworkVersionGetter, checkGas bool) (*api.InvocResult, error) {
+ ctx, span := trace.StartSpan(ctx, "statemanager.callInternal")
defer span.End()
// Copy the message as we'll be modifying the nonce.
msgCopy := *msg
msg = &msgCopy
+ var err error
+ var pts *types.TipSet
if ts == nil {
ts = sm.cs.GetHeaviestTipSet()
@@ -171,10 +86,11 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
// height to have no fork, because we'll run it inside this
// function before executing the given message.
for ts.Height() > 0 {
- pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents())
+ pts, err = sm.cs.GetTipSetFromKey(ctx, ts.Parents())
if err != nil {
return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err)
}
+ // Checks for expensive forks from the parents to the tipset, including nil tipsets
if !sm.hasExpensiveForkBetween(pts.Height(), ts.Height()+1) {
break
}
@@ -182,7 +98,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
ts = pts
}
} else if ts.Height() > 0 {
- pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents())
+ pts, err = sm.cs.GetTipSetFromKey(ctx, ts.Parents())
if err != nil {
return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err)
}
@@ -191,12 +107,22 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
}
}
- // Since we're simulating a future message, pretend we're applying it in the "next" tipset
- vmHeight := ts.Height() + 1
-
- stateCid, _, err := sm.TipSetState(ctx, ts)
- if err != nil {
- return nil, xerrors.Errorf("computing tipset state: %w", err)
+ var vmHeight abi.ChainEpoch
+ if checkGas {
+ // Since we're simulating a future message, pretend we're applying it in the "next" tipset
+ vmHeight = ts.Height() + 1
+ if stateCid == cid.Undef {
+ stateCid, _, err = sm.TipSetState(ctx, ts)
+ if err != nil {
+ return nil, xerrors.Errorf("computing tipset state: %w", err)
+ }
+ }
+ } else {
+ // If we're not checking gas, we don't want to have to execute the tipset like above. This saves a lot of computation time
+ vmHeight = pts.Height() + 1
+ if stateCid == cid.Undef {
+ stateCid = ts.ParentState()
+ }
}
// Technically, the tipset we're passing in here should be ts+1, but that may not exist.
@@ -205,8 +131,6 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
return nil, fmt.Errorf("failed to handle fork: %w", err)
}
- r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion)
-
if span.IsRecordingEvents() {
span.AddAttributes(
trace.Int64Attribute("gas_limit", msg.GasLimit),
@@ -219,14 +143,15 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
vmopt := &vm.VMOpts{
StateBase: stateCid,
Epoch: vmHeight,
- Rand: r,
+ Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, nvGetter),
Bstore: buffStore,
Actors: sm.tsExec.NewActorRegistry(),
Syscalls: sm.Syscalls,
CircSupplyCalc: sm.GetVMCirculatingSupply,
- NetworkVersion: sm.GetNetworkVersion(ctx, ts.Height()+1),
+ NetworkVersion: nvGetter(ctx, vmHeight),
BaseFee: ts.Blocks()[0].ParentBaseFee,
LookbackState: LookbackStateGetterForTipset(sm, ts),
+ TipSetGetter: TipSetGetterForTipset(sm.cs, ts),
Tracing: true,
}
vmi, err := sm.newVM(ctx, vmopt)
@@ -234,7 +159,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
return nil, xerrors.Errorf("failed to set up vm: %w", err)
}
for i, m := range priorMsgs {
- _, err := vmi.ApplyMessage(ctx, m)
+ _, err = vmi.ApplyMessage(ctx, m)
if err != nil {
return nil, xerrors.Errorf("applying prior message (%d, %s): %w", i, m.Cid(), err)
}
@@ -259,27 +184,6 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
msg.Nonce = fromActor.Nonce
- fromKey, err := sm.ResolveToKeyAddress(ctx, msg.From, ts)
- if err != nil {
- return nil, xerrors.Errorf("could not resolve key: %w", err)
- }
-
- var msgApply types.ChainMsg
-
- switch fromKey.Protocol() {
- case address.BLS:
- msgApply = msg
- case address.SECP256K1:
- msgApply = &types.SignedMessage{
- Message: *msg,
- Signature: crypto.Signature{
- Type: crypto.SigTypeSecp256k1,
- Data: make([]byte, 65),
- },
- }
-
- }
-
// If the fee cap is set to zero, make gas free.
if msg.GasFeeCap.NilOrZero() {
// Now estimate with a new VM with no base fee.
@@ -292,9 +196,39 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
}
}
- ret, err := vmi.ApplyMessage(ctx, msgApply)
- if err != nil {
- return nil, xerrors.Errorf("gas estimation failed: %w", err)
+ var ret *vm.ApplyRet
+ var gasInfo api.MsgGasCost
+ if checkGas {
+ fromKey, err := sm.ResolveToKeyAddress(ctx, msg.From, ts)
+ if err != nil {
+ return nil, xerrors.Errorf("could not resolve key: %w", err)
+ }
+
+ var msgApply types.ChainMsg
+
+ switch fromKey.Protocol() {
+ case address.BLS:
+ msgApply = msg
+ case address.SECP256K1:
+ msgApply = &types.SignedMessage{
+ Message: *msg,
+ Signature: crypto.Signature{
+ Type: crypto.SigTypeSecp256k1,
+ Data: make([]byte, 65),
+ },
+ }
+ }
+
+ ret, err = vmi.ApplyMessage(ctx, msgApply)
+ if err != nil {
+ return nil, xerrors.Errorf("gas estimation failed: %w", err)
+ }
+ gasInfo = MakeMsgGasCost(msg, ret)
+ } else {
+ ret, err = vmi.ApplyImplicitMessage(ctx, msg)
+ if err != nil && ret == nil {
+ return nil, xerrors.Errorf("apply message failed: %w", err)
+ }
}
var errs string
@@ -306,11 +240,11 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri
MsgCid: msg.Cid(),
Msg: msg,
MsgRct: &ret.MessageReceipt,
- GasCost: MakeMsgGasCost(msg, ret),
+ GasCost: gasInfo,
ExecutionTrace: ret.ExecutionTrace,
Error: errs,
Duration: ret.Duration,
- }, nil
+ }, err
}
var errHaltExecution = fmt.Errorf("halt")
diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go
index 7eb63566c..98ab647c9 100644
--- a/chain/stmgr/forks_test.go
+++ b/chain/stmgr/forks_test.go
@@ -17,8 +17,10 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/network"
+ rtt "github.com/filecoin-project/go-state-types/rt"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
init2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/init"
rt2 "github.com/filecoin-project/specs-actors/v2/actors/runtime"
@@ -26,6 +28,7 @@ import (
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
_init "github.com/filecoin-project/lotus/chain/actors/builtin/init"
"github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/consensus/filcns"
@@ -167,7 +170,8 @@ func TestForkHeightTriggers(t *testing.T) {
}
inv := filcns.NewActorRegistry()
- inv.Register(actors.Version0, nil, testActor{})
+ registry := builtin.MakeRegistryLegacy([]rtt.VMActor{testActor{}})
+ inv.Register(actorstypes.Version0, nil, registry)
sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) {
nvm, err := vm.NewLegacyVM(ctx, vmopt)
@@ -284,7 +288,8 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) {
}
inv := filcns.NewActorRegistry()
- inv.Register(actors.Version0, nil, testActor{})
+ registry := builtin.MakeRegistryLegacy([]rtt.VMActor{testActor{}})
+ inv.Register(actorstypes.Version0, nil, registry)
sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) {
nvm, err := vm.NewLegacyVM(ctx, vmopt)
@@ -330,7 +335,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) {
parentHeight := pts.Height()
currentHeight := ts.TipSet.TipSet().Height()
- // CallWithGas calls _at_ the current tipset.
+ // CallWithGas calls on top of the given tipset.
ret, err := sm.CallWithGas(ctx, m, nil, ts.TipSet.TipSet())
if parentHeight <= testForkHeight && currentHeight >= testForkHeight {
// If I had a fork, or I _will_ have a fork, it should fail.
@@ -342,7 +347,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) {
// Call always applies the message to the "next block" after the tipset's parent state.
ret, err = sm.Call(ctx, m, ts.TipSet.TipSet())
- if parentHeight == testForkHeight {
+ if parentHeight <= testForkHeight && currentHeight >= testForkHeight {
require.Equal(t, ErrExpensiveFork, err)
} else {
require.NoError(t, err)
@@ -505,7 +510,8 @@ func TestForkPreMigration(t *testing.T) {
}()
inv := filcns.NewActorRegistry()
- inv.Register(actors.Version0, nil, testActor{})
+ registry := builtin.MakeRegistryLegacy([]rtt.VMActor{testActor{}})
+ inv.Register(actorstypes.Version0, nil, registry)
sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) {
nvm, err := vm.NewLegacyVM(ctx, vmopt)
diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go
index 9e7a08ba7..af4a0cd9e 100644
--- a/chain/stmgr/utils.go
+++ b/chain/stmgr/utils.go
@@ -30,13 +30,14 @@ import (
func GetReturnType(ctx context.Context, sm *StateManager, to address.Address, method abi.MethodNum, ts *types.TipSet) (cbg.CBORUnmarshaler, error) {
act, err := sm.LoadActor(ctx, to, ts)
if err != nil {
- return nil, xerrors.Errorf("(get sset) failed to load miner actor: %w", err)
+ return nil, xerrors.Errorf("(get sset) failed to load actor: %w", err)
}
m, found := sm.tsExec.NewActorRegistry().Methods[act.Code][method]
if !found {
return nil, fmt.Errorf("unknown method %d for actor %s", method, act.Code)
}
+
return reflect.New(m.Ret.Elem()).Interface().(cbg.CBORUnmarshaler), nil
}
@@ -94,6 +95,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch,
NetworkVersion: sm.GetNetworkVersion(ctx, height),
BaseFee: ts.Blocks()[0].ParentBaseFee,
LookbackState: LookbackStateGetterForTipset(sm, ts),
+ TipSetGetter: TipSetGetterForTipset(sm.cs, ts),
Tracing: true,
}
vmi, err := sm.newVM(ctx, vmopt)
@@ -130,6 +132,16 @@ func LookbackStateGetterForTipset(sm *StateManager, ts *types.TipSet) vm.Lookbac
}
}
+func TipSetGetterForTipset(cs *store.ChainStore, ts *types.TipSet) vm.TipSetGetter {
+ return func(ctx context.Context, round abi.ChainEpoch) (types.TipSetKey, error) {
+ ts, err := cs.GetTipsetByHeight(ctx, round, ts, true)
+ if err != nil {
+ return types.EmptyTSK, err
+ }
+ return ts.Key(), nil
+ }
+}
+
func GetLookbackTipSetForRound(ctx context.Context, sm *StateManager, ts *types.TipSet, round abi.ChainEpoch) (*types.TipSet, cid.Cid, error) {
var lbr abi.ChainEpoch
lb := policy.GetWinningPoStSectorSetLookback(sm.GetNetworkVersion(ctx, round))
diff --git a/chain/store/basefee_test.go b/chain/store/basefee_test.go
index ea45a7673..8dd61f709 100644
--- a/chain/store/basefee_test.go
+++ b/chain/store/basefee_test.go
@@ -25,7 +25,7 @@ func TestBaseFee(t *testing.T) {
{100e6, build.BlockGasTarget, 1, 103.125e6, 100e6},
{100e6, build.BlockGasTarget * 2, 2, 103.125e6, 100e6},
{100e6, build.BlockGasLimit * 2, 2, 112.5e6, 112.5e6},
- {100e6, build.BlockGasLimit * 1.5, 2, 110937500, 106.250e6},
+ {100e6, (build.BlockGasLimit * 15) / 10, 2, 110937500, 106.250e6},
}
for _, test := range tests {
diff --git a/chain/store/snapshot.go b/chain/store/snapshot.go
index b5a457b71..f9e65f4bf 100644
--- a/chain/store/snapshot.go
+++ b/chain/store/snapshot.go
@@ -5,9 +5,11 @@ import (
"context"
"io"
+ blocks "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
"github.com/ipld/go-car"
carutil "github.com/ipld/go-car/util"
+ carv2 "github.com/ipld/go-car/v2"
mh "github.com/multiformats/go-multihash"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
@@ -55,12 +57,58 @@ func (cs *ChainStore) Import(ctx context.Context, r io.Reader) (*types.TipSet, e
// universal store. When we physically segregate the stores, we will need
// to route state objects to the state blockstore, and chain objects to
// the chain blockstore.
- header, err := car.LoadCar(ctx, cs.StateBlockstore(), r)
+
+ br, err := carv2.NewBlockReader(r)
if err != nil {
return nil, xerrors.Errorf("loadcar failed: %w", err)
}
- root, err := cs.LoadTipSet(ctx, types.NewTipSetKey(header.Roots...))
+ s := cs.StateBlockstore()
+
+ parallelPuts := 5
+ putThrottle := make(chan error, parallelPuts)
+ for i := 0; i < parallelPuts; i++ {
+ putThrottle <- nil
+ }
+
+ var buf []blocks.Block
+ for {
+ blk, err := br.Next()
+ if err != nil {
+ if err == io.EOF {
+ if len(buf) > 0 {
+ if err := s.PutMany(ctx, buf); err != nil {
+ return nil, err
+ }
+ }
+
+ break
+ }
+ return nil, err
+ }
+
+ buf = append(buf, blk)
+
+ if len(buf) > 1000 {
+ if lastErr := <-putThrottle; lastErr != nil { // consume one error to have the right to add one
+ return nil, lastErr
+ }
+
+ go func(buf []blocks.Block) {
+ putThrottle <- s.PutMany(ctx, buf)
+ }(buf)
+ buf = nil
+ }
+ }
+
+ // check errors
+ for i := 0; i < parallelPuts; i++ {
+ if lastErr := <-putThrottle; lastErr != nil {
+ return nil, lastErr
+ }
+ }
+
+ root, err := cs.LoadTipSet(ctx, types.NewTipSetKey(br.Roots...))
if err != nil {
return nil, xerrors.Errorf("failed to load root tipset from chainfile: %w", err)
}
diff --git a/chain/store/store_test.go b/chain/store/store_test.go
index af78e3dc0..6dc340737 100644
--- a/chain/store/store_test.go
+++ b/chain/store/store_test.go
@@ -110,7 +110,7 @@ func TestChainExportImport(t *testing.T) {
t.Fatal(err)
}
- nbs := blockstore.NewMemory()
+ nbs := blockstore.NewMemorySync()
cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil)
defer cs.Close() //nolint:errcheck
@@ -148,7 +148,7 @@ func TestChainExportImportFull(t *testing.T) {
t.Fatal(err)
}
- nbs := blockstore.NewMemory()
+ nbs := blockstore.NewMemorySync()
cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil)
defer cs.Close() //nolint:errcheck
diff --git a/chain/sync_test.go b/chain/sync_test.go
index b1be0b590..18520a07f 100644
--- a/chain/sync_test.go
+++ b/chain/sync_test.go
@@ -147,6 +147,10 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn
Network: network.Version16,
Height: v5height + 20,
Migration: filcns.UpgradeActorsV8,
+ }, {
+ Network: network.Version17,
+ Height: v5height + 25,
+ Migration: filcns.UpgradeActorsV9,
}}
g, err := gen.NewGeneratorWithUpgradeSchedule(sched)
diff --git a/chain/types/actor.go b/chain/types/actor.go
index a9974a01f..29a6865eb 100644
--- a/chain/types/actor.go
+++ b/chain/types/actor.go
@@ -4,14 +4,48 @@ import (
"errors"
"github.com/ipfs/go-cid"
+
+ "github.com/filecoin-project/go-address"
)
var ErrActorNotFound = errors.New("actor not found")
-type Actor struct {
+// Actor State for state tree version up to 4
+type ActorV4 struct {
// Identifies the type of actor (string coded as a CID), see `chain/actors/actors.go`.
Code cid.Cid
Head cid.Cid
Nonce uint64
Balance BigInt
}
+
+// Actor State for state tree version 5
+type ActorV5 struct {
+ // Identifies the type of actor (string coded as a CID), see `chain/actors/actors.go`.
+ Code cid.Cid
+ Head cid.Cid
+ Nonce uint64
+ Balance BigInt
+ // Predictable Address
+ Address *address.Address
+}
+
+type Actor = ActorV5
+
+func AsActorV4(a *ActorV5) *ActorV4 {
+ return &ActorV4{
+ Code: a.Code,
+ Head: a.Head,
+ Nonce: a.Nonce,
+ Balance: a.Balance,
+ }
+}
+
+func AsActorV5(a *ActorV4) *ActorV5 {
+ return &ActorV5{
+ Code: a.Code,
+ Head: a.Head,
+ Nonce: a.Nonce,
+ Balance: a.Balance,
+ }
+}
diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go
index 78a3449ee..da42d7603 100644
--- a/chain/types/cbor_gen.go
+++ b/chain/types/cbor_gen.go
@@ -12,6 +12,7 @@ import (
cbg "github.com/whyrusleeping/cbor-gen"
xerrors "golang.org/x/xerrors"
+ address "github.com/filecoin-project/go-address"
abi "github.com/filecoin-project/go-state-types/abi"
crypto "github.com/filecoin-project/go-state-types/crypto"
exitcode "github.com/filecoin-project/go-state-types/exitcode"
@@ -1040,9 +1041,9 @@ func (t *MsgMeta) UnmarshalCBOR(r io.Reader) (err error) {
return nil
}
-var lengthBufActor = []byte{132}
+var lengthBufActorV4 = []byte{132}
-func (t *Actor) MarshalCBOR(w io.Writer) error {
+func (t *ActorV4) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
return err
@@ -1050,7 +1051,7 @@ func (t *Actor) MarshalCBOR(w io.Writer) error {
cw := cbg.NewCborWriter(w)
- if _, err := cw.Write(lengthBufActor); err != nil {
+ if _, err := cw.Write(lengthBufActorV4); err != nil {
return err
}
@@ -1079,8 +1080,8 @@ func (t *Actor) MarshalCBOR(w io.Writer) error {
return nil
}
-func (t *Actor) UnmarshalCBOR(r io.Reader) (err error) {
- *t = Actor{}
+func (t *ActorV4) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = ActorV4{}
cr := cbg.NewCborReader(r)
@@ -1152,6 +1153,142 @@ func (t *Actor) UnmarshalCBOR(r io.Reader) (err error) {
return nil
}
+var lengthBufActorV5 = []byte{133}
+
+func (t *ActorV5) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write(lengthBufActorV5); err != nil {
+ return err
+ }
+
+ // t.Code (cid.Cid) (struct)
+
+ if err := cbg.WriteCid(cw, t.Code); err != nil {
+ return xerrors.Errorf("failed to write cid field t.Code: %w", err)
+ }
+
+ // t.Head (cid.Cid) (struct)
+
+ if err := cbg.WriteCid(cw, t.Head); err != nil {
+ return xerrors.Errorf("failed to write cid field t.Head: %w", err)
+ }
+
+ // t.Nonce (uint64) (uint64)
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.Nonce)); err != nil {
+ return err
+ }
+
+ // t.Balance (big.Int) (struct)
+ if err := t.Balance.MarshalCBOR(cw); err != nil {
+ return err
+ }
+
+ // t.Address (address.Address) (struct)
+ if err := t.Address.MarshalCBOR(cw); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (t *ActorV5) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = ActorV5{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("cbor input should be of type array")
+ }
+
+ if extra != 5 {
+ return fmt.Errorf("cbor input had wrong number of fields")
+ }
+
+ // t.Code (cid.Cid) (struct)
+
+ {
+
+ c, err := cbg.ReadCid(cr)
+ if err != nil {
+ return xerrors.Errorf("failed to read cid field t.Code: %w", err)
+ }
+
+ t.Code = c
+
+ }
+ // t.Head (cid.Cid) (struct)
+
+ {
+
+ c, err := cbg.ReadCid(cr)
+ if err != nil {
+ return xerrors.Errorf("failed to read cid field t.Head: %w", err)
+ }
+
+ t.Head = c
+
+ }
+ // t.Nonce (uint64) (uint64)
+
+ {
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajUnsignedInt {
+ return fmt.Errorf("wrong type for uint64 field")
+ }
+ t.Nonce = uint64(extra)
+
+ }
+ // t.Balance (big.Int) (struct)
+
+ {
+
+ if err := t.Balance.UnmarshalCBOR(cr); err != nil {
+ return xerrors.Errorf("unmarshaling t.Balance: %w", err)
+ }
+
+ }
+ // t.Address (address.Address) (struct)
+
+ {
+
+ b, err := cr.ReadByte()
+ if err != nil {
+ return err
+ }
+ if b != cbg.CborNull[0] {
+ if err := cr.UnreadByte(); err != nil {
+ return err
+ }
+ t.Address = new(address.Address)
+ if err := t.Address.UnmarshalCBOR(cr); err != nil {
+ return xerrors.Errorf("unmarshaling t.Address pointer: %w", err)
+ }
+ }
+
+ }
+ return nil
+}
+
var lengthBufMessageReceipt = []byte{131}
func (t *MessageReceipt) MarshalCBOR(w io.Writer) error {
diff --git a/chain/types/execresult.go b/chain/types/execresult.go
index 917b84a92..98d06a390 100644
--- a/chain/types/execresult.go
+++ b/chain/types/execresult.go
@@ -42,6 +42,25 @@ type Loc struct {
Function string
}
+func (et ExecutionTrace) SumGas() GasTrace {
+ return SumGas(et.GasCharges)
+}
+
+func SumGas(charges []*GasTrace) GasTrace {
+ var out GasTrace
+ for _, gc := range charges {
+ out.TotalGas += gc.TotalGas
+ out.ComputeGas += gc.ComputeGas
+ out.StorageGas += gc.StorageGas
+
+ out.TotalVirtualGas += gc.TotalVirtualGas
+ out.VirtualComputeGas += gc.VirtualComputeGas
+ out.VirtualStorageGas += gc.VirtualStorageGas
+ }
+
+ return out
+}
+
func (l Loc) Show() bool {
ignorePrefix := []string{
"reflect.",
diff --git a/chain/types/fil.go b/chain/types/fil.go
index 21125e6d6..60a2940c6 100644
--- a/chain/types/fil.go
+++ b/chain/types/fil.go
@@ -102,7 +102,7 @@ func ParseFIL(s string) (FIL, error) {
return FIL{}, fmt.Errorf("string length too large: %d", len(s))
}
- r, ok := new(big.Rat).SetString(s)
+ r, ok := new(big.Rat).SetString(s) //nolint:gosec
if !ok {
return FIL{}, fmt.Errorf("failed to parse %q as a decimal number", s)
}
diff --git a/chain/types/message.go b/chain/types/message.go
index 547d4c353..352548d0c 100644
--- a/chain/types/message.go
+++ b/chain/types/message.go
@@ -159,10 +159,18 @@ func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version)
return xerrors.New("invalid 'To' address")
}
+ if !abi.AddressValidForNetworkVersion(m.To, version) {
+ return xerrors.New("'To' address protocol unsupported for network version")
+ }
+
if m.From == address.Undef {
return xerrors.New("'From' address cannot be empty")
}
+ if !abi.AddressValidForNetworkVersion(m.From, version) {
+ return xerrors.New("'From' address protocol unsupported for network version")
+ }
+
if m.Value.Int == nil {
return xerrors.New("'Value' cannot be nil")
}
diff --git a/chain/types/state.go b/chain/types/state.go
index 506840370..37757f362 100644
--- a/chain/types/state.go
+++ b/chain/types/state.go
@@ -17,6 +17,8 @@ const (
StateTreeVersion3
// StateTreeVersion4 corresponds to actors v5 and above.
StateTreeVersion4
+ // StateTreeVersion5 corresponds to actors v10 and above.
+ StateTreeVersion5
)
type StateRoot struct {
diff --git a/chain/types/tipset_key.go b/chain/types/tipset_key.go
index 59514a792..15e655da7 100644
--- a/chain/types/tipset_key.go
+++ b/chain/types/tipset_key.go
@@ -7,6 +7,7 @@ import (
"io"
"strings"
+ block "github.com/ipfs/go-block-format"
"github.com/ipfs/go-cid"
typegen "github.com/whyrusleeping/cbor-gen"
@@ -98,6 +99,28 @@ func (k *TipSetKey) UnmarshalJSON(b []byte) error {
return nil
}
+func (k TipSetKey) Cid() (cid.Cid, error) {
+ blk, err := k.ToStorageBlock()
+ if err != nil {
+ return cid.Cid{}, err
+ }
+ return blk.Cid(), nil
+}
+
+func (k TipSetKey) ToStorageBlock() (block.Block, error) {
+ buf := new(bytes.Buffer)
+ if err := k.MarshalCBOR(buf); err != nil {
+ log.Errorf("failed to marshal ts key as CBOR: %s", k)
+ }
+
+ cid, err := abi.CidBuilder.Sum(buf.Bytes())
+ if err != nil {
+ return nil, err
+ }
+
+ return block.NewBlockWithCid(buf.Bytes(), cid)
+}
+
func (k TipSetKey) MarshalCBOR(writer io.Writer) error {
if err := typegen.WriteMajorTypeHeader(writer, typegen.MajByteString, uint64(len(k.Bytes()))); err != nil {
return err
diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go
index 64b623f63..edcf06560 100644
--- a/chain/vm/cbor_gen.go
+++ b/chain/vm/cbor_gen.go
@@ -20,7 +20,7 @@ var _ = cid.Undef
var _ = math.E
var _ = sort.Sort
-var lengthBufFvmExecutionTrace = []byte{132}
+var lengthBufFvmExecutionTrace = []byte{133}
func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error {
if t == nil {
@@ -56,8 +56,22 @@ func (t *FvmExecutionTrace) MarshalCBOR(w io.Writer) error {
return err
}
+ // t.GasCharges ([]vm.FvmGasCharge) (slice)
+ if len(t.GasCharges) > 1000000000 {
+ return xerrors.Errorf("Slice value in field t.GasCharges was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.GasCharges))); err != nil {
+ return err
+ }
+ for _, v := range t.GasCharges {
+ if err := v.MarshalCBOR(cw); err != nil {
+ return err
+ }
+ }
+
// t.Subcalls ([]vm.FvmExecutionTrace) (slice)
- if len(t.Subcalls) > cbg.MaxLength {
+ if len(t.Subcalls) > 1000000000 {
return xerrors.Errorf("Slice value in field t.Subcalls was too long")
}
@@ -91,7 +105,7 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) {
return fmt.Errorf("cbor input should be of type array")
}
- if extra != 4 {
+ if extra != 5 {
return fmt.Errorf("cbor input had wrong number of fields")
}
@@ -143,6 +157,35 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) {
t.Error = string(sval)
}
+ // t.GasCharges ([]vm.FvmGasCharge) (slice)
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+
+ if extra > 1000000000 {
+ return fmt.Errorf("t.GasCharges: array too large (%d)", extra)
+ }
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("expected cbor array")
+ }
+
+ if extra > 0 {
+ t.GasCharges = make([]FvmGasCharge, extra)
+ }
+
+ for i := 0; i < int(extra); i++ {
+
+ var v FvmGasCharge
+ if err := v.UnmarshalCBOR(cr); err != nil {
+ return err
+ }
+
+ t.GasCharges[i] = v
+ }
+
// t.Subcalls ([]vm.FvmExecutionTrace) (slice)
maj, extra, err = cr.ReadHeader()
@@ -150,7 +193,7 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) {
return err
}
- if extra > cbg.MaxLength {
+ if extra > 1000000000 {
return fmt.Errorf("t.Subcalls: array too large (%d)", extra)
}
@@ -174,3 +217,175 @@ func (t *FvmExecutionTrace) UnmarshalCBOR(r io.Reader) (err error) {
return nil
}
+
+var lengthBufFvmGasCharge = []byte{132}
+
+func (t *FvmGasCharge) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write(lengthBufFvmGasCharge); err != nil {
+ return err
+ }
+
+ // t.Name (string) (string)
+ if len(t.Name) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.Name was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Name))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.Name)); err != nil {
+ return err
+ }
+
+ // t.TotalGas (int64) (int64)
+ if t.TotalGas >= 0 {
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.TotalGas)); err != nil {
+ return err
+ }
+ } else {
+ if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.TotalGas-1)); err != nil {
+ return err
+ }
+ }
+
+ // t.ComputeGas (int64) (int64)
+ if t.ComputeGas >= 0 {
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.ComputeGas)); err != nil {
+ return err
+ }
+ } else {
+ if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.ComputeGas-1)); err != nil {
+ return err
+ }
+ }
+
+ // t.StorageGas (int64) (int64)
+ if t.StorageGas >= 0 {
+ if err := cw.WriteMajorTypeHeader(cbg.MajUnsignedInt, uint64(t.StorageGas)); err != nil {
+ return err
+ }
+ } else {
+ if err := cw.WriteMajorTypeHeader(cbg.MajNegativeInt, uint64(-t.StorageGas-1)); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (t *FvmGasCharge) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = FvmGasCharge{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("cbor input should be of type array")
+ }
+
+ if extra != 4 {
+ return fmt.Errorf("cbor input had wrong number of fields")
+ }
+
+ // t.Name (string) (string)
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.Name = string(sval)
+ }
+ // t.TotalGas (int64) (int64)
+ {
+ maj, extra, err := cr.ReadHeader()
+ var extraI int64
+ if err != nil {
+ return err
+ }
+ switch maj {
+ case cbg.MajUnsignedInt:
+ extraI = int64(extra)
+ if extraI < 0 {
+ return fmt.Errorf("int64 positive overflow")
+ }
+ case cbg.MajNegativeInt:
+ extraI = int64(extra)
+ if extraI < 0 {
+ return fmt.Errorf("int64 negative oveflow")
+ }
+ extraI = -1 - extraI
+ default:
+ return fmt.Errorf("wrong type for int64 field: %d", maj)
+ }
+
+ t.TotalGas = int64(extraI)
+ }
+ // t.ComputeGas (int64) (int64)
+ {
+ maj, extra, err := cr.ReadHeader()
+ var extraI int64
+ if err != nil {
+ return err
+ }
+ switch maj {
+ case cbg.MajUnsignedInt:
+ extraI = int64(extra)
+ if extraI < 0 {
+ return fmt.Errorf("int64 positive overflow")
+ }
+ case cbg.MajNegativeInt:
+ extraI = int64(extra)
+ if extraI < 0 {
+ return fmt.Errorf("int64 negative oveflow")
+ }
+ extraI = -1 - extraI
+ default:
+ return fmt.Errorf("wrong type for int64 field: %d", maj)
+ }
+
+ t.ComputeGas = int64(extraI)
+ }
+ // t.StorageGas (int64) (int64)
+ {
+ maj, extra, err := cr.ReadHeader()
+ var extraI int64
+ if err != nil {
+ return err
+ }
+ switch maj {
+ case cbg.MajUnsignedInt:
+ extraI = int64(extra)
+ if extraI < 0 {
+ return fmt.Errorf("int64 positive overflow")
+ }
+ case cbg.MajNegativeInt:
+ extraI = int64(extra)
+ if extraI < 0 {
+ return fmt.Errorf("int64 negative oveflow")
+ }
+ extraI = -1 - extraI
+ default:
+ return fmt.Errorf("wrong type for int64 field: %d", maj)
+ }
+
+ t.StorageGas = int64(extraI)
+ }
+ return nil
+}
diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go
index 7ae6bf203..b229c826c 100644
--- a/chain/vm/fvm.go
+++ b/chain/vm/fvm.go
@@ -21,6 +21,7 @@ import (
ffi_cgo "github.com/filecoin-project/filecoin-ffi/cgo"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/lotus/blockstore"
@@ -38,23 +39,30 @@ import (
var _ Interface = (*FVM)(nil)
var _ ffi_cgo.Externs = (*FvmExtern)(nil)
-var debugBundleV8path = os.Getenv("LOTUS_FVM_DEBUG_BUNDLE_V8")
type FvmExtern struct {
Rand
blockstore.Blockstore
epoch abi.ChainEpoch
lbState LookbackStateGetter
+ tsGet TipSetGetter
base cid.Cid
}
+type FvmGasCharge struct {
+ Name string
+ TotalGas int64
+ ComputeGas int64
+ StorageGas int64
+}
+
// This may eventually become identical to ExecutionTrace, but we can make incremental progress towards that
type FvmExecutionTrace struct {
- Msg *types.Message
- MsgRct *types.MessageReceipt
- Error string
-
- Subcalls []FvmExecutionTrace
+ Msg *types.Message
+ MsgRct *types.MessageReceipt
+ Error string
+ GasCharges []FvmGasCharge `cborgen:"maxlen=1000000000"`
+ Subcalls []FvmExecutionTrace `cborgen:"maxlen=1000000000"`
}
func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace {
@@ -69,6 +77,18 @@ func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace {
Subcalls: nil, // Should be nil when there are no subcalls for backwards compatibility
}
+ if len(t.GasCharges) > 0 {
+ ret.GasCharges = make([]*types.GasTrace, len(t.GasCharges))
+ for i, v := range t.GasCharges {
+ ret.GasCharges[i] = &types.GasTrace{
+ Name: v.Name,
+ TotalGas: v.TotalGas,
+ ComputeGas: v.ComputeGas,
+ StorageGas: v.StorageGas,
+ }
+ }
+ }
+
if len(t.Subcalls) > 0 {
ret.Subcalls = make([]types.ExecutionTrace, len(t.Subcalls))
@@ -80,6 +100,14 @@ func (t *FvmExecutionTrace) ToExecutionTrace() types.ExecutionTrace {
return ret
}
+func (x *FvmExtern) TipsetCid(ctx context.Context, epoch abi.ChainEpoch) (cid.Cid, error) {
+ tsk, err := x.tsGet(ctx, epoch)
+ if err != nil {
+ return cid.Undef, err
+ }
+ return tsk.Cid()
+}
+
// VerifyConsensusFault is similar to the one in syscalls.go used by the Lotus VM, except it never errors
// Errors are logged and "no fault" is returned, which is functionally what go-actors does anyway
func (x *FvmExtern) VerifyConsensusFault(ctx context.Context, a, b, extra []byte) (*ffi_cgo.ConsensusFault, int64) {
@@ -275,6 +303,7 @@ func defaultFVMOpts(ctx context.Context, opts *VMOpts) (*ffi.FVMOpts, error) {
Rand: opts.Rand,
Blockstore: opts.Bstore,
lbState: opts.LookbackState,
+ tsGet: opts.TipSetGetter,
base: opts.StateBase,
epoch: opts.Epoch,
},
@@ -295,7 +324,7 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) {
}
if os.Getenv("LOTUS_USE_FVM_CUSTOM_BUNDLE") == "1" {
- av, err := actors.VersionForNetwork(opts.NetworkVersion)
+ av, err := actorstypes.VersionForNetwork(opts.NetworkVersion)
if err != nil {
return nil, xerrors.Errorf("mapping network version to actors version: %w", err)
}
@@ -311,7 +340,7 @@ func NewFVM(ctx context.Context, opts *VMOpts) (*FVM, error) {
fvm, err := ffi.CreateFVM(fvmOpts)
if err != nil {
- return nil, err
+ return nil, xerrors.Errorf("failed to create FVM: %w", err)
}
return &FVM{
@@ -364,10 +393,15 @@ func NewDebugFVM(ctx context.Context, opts *VMOpts) (*FVM, error) {
return xerrors.Errorf("loading debug manifest: %w", err)
}
+ av, err := actorstypes.VersionForNetwork(opts.NetworkVersion)
+ if err != nil {
+ return xerrors.Errorf("getting actors version: %w", err)
+ }
+
// create actor redirect mapping
actorRedirect := make(map[cid.Cid]cid.Cid)
- for _, key := range actors.GetBuiltinActorsKeys() {
- from, ok := actors.GetActorCodeID(actors.Version8, key)
+ for _, key := range actors.GetBuiltinActorsKeys(av) {
+ from, ok := actors.GetActorCodeID(av, key)
if !ok {
log.Warnf("actor missing in the from manifest %s", key)
continue
@@ -393,17 +427,15 @@ func NewDebugFVM(ctx context.Context, opts *VMOpts) (*FVM, error) {
return nil
}
- av, err := actors.VersionForNetwork(opts.NetworkVersion)
+ av, err := actorstypes.VersionForNetwork(opts.NetworkVersion)
if err != nil {
return nil, xerrors.Errorf("error determining actors version for network version %d: %w", opts.NetworkVersion, err)
}
- switch av {
- case actors.Version8:
- if debugBundleV8path != "" {
- if err := createMapping(debugBundleV8path); err != nil {
- log.Errorf("failed to create v8 debug mapping")
- }
+ debugBundlePath := os.Getenv(fmt.Sprintf("LOTUS_FVM_DEBUG_BUNDLE_V%d", av))
+ if debugBundlePath != "" {
+ if err := createMapping(debugBundlePath); err != nil {
+ log.Errorf("failed to create v%d debug mapping", av)
}
}
diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go
index ad04639e5..bcd81995f 100644
--- a/chain/vm/invoker.go
+++ b/chain/vm/invoker.go
@@ -5,17 +5,16 @@ import (
"encoding/hex"
"fmt"
"reflect"
- "runtime"
- "strings"
"github.com/ipfs/go-cid"
cbg "github.com/whyrusleeping/cbor-gen"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ builtinst "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
- rtt "github.com/filecoin-project/go-state-types/rt"
vmr "github.com/filecoin-project/specs-actors/v7/actors/runtime"
"github.com/filecoin-project/lotus/chain/actors"
@@ -38,27 +37,27 @@ type ActorRegistry struct {
}
// An ActorPredicate returns an error if the given actor is not valid for the given runtime environment (e.g., chain height, version, etc.).
-type ActorPredicate func(vmr.Runtime, rtt.VMActor) error
+type ActorPredicate func(vmr.Runtime, cid.Cid) error
-func ActorsVersionPredicate(ver actors.Version) ActorPredicate {
- return func(rt vmr.Runtime, v rtt.VMActor) error {
- aver, err := actors.VersionForNetwork(rt.NetworkVersion())
+func ActorsVersionPredicate(ver actorstypes.Version) ActorPredicate {
+ return func(rt vmr.Runtime, codeCid cid.Cid) error {
+ aver, err := actorstypes.VersionForNetwork(rt.NetworkVersion())
if err != nil {
return xerrors.Errorf("unsupported network version: %w", err)
}
if aver != ver {
- return xerrors.Errorf("actor %s is a version %d actor; chain only supports actor version %d at height %d and nver %d", v.Code(), ver, aver, rt.CurrEpoch(), rt.NetworkVersion())
+ return xerrors.Errorf("actor %s is a version %d actor; chain only supports actor version %d at height %d and nver %d", codeCid, ver, aver, rt.CurrEpoch(), rt.NetworkVersion())
}
return nil
}
}
type invokeFunc func(rt vmr.Runtime, params []byte) ([]byte, aerrors.ActorError)
-type nativeCode []invokeFunc
+type nativeCode map[uint64]invokeFunc
type actorInfo struct {
methods nativeCode
- vmActor rtt.VMActor
+ vmActor builtin.RegistryEntry
// TODO: consider making this a network version range?
predicate ActorPredicate
}
@@ -76,25 +75,30 @@ func (ar *ActorRegistry) Invoke(codeCid cid.Cid, rt vmr.Runtime, method abi.Meth
log.Errorf("no code for actor %s (Addr: %s)", codeCid, rt.Receiver())
return nil, aerrors.Newf(exitcode.SysErrorIllegalActor, "no code for actor %s(%d)(%s)", codeCid, method, hex.EncodeToString(params))
}
- if err := act.predicate(rt, act.vmActor); err != nil {
+ if err := act.predicate(rt, codeCid); err != nil {
return nil, aerrors.Newf(exitcode.SysErrorIllegalActor, "unsupported actor: %s", err)
}
- if method >= abi.MethodNum(len(act.methods)) || act.methods[method] == nil {
+ if act.methods[uint64(method)] == nil {
return nil, aerrors.Newf(exitcode.SysErrInvalidMethod, "no method %d on actor", method)
}
- return act.methods[method](rt, params)
+ return act.methods[uint64(method)](rt, params)
}
-func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmactors ...rtt.VMActor) {
+func (ar *ActorRegistry) Register(av actorstypes.Version, pred ActorPredicate, vmactors []builtin.RegistryEntry) {
if pred == nil {
- pred = func(vmr.Runtime, rtt.VMActor) error { return nil }
+ pred = func(vmr.Runtime, cid.Cid) error { return nil }
}
for _, a := range vmactors {
- // register in the `actors` map (for the invoker)
- code, err := ar.transform(a)
- if err != nil {
- panic(xerrors.Errorf("%s: %w", string(a.Code().Hash()), err))
+
+ var code nativeCode
+ var err error
+ if av <= actorstypes.Version7 {
+ // register in the `actors` map (for the invoker)
+ code, err = ar.transform(a)
+ if err != nil {
+ panic(xerrors.Errorf("%s: %w", string(a.Code().Hash()), err))
+ }
}
ai := &actorInfo{
@@ -108,7 +112,7 @@ func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmacto
// necessary to make stuff work
var realCode cid.Cid
- if av >= actors.Version8 {
+ if av >= actorstypes.Version8 {
name := actors.CanonicalName(builtin.ActorNameByCode(ac))
var ok bool
@@ -132,34 +136,27 @@ func (ar *ActorRegistry) Register(av actors.Version, pred ActorPredicate, vmacto
// Iterate over exported methods. Some of these _may_ be nil and
// must be skipped.
for number, export := range exports {
- if export == nil {
+ if export.Method == nil {
continue
}
- ev := reflect.ValueOf(export)
+ ev := reflect.ValueOf(export.Method)
et := ev.Type()
- // Extract the method names using reflection. These
- // method names always match the field names in the
- // `builtin.Method*` structs (tested in the specs-actors
- // tests).
- fnName := runtime.FuncForPC(ev.Pointer()).Name()
- fnName = strings.TrimSuffix(fnName[strings.LastIndexByte(fnName, '.')+1:], "-fm")
-
- switch abi.MethodNum(number) {
- case builtin.MethodSend:
- panic("method 0 is reserved for Send")
- case builtin.MethodConstructor:
- if fnName != "Constructor" {
- panic("method 1 is reserved for Constructor")
- }
+ mm := MethodMeta{
+ Name: export.Name,
+ Ret: et.Out(0),
}
- methods[abi.MethodNum(number)] = MethodMeta{
- Name: fnName,
- Params: et.In(1),
- Ret: et.Out(0),
+ if av <= actorstypes.Version7 {
+ // methods exported from specs-actors have the runtime as the first param, so we want et.In(1)
+ mm.Params = et.In(1)
+ } else {
+ // methods exported from go-state-types do not, so we want et.In(0)
+ mm.Params = et.In(0)
}
+
+ methods[abi.MethodNum(number)] = mm
}
if realCode.Defined() {
ar.Methods[realCode] = methods
@@ -175,13 +172,10 @@ func (ar *ActorRegistry) Create(codeCid cid.Cid, rt vmr.Runtime) (*types.Actor,
return nil, aerrors.Newf(exitcode.SysErrorIllegalArgument, "Can only create built-in actors.")
}
- if err := act.predicate(rt, act.vmActor); err != nil {
+ if err := act.predicate(rt, codeCid); err != nil {
return nil, aerrors.Newf(exitcode.SysErrorIllegalArgument, "Cannot create actor: %w", err)
}
- if rtt.IsSingletonActor(act.vmActor) {
- return nil, aerrors.Newf(exitcode.SysErrorIllegalArgument, "Can only have one instance of singleton actors.")
- }
return &types.Actor{
Code: codeCid,
Head: EmptyObjectCid,
@@ -191,15 +185,16 @@ func (ar *ActorRegistry) Create(codeCid cid.Cid, rt vmr.Runtime) (*types.Actor,
}
type invokee interface {
- Exports() []interface{}
+ Exports() map[uint64]builtinst.MethodMeta
}
func (*ActorRegistry) transform(instance invokee) (nativeCode, error) {
itype := reflect.TypeOf(instance)
exports := instance.Exports()
runtimeType := reflect.TypeOf((*vmr.Runtime)(nil)).Elem()
- for i, m := range exports {
+ for i, e := range exports {
i := i
+ m := e.Method
newErr := func(format string, args ...interface{}) error {
str := fmt.Sprintf(format, args...)
return fmt.Errorf("transform(%s) export(%d): %s", itype.Name(), i, str)
@@ -235,7 +230,8 @@ func (*ActorRegistry) transform(instance invokee) (nativeCode, error) {
}
}
code := make(nativeCode, len(exports))
- for id, m := range exports {
+ for id, e := range exports {
+ m := e.Method
if m == nil {
continue
}
diff --git a/chain/vm/invoker_test.go b/chain/vm/invoker_test.go
index 5a4e1b402..d3e6dcd7f 100644
--- a/chain/vm/invoker_test.go
+++ b/chain/vm/invoker_test.go
@@ -6,6 +6,7 @@ import (
"io"
"testing"
+ cid "github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/stretchr/testify/assert"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -13,15 +14,28 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
+ cbor2 "github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
+ "github.com/filecoin-project/go-state-types/rt"
runtime2 "github.com/filecoin-project/specs-actors/v2/actors/runtime"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/aerrors"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
)
type basicContract struct{}
+
+func (b basicContract) Code() cid.Cid {
+ return cid.Undef
+}
+
+func (b basicContract) State() cbor2.Er {
+ // works well enough as a dummy state
+ return new(basicParams)
+}
+
type basicParams struct {
B byte
}
@@ -107,7 +121,8 @@ func (*basicRtMessage) ValueReceived() abi.TokenAmount {
func TestInvokerBasic(t *testing.T) {
//stm: @INVOKER_TRANSFORM_001
inv := ActorRegistry{}
- code, err := inv.transform(basicContract{})
+ registry := builtin.MakeRegistryLegacy([]rt.VMActor{basicContract{}})
+ code, err := inv.transform(registry[0])
assert.NoError(t, err)
{
diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go
index 7e27ee811..b33085c05 100644
--- a/chain/vm/mkactor.go
+++ b/chain/vm/mkactor.go
@@ -7,6 +7,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
@@ -53,7 +54,7 @@ func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, add
return nil, address.Undef, aerrors.Escalate(err, "registering actor address")
}
- av, err := actors.VersionForNetwork(rt.NetworkVersion())
+ av, err := actorstypes.VersionForNetwork(rt.NetworkVersion())
if err != nil {
return nil, address.Undef, aerrors.Escalate(err, "unsupported network version")
}
@@ -85,10 +86,10 @@ func TryCreateAccountActor(rt *Runtime, addr address.Address) (*types.Actor, add
return act, addrID, nil
}
-func makeAccountActor(ver actors.Version, addr address.Address) (*types.Actor, aerrors.ActorError) {
+func makeAccountActor(ver actorstypes.Version, addr address.Address) (*types.Actor, aerrors.ActorError) {
switch addr.Protocol() {
case address.BLS, address.SECP256K1:
- return newAccountActor(ver), nil
+ return newAccountActor(ver, addr), nil
case address.ID:
return nil, aerrors.Newf(exitcode.SysErrInvalidReceiver, "no actor with given ID: %s", addr)
case address.Actor:
@@ -98,23 +99,23 @@ func makeAccountActor(ver actors.Version, addr address.Address) (*types.Actor, a
}
}
-func newAccountActor(ver actors.Version) *types.Actor {
+func newAccountActor(ver actorstypes.Version, addr address.Address) *types.Actor {
// TODO: ActorsUpgrade use a global actor registry?
var code cid.Cid
switch ver {
- case actors.Version0:
+ case actorstypes.Version0:
code = builtin0.AccountActorCodeID
- case actors.Version2:
+ case actorstypes.Version2:
code = builtin2.AccountActorCodeID
- case actors.Version3:
+ case actorstypes.Version3:
code = builtin3.AccountActorCodeID
- case actors.Version4:
+ case actorstypes.Version4:
code = builtin4.AccountActorCodeID
- case actors.Version5:
+ case actorstypes.Version5:
code = builtin5.AccountActorCodeID
- case actors.Version6:
+ case actorstypes.Version6:
code = builtin6.AccountActorCodeID
- case actors.Version7:
+ case actorstypes.Version7:
code = builtin7.AccountActorCodeID
default:
panic("unsupported actors version")
@@ -123,6 +124,7 @@ func newAccountActor(ver actors.Version) *types.Actor {
Code: code,
Balance: types.NewInt(0),
Head: EmptyObjectCid,
+ Address: &addr,
}
return nact
diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go
index ce9349a1d..05f8de2f0 100644
--- a/chain/vm/runtime.go
+++ b/chain/vm/runtime.go
@@ -16,6 +16,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
@@ -373,7 +374,7 @@ func (rt *Runtime) ValidateImmediateCallerType(ts ...cid.Cid) {
// this really only for genesis in tests; nv16 will be running on FVM anyway.
if nv := rt.NetworkVersion(); nv >= network.Version16 {
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
panic(aerrors.Fatalf("failed to get actors version for network version %d", nv))
}
diff --git a/chain/vm/syscalls.go b/chain/vm/syscalls.go
index 757453887..f6adc8940 100644
--- a/chain/vm/syscalls.go
+++ b/chain/vm/syscalls.go
@@ -105,10 +105,20 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime7.Conse
return nil, xerrors.Errorf("cannot decode first block header: %w", decodeErr)
}
+ // A _valid_ block must use an ID address, but that's not what we're checking here. We're
+ // just making sure that adding additional address protocols won't lead to consensus issues.
+ if !abi.AddressValidForNetworkVersion(blockA.Miner, ss.networkVersion) {
+ return nil, xerrors.Errorf("address protocol unsupported in current network version: %d", blockA.Miner.Protocol())
+ }
+
if decodeErr := blockB.UnmarshalCBOR(bytes.NewReader(b)); decodeErr != nil {
return nil, xerrors.Errorf("cannot decode second block header: %f", decodeErr)
}
+ if !abi.AddressValidForNetworkVersion(blockB.Miner, ss.networkVersion) {
+ return nil, xerrors.Errorf("address protocol unsupported in current network version: %d", blockB.Miner.Protocol())
+ }
+
// workaround chain halt
if build.IsNearUpgrade(blockA.Height, build.UpgradeOrangeHeight) {
return nil, xerrors.Errorf("consensus reporting disabled around Upgrade Orange")
@@ -170,6 +180,10 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime7.Conse
return nil, xerrors.Errorf("cannot decode extra: %w", decodeErr)
}
+ if !abi.AddressValidForNetworkVersion(blockC.Miner, ss.networkVersion) {
+ return nil, xerrors.Errorf("address protocol unsupported in current network version: %d", blockC.Miner.Protocol())
+ }
+
if types.CidArrsEqual(blockA.Parents, blockC.Parents) && blockA.Height == blockC.Height &&
types.CidArrsContains(blockB.Parents, blockC.Cid()) && !types.CidArrsContains(blockB.Parents, blockA.Cid()) {
consensusFault = &runtime7.ConsensusFault{
diff --git a/chain/vm/vm.go b/chain/vm/vm.go
index c5b47fd10..ecd87caf0 100644
--- a/chain/vm/vm.go
+++ b/chain/vm/vm.go
@@ -192,6 +192,7 @@ type (
CircSupplyCalculator func(context.Context, abi.ChainEpoch, *state.StateTree) (abi.TokenAmount, error)
NtwkVersionGetter func(context.Context, abi.ChainEpoch) network.Version
LookbackStateGetter func(context.Context, abi.ChainEpoch) (*state.StateTree, error)
+ TipSetGetter func(context.Context, abi.ChainEpoch) (types.TipSetKey, error)
)
var _ Interface = (*LegacyVM)(nil)
@@ -223,10 +224,15 @@ type VMOpts struct {
NetworkVersion network.Version
BaseFee abi.TokenAmount
LookbackState LookbackStateGetter
+ TipSetGetter TipSetGetter
Tracing bool
}
func NewLegacyVM(ctx context.Context, opts *VMOpts) (*LegacyVM, error) {
+ if opts.NetworkVersion >= network.Version16 {
+ return nil, xerrors.Errorf("the legacy VM does not support network versions 16+")
+ }
+
buf := blockstore.NewBuffered(opts.Bstore)
cst := cbor.NewCborStore(buf)
state, err := state.LoadStateTree(cst, opts.StateBase)
diff --git a/cli/backup.go b/cli/backup.go
index 4d88d4bbc..83234a423 100644
--- a/cli/backup.go
+++ b/cli/backup.go
@@ -114,8 +114,8 @@ this command must be within this base path`,
},
ArgsUsage: "[backup file path]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("expected 1 argument")
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
if cctx.Bool("offline") {
diff --git a/cli/chain.go b/cli/chain.go
index 48fbb849d..9270c990b 100644
--- a/cli/chain.go
+++ b/cli/chain.go
@@ -62,6 +62,7 @@ var ChainCmd = &cli.Command{
ChainDecodeCmd,
ChainEncodeCmd,
ChainDisputeSetCmd,
+ ChainPruneCmd,
},
}
@@ -946,8 +947,8 @@ var ChainBisectCmd = &cli.Command{
defer closer()
ctx := ReqContext(cctx)
- if cctx.Args().Len() < 4 {
- return xerrors.New("need at least 4 args")
+ if cctx.NArg() < 4 {
+ return IncorrectNumArgs(cctx)
}
start, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -1312,8 +1313,8 @@ var chainDecodeParamsCmd = &cli.Command{
defer closer()
ctx := ReqContext(cctx)
- if cctx.Args().Len() != 3 {
- return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments"))
+ if cctx.NArg() != 3 {
+ return IncorrectNumArgs(cctx)
}
to, err := address.NewFromString(cctx.Args().First())
@@ -1391,8 +1392,8 @@ var chainEncodeParamsCmd = &cli.Command{
Action: func(cctx *cli.Context) error {
afmt := NewAppFmt(cctx.App)
- if cctx.Args().Len() != 3 {
- return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments"))
+ if cctx.NArg() != 3 {
+ return IncorrectNumArgs(cctx)
}
method, err := strconv.ParseInt(cctx.Args().Get(1), 10, 64)
@@ -1477,11 +1478,6 @@ var ChainPruneCmd = &cli.Command{
Value: false,
Usage: "use moving gc for garbage collecting the coldstore",
},
- &cli.StringFlag{
- Name: "move-to",
- Value: "",
- Usage: "specify new path for coldstore during moving gc",
- },
&cli.IntFlag{
Name: "retention",
Value: -1,
diff --git a/cli/client.go b/cli/client.go
index 5f2342b2b..1c41262a5 100644
--- a/cli/client.go
+++ b/cli/client.go
@@ -130,7 +130,7 @@ var clientImportCmd = &cli.Command{
ctx := ReqContext(cctx)
if cctx.NArg() != 1 {
- return xerrors.New("expected input path as the only arg")
+ return IncorrectNumArgs(cctx)
}
absPath, err := filepath.Abs(cctx.Args().First())
@@ -212,8 +212,8 @@ var clientCommPCmd = &cli.Command{
defer closer()
ctx := ReqContext(cctx)
- if cctx.Args().Len() != 1 {
- return fmt.Errorf("usage: commP ")
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
ret, err := api.ClientCalcCommP(ctx, cctx.Args().Get(0))
@@ -245,8 +245,8 @@ var clientCarGenCmd = &cli.Command{
defer closer()
ctx := ReqContext(cctx)
- if cctx.Args().Len() != 2 {
- return fmt.Errorf("usage: generate-car ")
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
ref := lapi.FileRef{
@@ -376,7 +376,7 @@ The minimum value is 518400 (6 months).`,
afmt := NewAppFmt(cctx.App)
if cctx.NArg() != 4 {
- return xerrors.New(expectedArgsMsg)
+ return IncorrectNumArgs(cctx)
}
// [data, miner, price, dur]
@@ -627,7 +627,13 @@ uiLoop:
minDealDurationDays := uint64(build.MinDealDuration) / (builtin.SecondsInDay / build.BlockDelaySecs)
if days < int(minDealDurationDays) {
- printErr(xerrors.Errorf("minimum duration is %d days", minDealDurationDays))
+ printErr(xerrors.Errorf("minimum duration is %d days, got %d", minDealDurationDays, days))
+ continue
+ }
+
+ maxDealDurationDays := uint64(build.MaxDealDuration) / (builtin.SecondsInDay / build.BlockDelaySecs)
+ if days > int(maxDealDurationDays) {
+ printErr(xerrors.Errorf("maximum duration is %d days, got %d", maxDealDurationDays, days))
continue
}
diff --git a/cli/client_retr.go b/cli/client_retr.go
index f32e5d4e4..b619a2871 100644
--- a/cli/client_retr.go
+++ b/cli/client_retr.go
@@ -3,14 +3,9 @@ package cli
import (
"bytes"
"context"
- "encoding/json"
"fmt"
"io"
- "io/ioutil"
- "net/http"
- "net/url"
"os"
- "path"
"sort"
"strings"
"time"
@@ -29,8 +24,6 @@ import (
"github.com/ipld/go-ipld-prime/traversal/selector/builder"
selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse"
textselector "github.com/ipld/go-ipld-selector-text-lite"
- "github.com/multiformats/go-multiaddr"
- manet "github.com/multiformats/go-multiaddr/net"
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"
@@ -40,6 +33,7 @@ import (
lapi "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/types"
+ cliutil "github.com/filecoin-project/lotus/cli/util"
"github.com/filecoin-project/lotus/markets/utils"
"github.com/filecoin-project/lotus/node/repo"
)
@@ -181,12 +175,14 @@ func retrieve(ctx context.Context, cctx *cli.Context, fapi lapi.FullNode, sel *l
event = retrievalmarket.ClientEvents[*evt.Event]
}
- printf("Recv %s, Paid %s, %s (%s), %s\n",
+ printf("Recv %s, Paid %s, %s (%s), %s [%d|%d]\n",
types.SizeStr(types.NewInt(evt.BytesReceived)),
types.FIL(evt.TotalPaid),
strings.TrimPrefix(event, "ClientEvent"),
strings.TrimPrefix(retrievalmarket.DealStatuses[evt.Status], "DealStatus"),
time.Now().Sub(start).Truncate(time.Millisecond),
+ evt.ID,
+ types.NewInt(evt.BytesReceived),
)
switch evt.Status {
@@ -289,7 +285,7 @@ Examples:
}, retrFlagsCommon...),
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 2 {
- return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments"))
+ return IncorrectNumArgs(cctx)
}
if cctx.Bool("car-export-merkle-proof") {
@@ -335,60 +331,6 @@ Examples:
},
}
-func ClientExportStream(apiAddr string, apiAuth http.Header, eref lapi.ExportRef, car bool) (io.ReadCloser, error) {
- rj, err := json.Marshal(eref)
- if err != nil {
- return nil, xerrors.Errorf("marshaling export ref: %w", err)
- }
-
- ma, err := multiaddr.NewMultiaddr(apiAddr)
- if err == nil {
- _, addr, err := manet.DialArgs(ma)
- if err != nil {
- return nil, err
- }
-
- // todo: make cliutil helpers for this
- apiAddr = "http://" + addr
- }
-
- aa, err := url.Parse(apiAddr)
- if err != nil {
- return nil, xerrors.Errorf("parsing api address: %w", err)
- }
- switch aa.Scheme {
- case "ws":
- aa.Scheme = "http"
- case "wss":
- aa.Scheme = "https"
- }
-
- aa.Path = path.Join(aa.Path, "rest/v0/export")
- req, err := http.NewRequest("GET", fmt.Sprintf("%s?car=%t&export=%s", aa, car, url.QueryEscape(string(rj))), nil)
- if err != nil {
- return nil, err
- }
-
- req.Header = apiAuth
-
- resp, err := http.DefaultClient.Do(req)
- if err != nil {
- return nil, err
- }
-
- if resp.StatusCode != http.StatusOK {
- em, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return nil, xerrors.Errorf("reading error body: %w", err)
- }
-
- resp.Body.Close() // nolint
- return nil, xerrors.Errorf("getting root car: http %d: %s", resp.StatusCode, string(em))
- }
-
- return resp.Body, nil
-}
-
var clientRetrieveCatCmd = &cli.Command{
Name: "cat",
Usage: "Show data from network",
@@ -405,7 +347,7 @@ var clientRetrieveCatCmd = &cli.Command{
}, retrFlagsCommon...),
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 1 {
- return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments"))
+ return IncorrectNumArgs(cctx)
}
ainfo, err := GetAPIInfo(cctx, repo.FullNode)
@@ -438,7 +380,7 @@ var clientRetrieveCatCmd = &cli.Command{
eref.DAGs = append(eref.DAGs, lapi.DagSpec{DataSelector: &sel})
}
- rc, err := ClientExportStream(ainfo.Addr, ainfo.AuthHeader(), *eref, false)
+ rc, err := cliutil.ClientExportStream(ainfo.Addr, ainfo.AuthHeader(), *eref, false)
if err != nil {
return err
}
@@ -484,7 +426,7 @@ var clientRetrieveLsCmd = &cli.Command{
}, retrFlagsCommon...),
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 1 {
- return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments"))
+ return IncorrectNumArgs(cctx)
}
ainfo, err := GetAPIInfo(cctx, repo.FullNode)
@@ -526,7 +468,7 @@ var clientRetrieveLsCmd = &cli.Command{
DataSelector: &dataSelector,
})
- rc, err := ClientExportStream(ainfo.Addr, ainfo.AuthHeader(), *eref, true)
+ rc, err := cliutil.ClientExportStream(ainfo.Addr, ainfo.AuthHeader(), *eref, true)
if err != nil {
return xerrors.Errorf("export: %w", err)
}
@@ -581,6 +523,7 @@ var clientRetrieveLsCmd = &cli.Command{
dserv,
roots[0],
sel,
+ nil,
func(p traversal.Progress, n ipld.Node, r traversal.VisitReason) error {
if r == traversal.VisitReason_SelectionMatch {
fmt.Println(p.Path)
diff --git a/cli/filplus.go b/cli/filplus.go
index 5374a9f40..0e81ccd3e 100644
--- a/cli/filplus.go
+++ b/cli/filplus.go
@@ -5,6 +5,8 @@ import (
"context"
"encoding/hex"
"fmt"
+ "os"
+ "strconv"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/urfave/cli/v2"
@@ -12,16 +14,21 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
- verifregtypes "github.com/filecoin-project/go-state-types/builtin/v8/verifreg"
+ verifregtypes8 "github.com/filecoin-project/go-state-types/builtin/v8/verifreg"
+ verifregtypes9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+ "github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/api/v0api"
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/datacap"
"github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
"github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/lib/tablewriter"
)
var filplusCmd = &cli.Command{
@@ -35,12 +42,15 @@ var filplusCmd = &cli.Command{
filplusCheckClientCmd,
filplusCheckNotaryCmd,
filplusSignRemoveDataCapProposal,
+ filplusListAllocationsCmd,
+ filplusRemoveExpiredAllocationsCmd,
},
}
var filplusVerifyClientCmd = &cli.Command{
- Name: "grant-datacap",
- Usage: "give allowance to the specified verified client address",
+ Name: "grant-datacap",
+ Usage: "give allowance to the specified verified client address",
+ ArgsUsage: "[clientAddress datacap]",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "from",
@@ -59,8 +69,8 @@ var filplusVerifyClientCmd = &cli.Command{
return err
}
- if cctx.Args().Len() != 2 {
- return fmt.Errorf("must specify two arguments: address and allowance")
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
target, err := address.NewFromString(cctx.Args().Get(0))
@@ -94,7 +104,7 @@ var filplusVerifyClientCmd = &cli.Command{
}
// TODO: This should be abstracted over actor versions
- params, err := actors.SerializeParams(&verifregtypes.AddVerifiedClientParams{Address: target, Allowance: allowance})
+ params, err := actors.SerializeParams(&verifregtypes9.AddVerifiedClientParams{Address: target, Allowance: allowance})
if err != nil {
return err
}
@@ -118,7 +128,7 @@ var filplusVerifyClientCmd = &cli.Command{
return err
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("failed to add verified client: %d", mwait.Receipt.ExitCode)
}
@@ -130,6 +140,10 @@ var filplusListNotariesCmd = &cli.Command{
Name: "list-notaries",
Usage: "list all notaries",
Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 0 {
+ return IncorrectNumArgs(cctx)
+ }
+
api, closer, err := GetFullNodeAPI(cctx)
if err != nil {
return err
@@ -160,6 +174,10 @@ var filplusListClientsCmd = &cli.Command{
Name: "list-clients",
Usage: "list all verified clients",
Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 0 {
+ return IncorrectNumArgs(cctx)
+ }
+
api, closer, err := GetFullNodeAPI(cctx)
if err != nil {
return err
@@ -167,15 +185,40 @@ var filplusListClientsCmd = &cli.Command{
defer closer()
ctx := ReqContext(cctx)
- act, err := api.StateGetActor(ctx, verifreg.Address, types.EmptyTSK)
+ apibs := blockstore.NewAPIBlockstore(api)
+ store := adt.WrapStore(ctx, cbor.NewCborStore(apibs))
+
+ nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK)
if err != nil {
return err
}
- apibs := blockstore.NewAPIBlockstore(api)
- store := adt.WrapStore(ctx, cbor.NewCborStore(apibs))
+ av, err := actorstypes.VersionForNetwork(nv)
+ if err != nil {
+ return err
+ }
- st, err := verifreg.Load(store, act)
+ if av <= 8 {
+ act, err := api.StateGetActor(ctx, verifreg.Address, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ st, err := verifreg.Load(store, act)
+ if err != nil {
+ return err
+ }
+ return st.ForEachClient(func(addr address.Address, dcap abi.StoragePower) error {
+ _, err := fmt.Printf("%s: %s\n", addr, dcap)
+ return err
+ })
+ }
+ act, err := api.StateGetActor(ctx, datacap.Address, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ st, err := datacap.Load(store, act)
if err != nil {
return err
}
@@ -186,11 +229,186 @@ var filplusListClientsCmd = &cli.Command{
},
}
-var filplusCheckClientCmd = &cli.Command{
- Name: "check-client-datacap",
- Usage: "check verified client remaining bytes",
+var filplusListAllocationsCmd = &cli.Command{
+ Name: "list-allocations",
+ Usage: "List allocations made by client",
+ ArgsUsage: "clientAddress",
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "expired",
+ Usage: "list only expired allocations",
+ },
+ },
Action: func(cctx *cli.Context) error {
- if !cctx.Args().Present() {
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
+ }
+
+ api, closer, err := GetFullNodeAPI(cctx)
+ if err != nil {
+ return err
+ }
+ defer closer()
+ ctx := ReqContext(cctx)
+
+ clientAddr, err := address.NewFromString(cctx.Args().Get(0))
+ if err != nil {
+ return err
+ }
+
+ clientIdAddr, err := api.StateLookupID(ctx, clientAddr, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ store := adt.WrapStore(ctx, cbor.NewCborStore(blockstore.NewAPIBlockstore(api)))
+
+ verifregActor, err := api.StateGetActor(ctx, verifreg.Address, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ verifregState, err := verifreg.Load(store, verifregActor)
+ if err != nil {
+ return err
+ }
+
+ ts, err := api.ChainHead(ctx)
+ if err != nil {
+ return err
+ }
+
+ allocationsMap, err := verifregState.GetAllocations(clientIdAddr)
+ if err != nil {
+ return err
+ }
+
+ tw := tablewriter.New(
+ tablewriter.Col("ID"),
+ tablewriter.Col("Provider"),
+ tablewriter.Col("Data"),
+ tablewriter.Col("Size"),
+ tablewriter.Col("TermMin"),
+ tablewriter.Col("TermMax"),
+ tablewriter.Col("Expiration"),
+ )
+
+ for allocationId, allocation := range allocationsMap {
+ if ts.Height() > allocation.Expiration || !cctx.IsSet("expired") {
+ tw.Write(map[string]interface{}{
+ "ID": allocationId,
+ "Provider": allocation.Provider,
+ "Data": allocation.Data,
+ "Size": allocation.Size,
+ "TermMin": allocation.TermMin,
+ "TermMax": allocation.TermMax,
+ "Expiration": allocation.Expiration,
+ })
+ }
+ }
+ return tw.Flush(os.Stdout)
+ },
+}
+
+var filplusRemoveExpiredAllocationsCmd = &cli.Command{
+ Name: "remove-expired-allocations",
+ Usage: "remove expired allocations (if no allocations are specified all eligible allocations are removed)",
+ ArgsUsage: "clientAddress Optional[...allocationId]",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "from",
+ Usage: "optionally specify the account to send the message from",
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ if cctx.NArg() < 1 {
+ return IncorrectNumArgs(cctx)
+ }
+
+ api, closer, err := GetFullNodeAPI(cctx)
+ if err != nil {
+ return err
+ }
+ defer closer()
+ ctx := ReqContext(cctx)
+
+ args := cctx.Args().Slice()
+
+ clientAddr, err := address.NewFromString(args[0])
+ if err != nil {
+ return err
+ }
+
+ clientIdAddr, err := api.StateLookupID(ctx, clientAddr, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ clientId, err := address.IDFromAddress(clientIdAddr)
+ if err != nil {
+ return err
+ }
+
+ fromAddr := clientIdAddr
+ if from := cctx.String("from"); from != "" {
+ addr, err := address.NewFromString(from)
+ if err != nil {
+ return err
+ }
+
+ fromAddr = addr
+ }
+
+ allocationIDs := make([]verifregtypes9.AllocationId, len(args)-1)
+ for i, allocationString := range args[1:] {
+ id, err := strconv.ParseUint(allocationString, 10, 64)
+ if err != nil {
+ return err
+ }
+ allocationIDs[i] = verifregtypes9.AllocationId(id)
+ }
+
+ params, err := actors.SerializeParams(&verifregtypes9.RemoveExpiredAllocationsParams{
+ Client: abi.ActorID(clientId),
+ AllocationIds: allocationIDs,
+ })
+ if err != nil {
+ return err
+ }
+
+ msg := &types.Message{
+ To: verifreg.Address,
+ From: fromAddr,
+ Method: verifreg.Methods.RemoveExpiredAllocations,
+ Params: params,
+ }
+
+ smsg, err := api.MpoolPushMessage(ctx, msg, nil)
+ if err != nil {
+ return err
+ }
+
+ fmt.Printf("message sent, now waiting on cid: %s\n", smsg.Cid())
+
+ mwait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence)
+ if err != nil {
+ return err
+ }
+
+ if mwait.Receipt.ExitCode.IsError() {
+ return fmt.Errorf("failed to remove expired allocations: %d", mwait.Receipt.ExitCode)
+ }
+
+ return nil
+ },
+}
+
+var filplusCheckClientCmd = &cli.Command{
+ Name: "check-client-datacap",
+ Usage: "check verified client remaining bytes",
+ ArgsUsage: "clientAddress",
+ Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 1 {
return fmt.Errorf("must specify client address to check")
}
@@ -221,10 +439,11 @@ var filplusCheckClientCmd = &cli.Command{
}
var filplusCheckNotaryCmd = &cli.Command{
- Name: "check-notary-datacap",
- Usage: "check a notary's remaining bytes",
+ Name: "check-notary-datacap",
+ Usage: "check a notary's remaining bytes",
+ ArgsUsage: "notaryAddress",
Action: func(cctx *cli.Context) error {
- if !cctx.Args().Present() {
+ if cctx.NArg() != 1 {
return fmt.Errorf("must specify notary address to check")
}
@@ -277,8 +496,9 @@ func checkNotary(ctx context.Context, api v0api.FullNode, vaddr address.Address)
}
var filplusSignRemoveDataCapProposal = &cli.Command{
- Name: "sign-remove-data-cap-proposal",
- Usage: "allows a notary to sign a Remove Data Cap Proposal",
+ Name: "sign-remove-data-cap-proposal",
+ Usage: "allows a notary to sign a Remove Data Cap Proposal",
+ ArgsUsage: "[verifierAddress clientAddress allowanceToRemove]",
Flags: []cli.Flag{
&cli.Int64Flag{
Name: "id",
@@ -287,8 +507,8 @@ var filplusSignRemoveDataCapProposal = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 3 {
- return fmt.Errorf("must specify three arguments: notary address, client address, and allowance to remove")
+ if cctx.NArg() != 3 {
+ return IncorrectNumArgs(cctx)
}
api, closer, err := GetFullNodeAPI(cctx)
@@ -334,7 +554,7 @@ var filplusSignRemoveDataCapProposal = &cli.Command{
return err
}
- _, dataCap, err := st.VerifiedClientDataCap(clientIdAddr)
+ dataCap, err := api.StateVerifiedClientStatus(ctx, clientIdAddr, types.EmptyTSK)
if err != nil {
return xerrors.Errorf("failed to find verified client data cap: %w", err)
}
@@ -359,15 +579,30 @@ var filplusSignRemoveDataCapProposal = &cli.Command{
}
}
- params := verifregtypes.RemoveDataCapProposal{
- RemovalProposalID: id,
- DataCapAmount: allowanceToRemove,
- VerifiedClient: clientIdAddr,
+ nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK)
+ if err != nil {
+ return xerrors.Errorf("failed to get network version: %w", err)
}
paramBuf := new(bytes.Buffer)
- paramBuf.WriteString(verifregtypes.SignatureDomainSeparation_RemoveDataCap)
- err = params.MarshalCBOR(paramBuf)
+ paramBuf.WriteString(verifregtypes9.SignatureDomainSeparation_RemoveDataCap)
+ if nv <= network.Version16 {
+ params := verifregtypes8.RemoveDataCapProposal{
+ RemovalProposalID: id,
+ DataCapAmount: allowanceToRemove,
+ VerifiedClient: clientIdAddr,
+ }
+
+ err = params.MarshalCBOR(paramBuf)
+ } else {
+ params := verifregtypes9.RemoveDataCapProposal{
+ RemovalProposalID: verifregtypes9.RmDcProposalID{ProposalID: id},
+ DataCapAmount: allowanceToRemove,
+ VerifiedClient: clientIdAddr,
+ }
+
+ err = params.MarshalCBOR(paramBuf)
+ }
if err != nil {
return xerrors.Errorf("failed to marshall paramBuf: %w", err)
}
diff --git a/cli/helper.go b/cli/helper.go
index da236bcae..c4a61397c 100644
--- a/cli/helper.go
+++ b/cli/helper.go
@@ -31,6 +31,10 @@ func ShowHelp(cctx *ufcli.Context, err error) error {
return &PrintHelpErr{Err: err, Ctx: cctx}
}
+func IncorrectNumArgs(cctx *ufcli.Context) error {
+ return ShowHelp(cctx, fmt.Errorf("incorrect number of arguments, got %d", cctx.NArg()))
+}
+
func RunApp(app *ufcli.App) {
if err := app.Run(os.Args); err != nil {
if os.Getenv("LOTUS_DEV") != "" {
diff --git a/cli/info.go b/cli/info.go
index 0d036875a..007e3655f 100644
--- a/cli/info.go
+++ b/cli/info.go
@@ -41,7 +41,13 @@ func infoCmdAct(cctx *cli.Context) error {
return err
}
+ start, err := fullapi.StartTime(ctx)
+ if err != nil {
+ return err
+ }
+
fmt.Printf("Network: %s\n", network.NetworkName)
+ fmt.Printf("StartTime: %s (started at %s)\n", time.Now().Sub(start).Truncate(time.Second), start.Truncate(time.Second))
fmt.Print("Chain: ")
err = SyncBasefeeCheck(ctx, fullapi)
if err != nil {
diff --git a/cli/mpool.go b/cli/mpool.go
index 1410814b5..e098806cb 100644
--- a/cli/mpool.go
+++ b/cli/mpool.go
@@ -404,7 +404,7 @@ var MpoolReplaceCmd = &cli.Command{
var from address.Address
var nonce uint64
- switch cctx.Args().Len() {
+ switch cctx.NArg() {
case 1:
mcid, err := cid.Decode(cctx.Args().First())
if err != nil {
@@ -610,8 +610,8 @@ var MpoolConfig = &cli.Command{
Usage: "get or set current mpool configuration",
ArgsUsage: "[new-config]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() > 1 {
- return cli.ShowCommandHelp(cctx, cctx.Command.Name)
+ if cctx.NArg() > 1 {
+ return IncorrectNumArgs(cctx)
}
afmt := NewAppFmt(cctx.App)
@@ -624,7 +624,7 @@ var MpoolConfig = &cli.Command{
ctx := ReqContext(cctx)
- if cctx.Args().Len() == 0 {
+ if cctx.NArg() == 0 {
cfg, err := api.MpoolGetConfig(ctx)
if err != nil {
return err
diff --git a/cli/multisig.go b/cli/multisig.go
index f4b67e14d..38923a04f 100644
--- a/cli/multisig.go
+++ b/cli/multisig.go
@@ -88,8 +88,8 @@ var msigCreateCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 1 {
- return ShowHelp(cctx, fmt.Errorf("multisigs must have at least one signer"))
+ if cctx.NArg() < 1 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -167,7 +167,7 @@ var msigCreateCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "actor creation failed!")
return err
}
@@ -365,11 +365,11 @@ var msigProposeCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 3 {
+ if cctx.NArg() < 3 {
return ShowHelp(cctx, fmt.Errorf("must pass at least multisig address, destination, and value"))
}
- if cctx.Args().Len() > 3 && cctx.Args().Len() != 5 {
+ if cctx.NArg() > 3 && cctx.NArg() != 5 {
return ShowHelp(cctx, fmt.Errorf("must either pass three or five arguments"))
}
@@ -399,7 +399,7 @@ var msigProposeCmd = &cli.Command{
var method uint64
var params []byte
- if cctx.Args().Len() == 5 {
+ if cctx.NArg() == 5 {
m, err := strconv.ParseUint(cctx.Args().Get(3), 10, 64)
if err != nil {
return err
@@ -456,7 +456,7 @@ var msigProposeCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("proposal returned exit %d", wait.Receipt.ExitCode)
}
@@ -487,15 +487,15 @@ var msigApproveCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 2 {
+ if cctx.NArg() < 2 {
return ShowHelp(cctx, fmt.Errorf("must pass at least multisig address and message ID"))
}
- if cctx.Args().Len() > 2 && cctx.Args().Len() < 5 {
+ if cctx.NArg() > 2 && cctx.NArg() < 5 {
return ShowHelp(cctx, fmt.Errorf("usage: msig approve "))
}
- if cctx.Args().Len() > 5 && cctx.Args().Len() != 7 {
+ if cctx.NArg() > 5 && cctx.NArg() != 7 {
return ShowHelp(cctx, fmt.Errorf("usage: msig approve [ ]"))
}
@@ -534,7 +534,7 @@ var msigApproveCmd = &cli.Command{
}
var msgCid cid.Cid
- if cctx.Args().Len() == 2 {
+ if cctx.NArg() == 2 {
proto, err := api.MsigApprove(ctx, msig, txid, from)
if err != nil {
return err
@@ -571,7 +571,7 @@ var msigApproveCmd = &cli.Command{
var method uint64
var params []byte
- if cctx.Args().Len() == 7 {
+ if cctx.NArg() == 7 {
m, err := strconv.ParseUint(cctx.Args().Get(5), 10, 64)
if err != nil {
return err
@@ -605,7 +605,7 @@ var msigApproveCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("approve returned exit %d", wait.Receipt.ExitCode)
}
@@ -624,15 +624,15 @@ var msigCancelCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 2 {
+ if cctx.NArg() < 2 {
return ShowHelp(cctx, fmt.Errorf("must pass at least multisig address and message ID"))
}
- if cctx.Args().Len() > 2 && cctx.Args().Len() < 4 {
+ if cctx.NArg() > 2 && cctx.NArg() < 4 {
return ShowHelp(cctx, fmt.Errorf("usage: msig cancel "))
}
- if cctx.Args().Len() > 4 && cctx.Args().Len() != 6 {
+ if cctx.NArg() > 4 && cctx.NArg() != 6 {
return ShowHelp(cctx, fmt.Errorf("usage: msig cancel [ ]"))
}
@@ -671,7 +671,7 @@ var msigCancelCmd = &cli.Command{
}
var msgCid cid.Cid
- if cctx.Args().Len() == 2 {
+ if cctx.NArg() == 2 {
proto, err := api.MsigCancel(ctx, msig, txid, from)
if err != nil {
return err
@@ -696,7 +696,7 @@ var msigCancelCmd = &cli.Command{
var method uint64
var params []byte
- if cctx.Args().Len() == 6 {
+ if cctx.NArg() == 6 {
m, err := strconv.ParseUint(cctx.Args().Get(4), 10, 64)
if err != nil {
return err
@@ -730,7 +730,7 @@ var msigCancelCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("cancel returned exit %d", wait.Receipt.ExitCode)
}
@@ -753,8 +753,8 @@ var msigRemoveProposeCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address and signer address"))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -810,7 +810,7 @@ var msigRemoveProposeCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("add proposal returned exit %d", wait.Receipt.ExitCode)
}
@@ -840,8 +840,8 @@ var msigAddProposeCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address and signer address"))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -930,7 +930,7 @@ var msigAddProposeCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("add proposal returned exit %d", wait.Receipt.ExitCode)
}
@@ -949,8 +949,8 @@ var msigAddApproveCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 5 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, transaction id, new signer address, whether to increase threshold"))
+ if cctx.NArg() != 5 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1021,7 +1021,7 @@ var msigAddApproveCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("add approval returned exit %d", wait.Receipt.ExitCode)
}
@@ -1040,8 +1040,8 @@ var msigAddCancelCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 4 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, transaction id, new signer address, whether to increase threshold"))
+ if cctx.NArg() != 4 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1107,7 +1107,7 @@ var msigAddCancelCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("add cancellation returned exit %d", wait.Receipt.ExitCode)
}
@@ -1126,8 +1126,8 @@ var msigSwapProposeCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 3 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, old signer address, new signer address"))
+ if cctx.NArg() != 3 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1188,7 +1188,7 @@ var msigSwapProposeCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("swap proposal returned exit %d", wait.Receipt.ExitCode)
}
@@ -1207,8 +1207,8 @@ var msigSwapApproveCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 5 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, transaction id, old signer address, new signer address"))
+ if cctx.NArg() != 5 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1279,7 +1279,7 @@ var msigSwapApproveCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("swap approval returned exit %d", wait.Receipt.ExitCode)
}
@@ -1298,8 +1298,8 @@ var msigSwapCancelCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 4 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, transaction id, old signer address, new signer address"))
+ if cctx.NArg() != 4 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1365,7 +1365,7 @@ var msigSwapCancelCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("swap cancellation returned exit %d", wait.Receipt.ExitCode)
}
@@ -1384,8 +1384,8 @@ var msigLockProposeCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 4 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, start epoch, unlock duration, and amount"))
+ if cctx.NArg() != 4 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1461,7 +1461,7 @@ var msigLockProposeCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("lock proposal returned exit %d", wait.Receipt.ExitCode)
}
@@ -1480,8 +1480,8 @@ var msigLockApproveCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 6 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, proposer address, tx id, start epoch, unlock duration, and amount"))
+ if cctx.NArg() != 6 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1567,7 +1567,7 @@ var msigLockApproveCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("lock approval returned exit %d", wait.Receipt.ExitCode)
}
@@ -1586,8 +1586,8 @@ var msigLockCancelCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 5 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address, tx id, start epoch, unlock duration, and amount"))
+ if cctx.NArg() != 5 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1668,7 +1668,7 @@ var msigLockCancelCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("lock cancellation returned exit %d", wait.Receipt.ExitCode)
}
@@ -1693,8 +1693,8 @@ var msigVestedCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address"))
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
api, closer, err := GetFullNodeAPI(cctx)
@@ -1749,8 +1749,8 @@ var msigProposeThresholdCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass multisig address and new threshold value"))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
@@ -1814,7 +1814,7 @@ var msigProposeThresholdCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("change threshold proposal returned exit %d", wait.Receipt.ExitCode)
}
diff --git a/cli/net.go b/cli/net.go
index 5a141e52d..6b10dbffc 100644
--- a/cli/net.go
+++ b/cli/net.go
@@ -124,8 +124,9 @@ var NetPeers = &cli.Command{
}
var NetPing = &cli.Command{
- Name: "ping",
- Usage: "Ping peers",
+ Name: "ping",
+ Usage: "Ping peers",
+ ArgsUsage: "[peerMultiaddr]",
Flags: []cli.Flag{
&cli.IntFlag{
Name: "count",
@@ -141,8 +142,8 @@ var NetPing = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("please provide a peerID")
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
api, closer, err := GetAPI(cctx)
diff --git a/cli/paych.go b/cli/paych.go
index 8277e3123..1067d0913 100644
--- a/cli/paych.go
+++ b/cli/paych.go
@@ -50,8 +50,8 @@ var paychAddFundsCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 3 {
- return ShowHelp(cctx, fmt.Errorf("must pass three arguments: "))
+ if cctx.NArg() != 3 {
+ return IncorrectNumArgs(cctx)
}
from, err := address.NewFromString(cctx.Args().Get(0))
@@ -112,8 +112,8 @@ var paychStatusByFromToCmd = &cli.Command{
Usage: "Show the status of an active outbound payment channel by from/to addresses",
ArgsUsage: "[fromAddress toAddress]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass two arguments: "))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
ctx := ReqContext(cctx)
@@ -148,8 +148,8 @@ var paychStatusCmd = &cli.Command{
Usage: "Show the status of an outbound payment channel",
ArgsUsage: "[channelAddress]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return ShowHelp(cctx, fmt.Errorf("must pass an argument: "))
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
ctx := ReqContext(cctx)
@@ -260,8 +260,8 @@ var paychSettleCmd = &cli.Command{
Usage: "Settle a payment channel",
ArgsUsage: "[channelAddress]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return fmt.Errorf("must pass payment channel address")
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -286,7 +286,7 @@ var paychSettleCmd = &cli.Command{
if err != nil {
return nil
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("settle message execution failed (exit code %d)", mwait.Receipt.ExitCode)
}
@@ -300,8 +300,8 @@ var paychCloseCmd = &cli.Command{
Usage: "Collect funds for a payment channel",
ArgsUsage: "[channelAddress]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return fmt.Errorf("must pass payment channel address")
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -326,7 +326,7 @@ var paychCloseCmd = &cli.Command{
if err != nil {
return nil
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("collect message execution failed (exit code %d)", mwait.Receipt.ExitCode)
}
@@ -360,8 +360,8 @@ var paychVoucherCreateCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass two arguments: "))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -408,8 +408,8 @@ var paychVoucherCheckCmd = &cli.Command{
Usage: "Check validity of payment channel voucher",
ArgsUsage: "[channelAddress voucher]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher to validate"))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -444,8 +444,8 @@ var paychVoucherAddCmd = &cli.Command{
Usage: "Add payment channel voucher to local datastore",
ArgsUsage: "[channelAddress voucher]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher"))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -486,8 +486,8 @@ var paychVoucherListCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return ShowHelp(cctx, fmt.Errorf("must pass payment channel address"))
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -531,8 +531,8 @@ var paychVoucherBestSpendableCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return ShowHelp(cctx, fmt.Errorf("must pass payment channel address"))
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -602,8 +602,8 @@ var paychVoucherSubmitCmd = &cli.Command{
Usage: "Submit voucher to chain to update payment channel state",
ArgsUsage: "[channelAddress voucher]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("must pass payment channel address and voucher"))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
ch, err := address.NewFromString(cctx.Args().Get(0))
@@ -634,7 +634,7 @@ var paychVoucherSubmitCmd = &cli.Command{
return err
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("message execution failed (exit code %d)", mwait.Receipt.ExitCode)
}
diff --git a/cli/send.go b/cli/send.go
index b5bfd3eb0..4268f8eb2 100644
--- a/cli/send.go
+++ b/cli/send.go
@@ -67,8 +67,8 @@ var sendCmd = &cli.Command{
fmt.Println("'force' flag is deprecated, use global flag 'force-send'")
}
- if cctx.Args().Len() != 2 {
- return ShowHelp(cctx, fmt.Errorf("'send' expects two arguments, target and amount"))
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
srv, err := GetFullNodeServices(cctx)
diff --git a/cli/state.go b/cli/state.go
index f18beb0fb..434fb1a1c 100644
--- a/cli/state.go
+++ b/cli/state.go
@@ -29,6 +29,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
@@ -43,7 +44,9 @@ import (
"github.com/filecoin-project/lotus/chain/consensus/filcns"
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/stmgr"
+ "github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
+ cliutil "github.com/filecoin-project/lotus/cli/util"
)
var StateCmd = &cli.Command{
@@ -168,6 +171,22 @@ var StateMinerInfo = &cli.Command{
for i, controlAddress := range mi.ControlAddresses {
fmt.Printf("Control %d: \t%s\n", i, controlAddress)
}
+ if mi.Beneficiary != address.Undef {
+ fmt.Printf("Beneficiary:\t%s\n", mi.Beneficiary)
+ if mi.Beneficiary != mi.Owner {
+ fmt.Printf("Beneficiary Quota:\t%s\n", mi.BeneficiaryTerm.Quota)
+ fmt.Printf("Beneficiary Used Quota:\t%s\n", mi.BeneficiaryTerm.UsedQuota)
+ fmt.Printf("Beneficiary Expiration:\t%s\n", mi.BeneficiaryTerm.Expiration)
+ }
+ }
+ if mi.PendingBeneficiaryTerm != nil {
+ fmt.Printf("Pending Beneficiary Term:\n")
+ fmt.Printf("New Beneficiary:\t%s\n", mi.PendingBeneficiaryTerm.NewBeneficiary)
+ fmt.Printf("New Quota:\t%s\n", mi.PendingBeneficiaryTerm.NewQuota)
+ fmt.Printf("New Expiration:\t%s\n", mi.PendingBeneficiaryTerm.NewExpiration)
+ fmt.Printf("Approved By Beneficiary:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByBeneficiary)
+ fmt.Printf("Approved By Nominee:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByNominee)
+ }
fmt.Printf("PeerID:\t%s\n", mi.PeerId)
fmt.Printf("Multiaddrs:\t")
@@ -212,7 +231,7 @@ var StateMinerInfo = &cli.Command{
return xerrors.Errorf("getting miner info: %w", err)
}
- fmt.Printf("Proving Period Start:\t%s\n", EpochTime(cd.CurrentEpoch, cd.PeriodStart))
+ fmt.Printf("Proving Period Start:\t%s\n", cliutil.EpochTime(cd.CurrentEpoch, cd.PeriodStart))
return nil
},
@@ -277,6 +296,28 @@ func ParseTipSetRef(ctx context.Context, api v0api.FullNode, tss string) (*types
return ts, nil
}
+func ParseTipSetRefOffline(ctx context.Context, cs *store.ChainStore, tss string) (*types.TipSet, error) {
+ switch {
+
+ case tss == "" || tss == "@head":
+ return cs.GetHeaviestTipSet(), nil
+
+ case tss[0] != '@':
+ cids, err := ParseTipSetString(tss)
+ if err != nil {
+ return nil, xerrors.Errorf("failed to parse tipset (%q): %w", tss, err)
+ }
+ return cs.LoadTipSet(ctx, types.NewTipSetKey(cids...))
+
+ default:
+ var h uint64
+ if _, err := fmt.Sscanf(tss, "@%d", &h); err != nil {
+ return nil, xerrors.Errorf("parsing height tipset ref: %w", err)
+ }
+ return cs.GetTipsetByHeight(ctx, abi.ChainEpoch(h), cs.GetHeaviestTipSet(), true)
+ }
+}
+
var StatePowerCmd = &cli.Command{
Name: "power",
Usage: "Query network or miner power",
@@ -503,9 +544,8 @@ var StateReplayCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- fmt.Println("must provide cid of message to replay")
- return nil
+ if cctx.NArg() != 1 {
+ return IncorrectNumArgs(cctx)
}
mcid, err := cid.Decode(cctx.Args().First())
@@ -1281,7 +1321,7 @@ var compStateMsg = `
{{end}}
{{end}}
- {{with SumGas .GasCharges}}
+ {{with sumGas .GasCharges}}
Sum |
{{template "gasC" .}}
{{if PrintTiming}}{{.TimeTaken}}{{end}} |
@@ -1315,7 +1355,7 @@ func ComputeStateHTMLTempl(w io.Writer, ts *types.TipSet, o *api.ComputeStateOut
"IsSlow": isSlow,
"IsVerySlow": isVerySlow,
"IntExit": func(i exitcode.ExitCode) int64 { return int64(i) },
- "SumGas": sumGas,
+ "sumGas": types.SumGas,
"CodeStr": codeStr,
"Call": call,
"PrintTiming": func() bool { return printTiming },
@@ -1383,21 +1423,6 @@ func isVerySlow(t time.Duration) bool {
return t > 50*time.Millisecond
}
-func sumGas(changes []*types.GasTrace) types.GasTrace {
- var out types.GasTrace
- for _, gc := range changes {
- out.TotalGas += gc.TotalGas
- out.ComputeGas += gc.ComputeGas
- out.StorageGas += gc.StorageGas
-
- out.TotalVirtualGas += gc.TotalVirtualGas
- out.VirtualComputeGas += gc.VirtualComputeGas
- out.VirtualStorageGas += gc.VirtualStorageGas
- }
-
- return out
-}
-
func JsonParams(code cid.Cid, method abi.MethodNum, params []byte) (string, error) {
p, err := stmgr.GetParamType(filcns.NewActorRegistry(), code, method) // todo use api for correct actor registry
if err != nil {
@@ -1579,8 +1604,8 @@ var StateCallCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 2 {
- return fmt.Errorf("must specify at least actor and method to invoke")
+ if cctx.NArg() < 2 {
+ return ShowHelp(cctx, fmt.Errorf("must specify at least actor and method to invoke"))
}
api, closer, err := GetFullNodeAPI(cctx)
@@ -1618,7 +1643,7 @@ var StateCallCmd = &cli.Command{
var params []byte
// If params were passed in, decode them
- if cctx.Args().Len() > 2 {
+ if cctx.NArg() > 2 {
switch cctx.String("encoding") {
case "base64":
params, err = base64.StdEncoding.DecodeString(cctx.Args().Get(2))
@@ -1742,8 +1767,8 @@ var StateSectorCmd = &cli.Command{
ctx := ReqContext(cctx)
- if cctx.Args().Len() != 2 {
- return xerrors.Errorf("expected 2 params: minerAddress and sectorNumber")
+ if cctx.NArg() != 2 {
+ return IncorrectNumArgs(cctx)
}
ts, err := LoadTipSet(ctx, cctx, api)
@@ -1777,8 +1802,8 @@ var StateSectorCmd = &cli.Command{
}
fmt.Println("DealIDs: ", si.DealIDs)
fmt.Println()
- fmt.Println("Activation: ", EpochTimeTs(ts.Height(), si.Activation, ts))
- fmt.Println("Expiration: ", EpochTimeTs(ts.Height(), si.Expiration, ts))
+ fmt.Println("Activation: ", cliutil.EpochTimeTs(ts.Height(), si.Activation, ts))
+ fmt.Println("Expiration: ", cliutil.EpochTimeTs(ts.Height(), si.Expiration, ts))
fmt.Println()
fmt.Println("DealWeight: ", si.DealWeight)
fmt.Println("VerifiedDealWeight: ", si.VerifiedDealWeight)
@@ -1884,7 +1909,6 @@ var StateSysActorCIDsCmd = &cli.Command{
&cli.UintFlag{
Name: "network-version",
Usage: "specify network version",
- Value: uint(build.NewestNetworkVersion),
},
},
Action: func(cctx *cli.Context) error {
@@ -1900,11 +1924,19 @@ var StateSysActorCIDsCmd = &cli.Command{
ctx := ReqContext(cctx)
- nv := network.Version(cctx.Uint64("network-version"))
+ var nv network.Version
+ if cctx.IsSet("network-version") {
+ nv = network.Version(cctx.Uint64("network-version"))
+ } else {
+ nv, err = api.StateNetworkVersion(ctx, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+ }
fmt.Printf("Network Version: %d\n", nv)
- actorVersion, err := actors.VersionForNetwork(nv)
+ actorVersion, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return err
}
diff --git a/cli/util.go b/cli/util.go
index 69c45b382..03de817f9 100644
--- a/cli/util.go
+++ b/cli/util.go
@@ -2,19 +2,13 @@ package cli
import (
"context"
- "fmt"
"os"
- "time"
"github.com/fatih/color"
- "github.com/hako/durafmt"
"github.com/ipfs/go-cid"
"github.com/mattn/go-isatty"
- "github.com/filecoin-project/go-state-types/abi"
-
"github.com/filecoin-project/lotus/api/v0api"
- "github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -43,36 +37,3 @@ func parseTipSet(ctx context.Context, api v0api.FullNode, vals []string) (*types
return types.NewTipSet(headers)
}
-
-func EpochTime(curr, e abi.ChainEpoch) string {
- switch {
- case curr > e:
- return fmt.Sprintf("%d (%s ago)", e, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(curr-e))).LimitFirstN(2))
- case curr == e:
- return fmt.Sprintf("%d (now)", e)
- case curr < e:
- return fmt.Sprintf("%d (in %s)", e, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(e-curr))).LimitFirstN(2))
- }
-
- panic("math broke")
-}
-
-// EpochTimeTs is like EpochTime, but also outputs absolute time. `ts` is only
-// used to provide a timestamp at some epoch to calculate time from. It can be
-// a genesis tipset.
-//
-// Example output: `1944975 (01 Jul 22 08:07 CEST, 10 hours 29 minutes ago)`
-func EpochTimeTs(curr, e abi.ChainEpoch, ts *types.TipSet) string {
- timeStr := time.Unix(int64(ts.MinTimestamp()+(uint64(e-ts.Height())*build.BlockDelaySecs)), 0).Format(time.RFC822)
-
- switch {
- case curr > e:
- return fmt.Sprintf("%d (%s, %s ago)", e, timeStr, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(curr-e))).LimitFirstN(2))
- case curr == e:
- return fmt.Sprintf("%d (%s, now)", e, timeStr)
- case curr < e:
- return fmt.Sprintf("%d (%s, in %s)", e, timeStr, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(e-curr))).LimitFirstN(2))
- }
-
- panic("math broke")
-}
diff --git a/cli/util/api.go b/cli/util/api.go
index 6c673d91f..b35974c69 100644
--- a/cli/util/api.go
+++ b/cli/util/api.go
@@ -8,8 +8,10 @@ import (
"net/url"
"os"
"os/signal"
+ "reflect"
"strings"
"syscall"
+ "time"
"github.com/mitchellh/go-homedir"
"github.com/urfave/cli/v2"
@@ -21,6 +23,7 @@ import (
"github.com/filecoin-project/lotus/api/client"
"github.com/filecoin-project/lotus/api/v0api"
"github.com/filecoin-project/lotus/api/v1api"
+ "github.com/filecoin-project/lotus/lib/retry"
"github.com/filecoin-project/lotus/node/repo"
)
@@ -36,7 +39,7 @@ const (
// 2. *_API_INFO environment variables
// 3. deprecated *_API_INFO environment variables
// 4. *-repo command line flags.
-func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
+func GetAPIInfoMulti(ctx *cli.Context, t repo.RepoType) ([]APIInfo, error) {
// Check if there was a flag passed with the listen address of the API
// server (only used by the tests)
for _, f := range t.APIFlags() {
@@ -46,7 +49,7 @@ func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
strma := ctx.String(f)
strma = strings.TrimSpace(strma)
- return APIInfo{Addr: strma}, nil
+ return []APIInfo{{Addr: strma}}, nil
}
//
@@ -56,14 +59,14 @@ func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
primaryEnv, fallbacksEnvs, deprecatedEnvs := t.APIInfoEnvVars()
env, ok := os.LookupEnv(primaryEnv)
if ok {
- return ParseApiInfo(env), nil
+ return ParseApiInfoMulti(env), nil
}
for _, env := range deprecatedEnvs {
env, ok := os.LookupEnv(env)
if ok {
log.Warnf("Using deprecated env(%s) value, please use env(%s) instead.", env, primaryEnv)
- return ParseApiInfo(env), nil
+ return ParseApiInfoMulti(env), nil
}
}
@@ -76,26 +79,26 @@ func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
p, err := homedir.Expand(path)
if err != nil {
- return APIInfo{}, xerrors.Errorf("could not expand home dir (%s): %w", f, err)
+ return []APIInfo{}, xerrors.Errorf("could not expand home dir (%s): %w", f, err)
}
r, err := repo.NewFS(p)
if err != nil {
- return APIInfo{}, xerrors.Errorf("could not open repo at path: %s; %w", p, err)
+ return []APIInfo{}, xerrors.Errorf("could not open repo at path: %s; %w", p, err)
}
exists, err := r.Exists()
if err != nil {
- return APIInfo{}, xerrors.Errorf("repo.Exists returned an error: %w", err)
+ return []APIInfo{}, xerrors.Errorf("repo.Exists returned an error: %w", err)
}
if !exists {
- return APIInfo{}, errors.New("repo directory does not exist. Make sure your configuration is correct")
+ return []APIInfo{}, errors.New("repo directory does not exist. Make sure your configuration is correct")
}
ma, err := r.APIEndpoint()
if err != nil {
- return APIInfo{}, xerrors.Errorf("could not get api endpoint: %w", err)
+ return []APIInfo{}, xerrors.Errorf("could not get api endpoint: %w", err)
}
token, err := r.APIToken()
@@ -103,38 +106,75 @@ func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
log.Warnf("Couldn't load CLI token, capabilities may be limited: %v", err)
}
- return APIInfo{
+ return []APIInfo{{
Addr: ma.String(),
Token: token,
- }, nil
+ }}, nil
}
for _, env := range fallbacksEnvs {
env, ok := os.LookupEnv(env)
if ok {
- return ParseApiInfo(env), nil
+ return ParseApiInfoMulti(env), nil
}
}
- return APIInfo{}, fmt.Errorf("could not determine API endpoint for node type: %v", t.Type())
+ return []APIInfo{}, fmt.Errorf("could not determine API endpoint for node type: %v", t.Type())
}
-func GetRawAPI(ctx *cli.Context, t repo.RepoType, version string) (string, http.Header, error) {
- ainfo, err := GetAPIInfo(ctx, t)
- if err != nil {
- return "", nil, xerrors.Errorf("could not get API info for %s: %w", t.Type(), err)
+func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) {
+ ainfos, err := GetAPIInfoMulti(ctx, t)
+ if err != nil || len(ainfos) == 0 {
+ return APIInfo{}, err
}
- addr, err := ainfo.DialArgs(version)
- if err != nil {
- return "", nil, xerrors.Errorf("could not get DialArgs: %w", err)
+ if len(ainfos) > 1 {
+ log.Warn("multiple API infos received when only one was expected")
+ }
+
+ return ainfos[0], nil
+
+}
+
+type HttpHead struct {
+ addr string
+ header http.Header
+}
+
+func GetRawAPIMulti(ctx *cli.Context, t repo.RepoType, version string) ([]HttpHead, error) {
+
+ var httpHeads []HttpHead
+ ainfos, err := GetAPIInfoMulti(ctx, t)
+ if err != nil || len(ainfos) == 0 {
+ return httpHeads, xerrors.Errorf("could not get API info for %s: %w", t.Type(), err)
+ }
+
+ for _, ainfo := range ainfos {
+ addr, err := ainfo.DialArgs(version)
+ if err != nil {
+ return httpHeads, xerrors.Errorf("could not get DialArgs: %w", err)
+ }
+ httpHeads = append(httpHeads, HttpHead{addr: addr, header: ainfo.AuthHeader()})
}
if IsVeryVerbose {
- _, _ = fmt.Fprintf(ctx.App.Writer, "using raw API %s endpoint: %s\n", version, addr)
+ _, _ = fmt.Fprintf(ctx.App.Writer, "using raw API %s endpoint: %s\n", version, httpHeads[0].addr)
}
- return addr, ainfo.AuthHeader(), nil
+ return httpHeads, nil
+}
+
+func GetRawAPI(ctx *cli.Context, t repo.RepoType, version string) (string, http.Header, error) {
+ heads, err := GetRawAPIMulti(ctx, t, version)
+ if err != nil {
+ return "", nil, err
+ }
+
+ if len(heads) > 1 {
+ log.Warnf("More than 1 header received when expecting only one")
+ }
+
+ return heads[0].addr, heads[0].header, nil
}
func GetCommonAPI(ctx *cli.Context) (api.CommonNet, jsonrpc.ClientCloser, error) {
@@ -185,7 +225,72 @@ func GetFullNodeAPI(ctx *cli.Context) (v0api.FullNode, jsonrpc.ClientCloser, err
return client.NewFullNodeRPCV0(ctx.Context, addr, headers)
}
-func GetFullNodeAPIV1(ctx *cli.Context) (v1api.FullNode, jsonrpc.ClientCloser, error) {
+type contextKey string
+
+// Not thread safe
+func OnSingleNode(ctx context.Context) context.Context {
+ return context.WithValue(ctx, contextKey("retry-node"), new(*int))
+}
+
+func FullNodeProxy[T api.FullNode](ins []T, outstr *api.FullNodeStruct) {
+ outs := api.GetInternalStructs(outstr)
+
+ var rins []reflect.Value
+ for _, in := range ins {
+ rins = append(rins, reflect.ValueOf(in))
+ }
+
+ for _, out := range outs {
+ rProxyInternal := reflect.ValueOf(out).Elem()
+
+ for f := 0; f < rProxyInternal.NumField(); f++ {
+ field := rProxyInternal.Type().Field(f)
+
+ var fns []reflect.Value
+ for _, rin := range rins {
+ fns = append(fns, rin.MethodByName(field.Name))
+ }
+
+ rProxyInternal.Field(f).Set(reflect.MakeFunc(field.Type, func(args []reflect.Value) (results []reflect.Value) {
+ errorsToRetry := []error{&jsonrpc.RPCConnectionError{}, &jsonrpc.ErrClient{}}
+ initialBackoff, err := time.ParseDuration("1s")
+ if err != nil {
+ return nil
+ }
+
+ ctx := args[0].Interface().(context.Context)
+
+ curr := -1
+
+ // for calls that need to be performed on the same node
+ // primarily for miner when calling create block and submit block subsequently
+ key := contextKey("retry-node")
+ if ctx.Value(key) != nil {
+ if (*ctx.Value(key).(**int)) == nil {
+ *ctx.Value(key).(**int) = &curr
+ } else {
+ curr = **ctx.Value(key).(**int) - 1
+ }
+ }
+
+ total := len(rins)
+ result, _ := retry.Retry(ctx, 5, initialBackoff, errorsToRetry, func() ([]reflect.Value, error) {
+ curr = (curr + 1) % total
+
+ result := fns[curr].Call(args)
+ if result[len(result)-1].IsNil() {
+ return result, nil
+ }
+ e := result[len(result)-1].Interface().(error)
+ return result, e
+ })
+ return result
+ }))
+ }
+ }
+}
+
+func GetFullNodeAPIV1Single(ctx *cli.Context) (v1api.FullNode, jsonrpc.ClientCloser, error) {
if tn, ok := ctx.App.Metadata["testnode-full"]; ok {
return tn.(v1api.FullNode), func() {}, nil
}
@@ -214,6 +319,58 @@ func GetFullNodeAPIV1(ctx *cli.Context) (v1api.FullNode, jsonrpc.ClientCloser, e
return v1API, closer, nil
}
+func GetFullNodeAPIV1(ctx *cli.Context) (v1api.FullNode, jsonrpc.ClientCloser, error) {
+ if tn, ok := ctx.App.Metadata["testnode-full"]; ok {
+ return tn.(v1api.FullNode), func() {}, nil
+ }
+
+ heads, err := GetRawAPIMulti(ctx, repo.FullNode, "v1")
+ if err != nil {
+ return nil, nil, err
+ }
+
+ if IsVeryVerbose {
+ _, _ = fmt.Fprintln(ctx.App.Writer, "using full node API v1 endpoint:", heads[0].addr)
+ }
+
+ var fullNodes []api.FullNode
+ var closers []jsonrpc.ClientCloser
+
+ for _, head := range heads {
+ v1api, closer, err := client.NewFullNodeRPCV1(ctx.Context, head.addr, head.header)
+ if err != nil {
+ log.Warnf("Not able to establish connection to node with addr: ", head.addr)
+ continue
+ }
+ fullNodes = append(fullNodes, v1api)
+ closers = append(closers, closer)
+ }
+
+ // When running in cluster mode and trying to establish connections to multiple nodes, fail
+ // if less than 2 lotus nodes are actually running
+ if len(heads) > 1 && len(fullNodes) < 2 {
+ return nil, nil, xerrors.Errorf("Not able to establish connection to more than a single node")
+ }
+
+ finalCloser := func() {
+ for _, c := range closers {
+ c()
+ }
+ }
+
+ var v1API api.FullNodeStruct
+ FullNodeProxy(fullNodes, &v1API)
+
+ v, err := v1API.Version(ctx.Context)
+ if err != nil {
+ return nil, nil, err
+ }
+ if !v.APIVersion.EqMajorMinor(api.FullAPIVersion1) {
+ return nil, nil, xerrors.Errorf("Remote API version didn't match (expected %s, remote %s)", api.FullAPIVersion1, v.APIVersion)
+ }
+ return &v1API, finalCloser, nil
+}
+
type GetStorageMinerOptions struct {
PreferHttp bool
}
diff --git a/cli/util/apiinfo.go b/cli/util/apiinfo.go
index 41ca18c61..30eff9f28 100644
--- a/cli/util/apiinfo.go
+++ b/cli/util/apiinfo.go
@@ -24,6 +24,7 @@ type APIInfo struct {
func ParseApiInfo(s string) APIInfo {
var tok []byte
+
if infoWithToken.Match([]byte(s)) {
sp := strings.SplitN(s, ":", 2)
tok = []byte(sp[0])
@@ -36,6 +37,18 @@ func ParseApiInfo(s string) APIInfo {
}
}
+func ParseApiInfoMulti(s string) []APIInfo {
+ var apiInfos []APIInfo
+
+ allAddrs := strings.SplitN(s, ",", -1)
+
+ for _, addr := range allAddrs {
+ apiInfos = append(apiInfos, ParseApiInfo(addr))
+ }
+
+ return apiInfos
+}
+
func (a APIInfo) DialArgs(version string) (string, error) {
ma, err := multiaddr.NewMultiaddr(a.Addr)
if err == nil {
diff --git a/cli/util/epoch.go b/cli/util/epoch.go
new file mode 100644
index 000000000..81c92a7e3
--- /dev/null
+++ b/cli/util/epoch.go
@@ -0,0 +1,46 @@
+package cliutil
+
+import (
+ "fmt"
+ "time"
+
+ "github.com/hako/durafmt"
+
+ "github.com/filecoin-project/go-state-types/abi"
+
+ "github.com/filecoin-project/lotus/build"
+ "github.com/filecoin-project/lotus/chain/types"
+)
+
+func EpochTime(curr, e abi.ChainEpoch) string {
+ switch {
+ case curr > e:
+ return fmt.Sprintf("%d (%s ago)", e, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(curr-e))).LimitFirstN(2))
+ case curr == e:
+ return fmt.Sprintf("%d (now)", e)
+ case curr < e:
+ return fmt.Sprintf("%d (in %s)", e, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(e-curr))).LimitFirstN(2))
+ }
+
+ panic("math broke")
+}
+
+// EpochTimeTs is like EpochTime, but also outputs absolute time. `ts` is only
+// used to provide a timestamp at some epoch to calculate time from. It can be
+// a genesis tipset.
+//
+// Example output: `1944975 (01 Jul 22 08:07 CEST, 10 hours 29 minutes ago)`
+func EpochTimeTs(curr, e abi.ChainEpoch, ts *types.TipSet) string {
+ timeStr := time.Unix(int64(ts.MinTimestamp()+(uint64(e-ts.Height())*build.BlockDelaySecs)), 0).Format(time.RFC822)
+
+ switch {
+ case curr > e:
+ return fmt.Sprintf("%d (%s, %s ago)", e, timeStr, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(curr-e))).LimitFirstN(2))
+ case curr == e:
+ return fmt.Sprintf("%d (%s, now)", e, timeStr)
+ case curr < e:
+ return fmt.Sprintf("%d (%s, in %s)", e, timeStr, durafmt.Parse(time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(e-curr))).LimitFirstN(2))
+ }
+
+ panic("math broke")
+}
diff --git a/cli/util/retrieval.go b/cli/util/retrieval.go
new file mode 100644
index 000000000..3a2ef6077
--- /dev/null
+++ b/cli/util/retrieval.go
@@ -0,0 +1,78 @@
+package cliutil
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net/http"
+ "net/url"
+ "path"
+
+ "github.com/multiformats/go-multiaddr"
+ manet "github.com/multiformats/go-multiaddr/net"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/lotus/api"
+)
+
+func ApiAddrToUrl(apiAddr string) (*url.URL, error) {
+ ma, err := multiaddr.NewMultiaddr(apiAddr)
+ if err == nil {
+ _, addr, err := manet.DialArgs(ma)
+ if err != nil {
+ return nil, err
+ }
+ // todo: make cliutil helpers for this
+ apiAddr = "http://" + addr
+ }
+ aa, err := url.Parse(apiAddr)
+ if err != nil {
+ return nil, xerrors.Errorf("parsing api address: %w", err)
+ }
+ switch aa.Scheme {
+ case "ws":
+ aa.Scheme = "http"
+ case "wss":
+ aa.Scheme = "https"
+ }
+
+ return aa, nil
+}
+
+func ClientExportStream(apiAddr string, apiAuth http.Header, eref api.ExportRef, car bool) (io.ReadCloser, error) {
+ rj, err := json.Marshal(eref)
+ if err != nil {
+ return nil, xerrors.Errorf("marshaling export ref: %w", err)
+ }
+
+ aa, err := ApiAddrToUrl(apiAddr)
+ if err != nil {
+ return nil, err
+ }
+
+ aa.Path = path.Join(aa.Path, "rest/v0/export")
+ req, err := http.NewRequest("GET", fmt.Sprintf("%s?car=%t&export=%s", aa, car, url.QueryEscape(string(rj))), nil)
+ if err != nil {
+ return nil, err
+ }
+
+ req.Header = apiAuth
+
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ return nil, err
+ }
+
+ if resp.StatusCode != http.StatusOK {
+ em, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return nil, xerrors.Errorf("reading error body: %w", err)
+ }
+
+ resp.Body.Close() // nolint
+ return nil, xerrors.Errorf("getting root car: http %d: %s", resp.StatusCode, string(em))
+ }
+
+ return resp.Body, nil
+}
diff --git a/cli/wallet.go b/cli/wallet.go
index 4193138c3..3a21cdaba 100644
--- a/cli/wallet.go
+++ b/cli/wallet.go
@@ -260,6 +260,7 @@ var walletSetDefault = &cli.Command{
return err
}
+ fmt.Println("Default address set to:", addr)
return api.WalletSetDefault(ctx, addr)
},
}
@@ -517,6 +518,8 @@ var walletDelete = &cli.Command{
return err
}
+ fmt.Println("Soft deleting address:", addr)
+ fmt.Println("Hard deletion of the address in `~/.lotus/keystore` is needed for permanent removal")
return api.WalletDelete(ctx, addr)
},
}
@@ -645,7 +648,7 @@ var walletMarketWithdraw = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
afmt.Println(cctx.App.Writer, "withdrawal failed!")
return err
}
diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go
index ce0b8d86e..c0a3c4a53 100644
--- a/cmd/lotus-bench/import.go
+++ b/cmd/lotus-bench/import.go
@@ -149,7 +149,7 @@ var importBenchCmd = &cli.Command{
http.Handle("/debug/metrics", exporter)
- http.ListenAndServe("localhost:6060", nil) //nolint:errcheck
+ _ = http.ListenAndServe("localhost:6060", nil)
}()
var tdir string
@@ -771,7 +771,7 @@ var importAnalyzeCmd = &cli.Command{
}
go func() {
- http.ListenAndServe("localhost:6060", nil) //nolint:errcheck
+ _ = http.ListenAndServe("localhost:6060", nil)
}()
fi, err := os.Open(cctx.Args().First())
diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go
index 46c008d8f..d7b9b0409 100644
--- a/cmd/lotus-bench/main.go
+++ b/cmd/lotus-bench/main.go
@@ -816,7 +816,7 @@ func bps(sectorSize abi.SectorSize, sectorNum int, d time.Duration) string {
}
func spt(ssize abi.SectorSize) abi.RegisteredSealProof {
- spt, err := miner.SealProofTypeFromSectorSize(ssize, build.NewestNetworkVersion)
+ spt, err := miner.SealProofTypeFromSectorSize(ssize, build.TestNetworkVersion)
if err != nil {
panic(err)
}
diff --git a/cmd/lotus-bench/simple.go b/cmd/lotus-bench/simple.go
index b999cd277..87e2c3bc0 100644
--- a/cmd/lotus-bench/simple.go
+++ b/cmd/lotus-bench/simple.go
@@ -959,7 +959,7 @@ var simpleProveReplicaUpdate2 = &cli.Command{
}
func ParsePieceInfos(cctx *cli.Context, firstArg int) ([]abi.PieceInfo, error) {
- args := cctx.Args().Len() - firstArg
+ args := cctx.NArg() - firstArg
if args%2 != 0 {
return nil, xerrors.Errorf("piece info argunemts need to be supplied in pairs")
}
diff --git a/cmd/lotus-fountain/main.go b/cmd/lotus-fountain/main.go
index 059c248f6..780aef916 100644
--- a/cmd/lotus-fountain/main.go
+++ b/cmd/lotus-fountain/main.go
@@ -74,6 +74,10 @@ var runCmd = &cli.Command{
Name: "captcha-threshold",
Value: 0.5,
},
+ &cli.StringFlag{
+ Name: "http-server-timeout",
+ Value: "30s",
+ },
},
Action: func(cctx *cli.Context) error {
sendPerRequest, err := types.ParseFIL(cctx.String("amount"))
@@ -127,7 +131,17 @@ var runCmd = &cli.Command{
os.Exit(0)
}()
- return http.ListenAndServe(cctx.String("front"), nil)
+ timeout, err := time.ParseDuration(cctx.String("http-server-timeout"))
+ if err != nil {
+ return xerrors.Errorf("invalid time string %s: %x", cctx.String("http-server-timeout"), err)
+ }
+
+ server := &http.Server{
+ Addr: cctx.String("front"),
+ ReadHeaderTimeout: timeout,
+ }
+
+ return server.ListenAndServe()
},
}
diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go
index b3e7df4dc..99c30a05b 100644
--- a/cmd/lotus-miner/actor.go
+++ b/cmd/lotus-miner/actor.go
@@ -4,9 +4,11 @@ import (
"bytes"
"fmt"
"os"
+ "strconv"
"strings"
"github.com/fatih/color"
+ "github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/libp2p/go-libp2p/core/peer"
ma "github.com/multiformats/go-multiaddr"
@@ -19,7 +21,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/api"
@@ -47,6 +49,8 @@ var actorCmd = &cli.Command{
actorProposeChangeWorker,
actorConfirmChangeWorker,
actorCompactAllocatedCmd,
+ actorProposeChangeBeneficiary,
+ actorConfirmChangeBeneficiary,
},
}
@@ -80,7 +84,7 @@ var actorSetAddrsCmd = &cli.Command{
return fmt.Errorf("unset can only be used with no arguments")
}
- nodeAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -111,7 +115,7 @@ var actorSetAddrsCmd = &cli.Command{
addrs = append(addrs, maddrNop2p.Bytes())
}
- maddr, err := nodeAPI.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -176,7 +180,7 @@ var actorSetPeeridCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- nodeAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -195,7 +199,7 @@ var actorSetPeeridCmd = &cli.Command{
return fmt.Errorf("failed to parse input as a peerId: %w", err)
}
- maddr, err := nodeAPI.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -232,7 +236,7 @@ var actorSetPeeridCmd = &cli.Command{
var actorWithdrawCmd = &cli.Command{
Name: "withdraw",
- Usage: "withdraw available balance",
+ Usage: "withdraw available balance to beneficiary",
ArgsUsage: "[amount (FIL)]",
Flags: []cli.Flag{
&cli.IntFlag{
@@ -240,6 +244,10 @@ var actorWithdrawCmd = &cli.Command{
Usage: "number of block confirmations to wait for",
Value: int(build.MessageConfidence),
},
+ &cli.BoolFlag{
+ Name: "beneficiary",
+ Usage: "send withdraw message from the beneficiary address",
+ },
},
Action: func(cctx *cli.Context) error {
amount := abi.NewTokenAmount(0)
@@ -253,7 +261,7 @@ var actorWithdrawCmd = &cli.Command{
amount = abi.TokenAmount(f)
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -267,7 +275,12 @@ var actorWithdrawCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
- res, err := nodeApi.ActorWithdrawBalance(ctx, amount)
+ var res cid.Cid
+ if cctx.IsSet("beneficiary") {
+ res, err = minerApi.BeneficiaryWithdrawBalance(ctx, amount)
+ } else {
+ res, err = minerApi.ActorWithdrawBalance(ctx, amount)
+ }
if err != nil {
return err
}
@@ -277,10 +290,10 @@ var actorWithdrawCmd = &cli.Command{
// wait for it to get mined into a block
wait, err := api.StateWaitMsg(ctx, res, uint64(cctx.Int("confidence")))
if err != nil {
- return xerrors.Errorf("Timeout waiting for withdrawal message %s", wait.Message)
+ return xerrors.Errorf("Timeout waiting for withdrawal message %s", res)
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return xerrors.Errorf("Failed to execute withdrawal message %s: %w", wait.Message, wait.Receipt.ExitCode.Error())
}
@@ -316,7 +329,7 @@ var actorRepayDebtCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -330,7 +343,7 @@ var actorRepayDebtCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -431,7 +444,7 @@ var actorControlList = &cli.Command{
color.NoColor = !cctx.Bool("color")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -463,7 +476,7 @@ var actorControlList = &cli.Command{
tablewriter.Col("balance"),
)
- ac, err := nodeApi.ActorAddressConfig(ctx)
+ ac, err := minerApi.ActorAddressConfig(ctx)
if err != nil {
return err
}
@@ -536,7 +549,9 @@ var actorControlList = &cli.Command{
}
kstr := k.String()
if !cctx.Bool("verbose") {
- kstr = kstr[:9] + "..."
+ if len(kstr) > 9 {
+ kstr = kstr[:6] + "..."
+ }
}
bstr := types.FIL(b).String()
@@ -580,6 +595,7 @@ var actorControlList = &cli.Command{
printKey("owner", mi.Owner)
printKey("worker", mi.Worker)
+ printKey("beneficiary", mi.Beneficiary)
for i, ca := range mi.ControlAddresses {
printKey(fmt.Sprintf("control-%d", i), ca)
}
@@ -600,7 +616,7 @@ var actorControlSet = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -614,7 +630,7 @@ var actorControlSet = &cli.Command{
ctx := lcli.ReqContext(cctx)
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -719,7 +735,7 @@ var actorSetOwnerCmd = &cli.Command{
}
if cctx.NArg() != 2 {
- return fmt.Errorf("must pass new owner address and sender address")
+ return lcli.IncorrectNumArgs(cctx)
}
api, acloser, err := lcli.GetFullNodeAPI(cctx)
@@ -789,7 +805,7 @@ var actorSetOwnerCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Println("owner change failed!")
return err
}
@@ -816,7 +832,7 @@ var actorProposeChangeWorker = &cli.Command{
return fmt.Errorf("must pass address of new worker address")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -840,7 +856,7 @@ var actorProposeChangeWorker = &cli.Command{
return err
}
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -895,9 +911,8 @@ var actorProposeChangeWorker = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
- fmt.Fprintln(cctx.App.Writer, "Propose worker change failed!")
- return err
+ if wait.Receipt.ExitCode.IsError() {
+ return fmt.Errorf("propose worker change failed")
}
mi, err = api.StateMinerInfo(ctx, maddr, wait.TipSet)
@@ -915,6 +930,139 @@ var actorProposeChangeWorker = &cli.Command{
},
}
+var actorProposeChangeBeneficiary = &cli.Command{
+ Name: "propose-change-beneficiary",
+ Usage: "Propose a beneficiary address change",
+ ArgsUsage: "[beneficiaryAddress quota expiration]",
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "really-do-it",
+ Usage: "Actually send transaction performing the action",
+ Value: false,
+ },
+ &cli.BoolFlag{
+ Name: "overwrite-pending-change",
+ Usage: "Overwrite the current beneficiary change proposal",
+ Value: false,
+ },
+ &cli.StringFlag{
+ Name: "actor",
+ Usage: "specify the address of miner actor",
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 3 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ api, acloser, err := lcli.GetFullNodeAPI(cctx)
+ if err != nil {
+ return xerrors.Errorf("getting fullnode api: %w", err)
+ }
+ defer acloser()
+
+ ctx := lcli.ReqContext(cctx)
+
+ na, err := address.NewFromString(cctx.Args().Get(0))
+ if err != nil {
+ return xerrors.Errorf("parsing beneficiary address: %w", err)
+ }
+
+ newAddr, err := api.StateLookupID(ctx, na, types.EmptyTSK)
+ if err != nil {
+ return xerrors.Errorf("looking up new beneficiary address: %w", err)
+ }
+
+ quota, err := types.ParseFIL(cctx.Args().Get(1))
+ if err != nil {
+ return xerrors.Errorf("parsing quota: %w", err)
+ }
+
+ expiration, err := strconv.ParseInt(cctx.Args().Get(2), 10, 64)
+ if err != nil {
+ return xerrors.Errorf("parsing expiration: %w", err)
+ }
+
+ maddr, err := getActorAddress(ctx, cctx)
+ if err != nil {
+ return xerrors.Errorf("getting miner address: %w", err)
+ }
+
+ mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK)
+ if err != nil {
+ return xerrors.Errorf("getting miner info: %w", err)
+ }
+
+ if mi.Beneficiary == mi.Owner && newAddr == mi.Owner {
+ return fmt.Errorf("beneficiary %s already set to owner address", mi.Beneficiary)
+ }
+
+ if mi.PendingBeneficiaryTerm != nil {
+ fmt.Println("WARNING: replacing Pending Beneficiary Term of:")
+ fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary)
+ fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota)
+ fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration)
+
+ if !cctx.Bool("overwrite-pending-change") {
+ return fmt.Errorf("must pass --overwrite-pending-change to replace current pending beneficiary change. Please review CAREFULLY")
+ }
+ }
+
+ if !cctx.Bool("really-do-it") {
+ fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please")
+ return nil
+ }
+
+ params := &miner.ChangeBeneficiaryParams{
+ NewBeneficiary: newAddr,
+ NewQuota: abi.TokenAmount(quota),
+ NewExpiration: abi.ChainEpoch(expiration),
+ }
+
+ sp, err := actors.SerializeParams(params)
+ if err != nil {
+ return xerrors.Errorf("serializing params: %w", err)
+ }
+
+ smsg, err := api.MpoolPushMessage(ctx, &types.Message{
+ From: mi.Owner,
+ To: maddr,
+ Method: builtin.MethodsMiner.ChangeBeneficiary,
+ Value: big.Zero(),
+ Params: sp,
+ }, nil)
+ if err != nil {
+ return xerrors.Errorf("mpool push: %w", err)
+ }
+
+ fmt.Println("Propose Message CID:", smsg.Cid())
+
+ // wait for it to get mined into a block
+ wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence)
+ if err != nil {
+ return xerrors.Errorf("waiting for message to be included in block: %w", err)
+ }
+
+ // check it executed successfully
+ if wait.Receipt.ExitCode.IsError() {
+ return fmt.Errorf("propose beneficiary change failed")
+ }
+
+ updatedMinerInfo, err := api.StateMinerInfo(ctx, maddr, wait.TipSet)
+ if err != nil {
+ return xerrors.Errorf("getting miner info: %w", err)
+ }
+
+ if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == newAddr {
+ fmt.Println("Beneficiary address successfully changed")
+ } else {
+ fmt.Println("Beneficiary address change awaiting additional confirmations")
+ }
+
+ return nil
+ },
+}
+
var actorConfirmChangeWorker = &cli.Command{
Name: "confirm-change-worker",
Usage: "Confirm a worker address change",
@@ -931,7 +1079,7 @@ var actorConfirmChangeWorker = &cli.Command{
return fmt.Errorf("must pass address of new worker address")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -955,7 +1103,7 @@ var actorConfirmChangeWorker = &cli.Command{
return err
}
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -978,7 +1126,7 @@ var actorConfirmChangeWorker = &cli.Command{
}
if !cctx.Bool("really-do-it") {
- fmt.Fprintln(cctx.App.Writer, "Pass --really-do-it to actually execute this action")
+ fmt.Println("Pass --really-do-it to actually execute this action")
return nil
}
@@ -992,7 +1140,7 @@ var actorConfirmChangeWorker = &cli.Command{
return xerrors.Errorf("mpool push: %w", err)
}
- fmt.Fprintln(cctx.App.Writer, "Confirm Message CID:", smsg.Cid())
+ fmt.Println("Confirm Message CID:", smsg.Cid())
// wait for it to get mined into a block
wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence)
@@ -1001,7 +1149,7 @@ var actorConfirmChangeWorker = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Worker change failed!")
return err
}
@@ -1018,6 +1166,129 @@ var actorConfirmChangeWorker = &cli.Command{
},
}
+var actorConfirmChangeBeneficiary = &cli.Command{
+ Name: "confirm-change-beneficiary",
+ Usage: "Confirm a beneficiary address change",
+ ArgsUsage: "[minerAddress]",
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "really-do-it",
+ Usage: "Actually send transaction performing the action",
+ Value: false,
+ },
+ &cli.BoolFlag{
+ Name: "existing-beneficiary",
+ Usage: "send confirmation from the existing beneficiary address",
+ },
+ &cli.BoolFlag{
+ Name: "new-beneficiary",
+ Usage: "send confirmation from the new beneficiary address",
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ api, acloser, err := lcli.GetFullNodeAPI(cctx)
+ if err != nil {
+ return xerrors.Errorf("getting fullnode api: %w", err)
+ }
+ defer acloser()
+
+ ctx := lcli.ReqContext(cctx)
+
+ maddr, err := address.NewFromString(cctx.Args().First())
+ if err != nil {
+ return xerrors.Errorf("parsing beneficiary address: %w", err)
+ }
+
+ mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK)
+ if err != nil {
+ return xerrors.Errorf("getting miner info: %w", err)
+ }
+
+ if mi.PendingBeneficiaryTerm == nil {
+ return fmt.Errorf("no pending beneficiary term found for miner %s", maddr)
+ }
+
+ if (cctx.IsSet("existing-beneficiary") && cctx.IsSet("new-beneficiary")) || (!cctx.IsSet("existing-beneficiary") && !cctx.IsSet("new-beneficiary")) {
+ return lcli.ShowHelp(cctx, fmt.Errorf("must pass exactly one of --existing-beneficiary or --new-beneficiary"))
+ }
+
+ var fromAddr address.Address
+ if cctx.IsSet("existing-beneficiary") {
+ if mi.PendingBeneficiaryTerm.ApprovedByBeneficiary {
+ return fmt.Errorf("beneficiary change already approved by current beneficiary")
+ }
+ fromAddr = mi.Beneficiary
+ } else {
+ if mi.PendingBeneficiaryTerm.ApprovedByNominee {
+ return fmt.Errorf("beneficiary change already approved by new beneficiary")
+ }
+ fromAddr = mi.PendingBeneficiaryTerm.NewBeneficiary
+ }
+
+ fmt.Println("Confirming Pending Beneficiary Term of:")
+ fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary)
+ fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota)
+ fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration)
+
+ if !cctx.Bool("really-do-it") {
+ fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please")
+ return nil
+ }
+
+ params := &miner.ChangeBeneficiaryParams{
+ NewBeneficiary: mi.PendingBeneficiaryTerm.NewBeneficiary,
+ NewQuota: mi.PendingBeneficiaryTerm.NewQuota,
+ NewExpiration: mi.PendingBeneficiaryTerm.NewExpiration,
+ }
+
+ sp, err := actors.SerializeParams(params)
+ if err != nil {
+ return xerrors.Errorf("serializing params: %w", err)
+ }
+
+ smsg, err := api.MpoolPushMessage(ctx, &types.Message{
+ From: fromAddr,
+ To: maddr,
+ Method: builtin.MethodsMiner.ChangeBeneficiary,
+ Value: big.Zero(),
+ Params: sp,
+ }, nil)
+ if err != nil {
+ return xerrors.Errorf("mpool push: %w", err)
+ }
+
+ fmt.Println("Confirm Message CID:", smsg.Cid())
+
+ // wait for it to get mined into a block
+ wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence)
+ if err != nil {
+ return xerrors.Errorf("waiting for message to be included in block: %w", err)
+ }
+
+ // check it executed successfully
+ if wait.Receipt.ExitCode.IsError() {
+ return fmt.Errorf("confirm beneficiary change failed with code %d", wait.Receipt.ExitCode)
+ }
+
+ updatedMinerInfo, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == mi.PendingBeneficiaryTerm.NewBeneficiary {
+ fmt.Println("Beneficiary address successfully changed")
+ } else {
+ fmt.Println("Beneficiary address change awaiting additional confirmations")
+ }
+
+ return nil
+ },
+}
+
var actorCompactAllocatedCmd = &cli.Command{
Name: "compact-allocated",
Usage: "compact allocated sectors bitfield",
@@ -1046,7 +1317,7 @@ var actorCompactAllocatedCmd = &cli.Command{
return fmt.Errorf("must pass address of new owner address")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -1060,7 +1331,7 @@ var actorCompactAllocatedCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -1160,7 +1431,7 @@ var actorCompactAllocatedCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Println("Propose owner change failed!")
return err
}
diff --git a/cmd/lotus-miner/dagstore.go b/cmd/lotus-miner/dagstore.go
index 37d048825..519b43cc7 100644
--- a/cmd/lotus-miner/dagstore.go
+++ b/cmd/lotus-miner/dagstore.go
@@ -77,7 +77,7 @@ var dagstoreRegisterShardCmd = &cli.Command{
}
if cctx.NArg() != 1 {
- return fmt.Errorf("must provide a single shard key")
+ return lcli.IncorrectNumArgs(cctx)
}
marketsAPI, closer, err := lcli.GetMarketsAPI(cctx)
@@ -116,7 +116,7 @@ var dagstoreInitializeShardCmd = &cli.Command{
}
if cctx.NArg() != 1 {
- return fmt.Errorf("must provide a single shard key")
+ return lcli.IncorrectNumArgs(cctx)
}
marketsApi, closer, err := lcli.GetMarketsAPI(cctx)
@@ -148,7 +148,7 @@ var dagstoreRecoverShardCmd = &cli.Command{
}
if cctx.NArg() != 1 {
- return fmt.Errorf("must provide a single shard key")
+ return lcli.IncorrectNumArgs(cctx)
}
marketsApi, closer, err := lcli.GetMarketsAPI(cctx)
@@ -330,7 +330,7 @@ var dagstoreLookupPiecesCmd = &cli.Command{
}
if cctx.NArg() != 1 {
- return fmt.Errorf("must provide a CID")
+ return lcli.IncorrectNumArgs(cctx)
}
cidStr := cctx.Args().First()
diff --git a/cmd/lotus-miner/index_provider.go b/cmd/lotus-miner/index_provider.go
index 1e4b69d86..4ed14549d 100644
--- a/cmd/lotus-miner/index_provider.go
+++ b/cmd/lotus-miner/index_provider.go
@@ -36,7 +36,7 @@ var indexProvAnnounceCmd = &cli.Command{
}
if cctx.NArg() != 1 {
- return fmt.Errorf("must provide the deal proposal CID")
+ return lcli.IncorrectNumArgs(cctx)
}
proposalCidStr := cctx.Args().First()
diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go
index 408482a89..d791b0760 100644
--- a/cmd/lotus-miner/info.go
+++ b/cmd/lotus-miner/info.go
@@ -33,6 +33,7 @@ import (
"github.com/filecoin-project/lotus/chain/actors/builtin/reward"
"github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
+ cliutil "github.com/filecoin-project/lotus/cli/util"
"github.com/filecoin-project/lotus/journal/alerting"
sealing "github.com/filecoin-project/lotus/storage/pipeline"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
@@ -92,6 +93,12 @@ func infoCmdAct(cctx *cli.Context) error {
fmt.Println("Enabled subsystems (from markets API):", subsystems)
+ start, err := minerApi.StartTime(ctx)
+ if err != nil {
+ return err
+ }
+ fmt.Printf("StartTime: %s (started at %s)\n", time.Now().Sub(start).Truncate(time.Second), start.Truncate(time.Second))
+
fmt.Print("Chain: ")
err = lcli.SyncBasefeeCheck(ctx, fullapi)
@@ -313,6 +320,23 @@ func handleMiningInfo(ctx context.Context, cctx *cli.Context, fullapi v1api.Full
}
colorTokenAmount("Total Spendable: %s\n", spendable)
+ if mi.Beneficiary != address.Undef {
+ fmt.Println()
+ fmt.Printf("Beneficiary:\t%s\n", mi.Beneficiary)
+ if mi.Beneficiary != mi.Owner {
+ fmt.Printf("Beneficiary Quota:\t%s\n", mi.BeneficiaryTerm.Quota)
+ fmt.Printf("Beneficiary Used Quota:\t%s\n", mi.BeneficiaryTerm.UsedQuota)
+ fmt.Printf("Beneficiary Expiration:\t%s\n", mi.BeneficiaryTerm.Expiration)
+ }
+ }
+ if mi.PendingBeneficiaryTerm != nil {
+ fmt.Printf("Pending Beneficiary Term:\n")
+ fmt.Printf("New Beneficiary:\t%s\n", mi.PendingBeneficiaryTerm.NewBeneficiary)
+ fmt.Printf("New Quota:\t%s\n", mi.PendingBeneficiaryTerm.NewQuota)
+ fmt.Printf("New Expiration:\t%s\n", mi.PendingBeneficiaryTerm.NewExpiration)
+ fmt.Printf("Approved By Beneficiary:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByBeneficiary)
+ fmt.Printf("Approved By Nominee:\t%t\n", mi.PendingBeneficiaryTerm.ApprovedByNominee)
+ }
fmt.Println()
if !cctx.Bool("hide-sectors-info") {
@@ -481,6 +505,8 @@ var stateList = []stateMeta{
{col: color.FgGreen, state: sealing.Available},
{col: color.FgGreen, state: sealing.UpdateActivating},
+ {col: color.FgMagenta, state: sealing.ReceiveSector},
+
{col: color.FgBlue, state: sealing.Empty},
{col: color.FgBlue, state: sealing.WaitDeals},
{col: color.FgBlue, state: sealing.AddPiece},
@@ -509,6 +535,7 @@ var stateList = []stateMeta{
{col: color.FgYellow, state: sealing.ProveReplicaUpdate},
{col: color.FgYellow, state: sealing.SubmitReplicaUpdate},
{col: color.FgYellow, state: sealing.ReplicaUpdateWait},
+ {col: color.FgYellow, state: sealing.WaitMutable},
{col: color.FgYellow, state: sealing.FinalizeReplicaUpdate},
{col: color.FgYellow, state: sealing.ReleaseSectorKey},
@@ -526,6 +553,7 @@ var stateList = []stateMeta{
{col: color.FgRed, state: sealing.SealPreCommit2Failed},
{col: color.FgRed, state: sealing.PreCommitFailed},
{col: color.FgRed, state: sealing.ComputeProofFailed},
+ {col: color.FgRed, state: sealing.RemoteCommitFailed},
{col: color.FgRed, state: sealing.CommitFailed},
{col: color.FgRed, state: sealing.CommitFinalizeFailed},
{col: color.FgRed, state: sealing.PackingFailed},
@@ -638,7 +666,7 @@ func producedBlocks(ctx context.Context, count int, maddr address.Address, napi
fmt.Printf("%8d | %s | %s\n", ts.Height(), bh.Cid(), types.FIL(minerReward))
count--
} else if tty && bh.Height%120 == 0 {
- _, _ = fmt.Fprintf(os.Stderr, "\r\x1b[0KChecking epoch %s", lcli.EpochTime(head.Height(), bh.Height))
+ _, _ = fmt.Fprintf(os.Stderr, "\r\x1b[0KChecking epoch %s", cliutil.EpochTime(head.Height(), bh.Height))
}
}
tsk = ts.Parents()
diff --git a/cmd/lotus-miner/info_all.go b/cmd/lotus-miner/info_all.go
index 38cc7fc05..bf6d7e4b9 100644
--- a/cmd/lotus-miner/info_all.go
+++ b/cmd/lotus-miner/info_all.go
@@ -16,7 +16,7 @@ var infoAllCmd = &cli.Command{
Name: "all",
Usage: "dump all related miner info",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -220,7 +220,7 @@ var infoAllCmd = &cli.Command{
// Very Very Verbose info
fmt.Println("\n#: Per Sector Info")
- list, err := nodeApi.SectorsList(ctx)
+ list, err := minerApi.SectorsList(ctx)
if err != nil {
fmt.Println("ERROR: ", err)
}
diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go
index 055df69ef..66a6691af 100644
--- a/cmd/lotus-miner/init.go
+++ b/cmd/lotus-miner/init.go
@@ -29,7 +29,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-statestore"
miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner"
power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power"
@@ -42,7 +42,6 @@ import (
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
- "github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/gen/slashfilter"
"github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
@@ -50,6 +49,7 @@ import (
"github.com/filecoin-project/lotus/journal"
"github.com/filecoin-project/lotus/journal/fsjournal"
storageminer "github.com/filecoin-project/lotus/miner"
+ "github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/node/modules"
"github.com/filecoin-project/lotus/node/modules/dtypes"
"github.com/filecoin-project/lotus/node/repo"
@@ -91,7 +91,6 @@ var initCmd = &cli.Command{
&cli.StringFlag{
Name: "sector-size",
Usage: "specify sector size to use",
- Value: units.BytesSize(float64(policy.GetDefaultSectorSize())),
},
&cli.StringSliceFlag{
Name: "pre-sealed-sectors",
@@ -130,11 +129,18 @@ var initCmd = &cli.Command{
Action: func(cctx *cli.Context) error {
log.Info("Initializing lotus miner")
- sectorSizeInt, err := units.RAMInBytes(cctx.String("sector-size"))
+ ssize, err := abi.RegisteredSealProof_StackedDrg32GiBV1.SectorSize()
if err != nil {
- return err
+ return xerrors.Errorf("failed to calculate default sector size: %w", err)
+ }
+
+ if cctx.IsSet("sector-size") {
+ sectorSizeInt, err := units.RAMInBytes(cctx.String("sector-size"))
+ if err != nil {
+ return err
+ }
+ ssize = abi.SectorSize(sectorSizeInt)
}
- ssize := abi.SectorSize(sectorSizeInt)
gasPrice, err := types.BigFromString(cctx.String("gas-premium"))
if err != nil {
@@ -213,7 +219,7 @@ var initCmd = &cli.Command{
return err
}
- var localPaths []paths.LocalPath
+ var localPaths []storiface.LocalPath
if pssb := cctx.StringSlice("pre-sealed-sectors"); len(pssb) != 0 {
log.Infof("Setting up storage config with presealed sectors: %v", pssb)
@@ -223,14 +229,14 @@ var initCmd = &cli.Command{
if err != nil {
return err
}
- localPaths = append(localPaths, paths.LocalPath{
+ localPaths = append(localPaths, storiface.LocalPath{
Path: psp,
})
}
}
if !cctx.Bool("no-local-storage") {
- b, err := json.MarshalIndent(&paths.LocalStorageMeta{
+ b, err := json.MarshalIndent(&storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 10,
CanSeal: true,
@@ -244,12 +250,12 @@ var initCmd = &cli.Command{
return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(lr.Path(), "sectorstore.json"), err)
}
- localPaths = append(localPaths, paths.LocalPath{
+ localPaths = append(localPaths, storiface.LocalPath{
Path: lr.Path(),
})
}
- if err := lr.SetStorage(func(sc *paths.StorageConfig) {
+ if err := lr.SetStorage(func(sc *storiface.StorageConfig) {
sc.StoragePaths = append(sc.StoragePaths, localPaths...)
}); err != nil {
return xerrors.Errorf("set storage config: %w", err)
@@ -315,7 +321,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string
info := &pipeline.SectorInfo{
State: pipeline.Proving,
SectorNumber: sector.SectorID,
- Pieces: []pipeline.Piece{
+ Pieces: []lapi.SectorPiece{
{
Piece: abi.PieceInfo{
Size: abi.PaddedPieceSize(meta.SectorSize),
@@ -390,7 +396,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string
return mds.Put(ctx, datastore.NewKey(pipeline.StorageCounterDSPrefix), buf[:size])
}
-func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market8.DealProposal) (abi.DealID, error) {
+func findMarketDealID(ctx context.Context, api v1api.FullNode, deal markettypes.DealProposal) (abi.DealID, error) {
// TODO: find a better way
// (this is only used by genesis miners)
@@ -466,7 +472,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode
}
stor := paths.NewRemote(lstor, si, http.Header(sa), 10, &paths.DefaultPartialFileHandler{})
- smgr, err := sealer.New(ctx, lstor, stor, lr, si, sealer.Config{
+ smgr, err := sealer.New(ctx, lstor, stor, lr, si, config.SealerConfig{
ParallelFetchLimit: 10,
AllowAddPiece: true,
AllowPreCommit1: true,
@@ -476,7 +482,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode
AllowReplicaUpdate: true,
AllowProveReplicaUpdate2: true,
AllowRegenSectorKey: true,
- }, wsts, smsts)
+ }, config.ProvingConfig{}, wsts, smsts)
if err != nil {
return err
}
@@ -542,7 +548,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode
addr = a
} else {
- a, err := createStorageMiner(ctx, api, peerid, gasPrice, cctx)
+ a, err := createStorageMiner(ctx, api, ssize, peerid, gasPrice, cctx)
if err != nil {
return xerrors.Errorf("creating miner failed: %w", err)
}
@@ -622,7 +628,7 @@ func configureStorageMiner(ctx context.Context, api v1api.FullNode, addr address
return nil
}
-func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID, gasPrice types.BigInt, cctx *cli.Context) (address.Address, error) {
+func createStorageMiner(ctx context.Context, api v1api.FullNode, ssize abi.SectorSize, peerid peer.ID, gasPrice types.BigInt, cctx *cli.Context) (address.Address, error) {
var err error
var owner address.Address
if cctx.String("owner") != "" {
@@ -634,11 +640,6 @@ func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID,
return address.Undef, err
}
- ssize, err := units.RAMInBytes(cctx.String("sector-size"))
- if err != nil {
- return address.Undef, fmt.Errorf("failed to parse sector size: %w", err)
- }
-
worker := owner
if cctx.String("worker") != "" {
worker, err = address.NewFromString(cctx.String("worker"))
@@ -713,7 +714,7 @@ func createStorageMiner(ctx context.Context, api v1api.FullNode, peerid peer.ID,
}
// Note: the correct thing to do would be to call SealProofTypeFromSectorSize if actors version is v3 or later, but this still works
- spt, err := miner.WindowPoStProofTypeFromSectorSize(abi.SectorSize(ssize))
+ spt, err := miner.WindowPoStProofTypeFromSectorSize(ssize)
if err != nil {
return address.Undef, xerrors.Errorf("getting post proof type: %w", err)
}
diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go
index a54146fb2..618825a27 100644
--- a/cmd/lotus-miner/init_restore.go
+++ b/cmd/lotus-miner/init_restore.go
@@ -27,7 +27,7 @@ import (
"github.com/filecoin-project/lotus/lib/backupds"
"github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/node/repo"
- "github.com/filecoin-project/lotus/storage/paths"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
var restoreCmd = &cli.Command{
@@ -52,7 +52,7 @@ var restoreCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
log.Info("Initializing lotus miner using a backup")
- var storageCfg *paths.StorageConfig
+ var storageCfg *storiface.StorageConfig
if cctx.IsSet("storage-config") {
cf, err := homedir.Expand(cctx.String("storage-config"))
if err != nil {
@@ -64,7 +64,7 @@ var restoreCmd = &cli.Command{
return xerrors.Errorf("reading storage config: %w", err)
}
- storageCfg = &paths.StorageConfig{}
+ storageCfg = &storiface.StorageConfig{}
err = json.Unmarshal(cfb, storageCfg)
if err != nil {
return xerrors.Errorf("cannot unmarshal json for storage config: %w", err)
@@ -95,9 +95,9 @@ var restoreCmd = &cli.Command{
},
}
-func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfig *paths.StorageConfig, manageConfig func(*config.StorageMiner) error, after func(api lapi.FullNode, addr address.Address, peerid peer.ID, mi api.MinerInfo) error) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("expected 1 argument")
+func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfig *storiface.StorageConfig, manageConfig func(*config.StorageMiner) error, after func(api lapi.FullNode, addr address.Address, peerid peer.ID, mi api.MinerInfo) error) error {
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
log.Info("Trying to connect to full node RPC")
@@ -214,7 +214,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi
if strConfig != nil {
log.Info("Restoring storage path config")
- err = lr.SetStorage(func(scfg *paths.StorageConfig) {
+ err = lr.SetStorage(func(scfg *storiface.StorageConfig) {
*scfg = *strConfig
})
if err != nil {
@@ -223,8 +223,8 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi
} else {
log.Warn("--storage-config NOT SET. NO SECTOR PATHS WILL BE CONFIGURED")
// setting empty config to allow miner to be started
- if err := lr.SetStorage(func(sc *paths.StorageConfig) {
- sc.StoragePaths = append(sc.StoragePaths, paths.LocalPath{})
+ if err := lr.SetStorage(func(sc *storiface.StorageConfig) {
+ sc.StoragePaths = append(sc.StoragePaths, storiface.LocalPath{})
}); err != nil {
return xerrors.Errorf("set storage config: %w", err)
}
diff --git a/cmd/lotus-miner/init_service.go b/cmd/lotus-miner/init_service.go
index 41838965a..235e4e4c8 100644
--- a/cmd/lotus-miner/init_service.go
+++ b/cmd/lotus-miner/init_service.go
@@ -17,7 +17,7 @@ import (
lcli "github.com/filecoin-project/lotus/cli"
cliutil "github.com/filecoin-project/lotus/cli/util"
"github.com/filecoin-project/lotus/node/config"
- "github.com/filecoin-project/lotus/storage/paths"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
const (
@@ -78,7 +78,7 @@ var serviceCmd = &cli.Command{
return xerrors.Errorf("please provide Lotus markets repo path via flag %s", FlagMarketsRepo)
}
- if err := restore(ctx, cctx, repoPath, &paths.StorageConfig{}, func(cfg *config.StorageMiner) error {
+ if err := restore(ctx, cctx, repoPath, &storiface.StorageConfig{}, func(cfg *config.StorageMiner) error {
cfg.Subsystems.EnableMarkets = es.Contains(MarketsService)
cfg.Subsystems.EnableMining = false
cfg.Subsystems.EnableSealing = false
diff --git a/cmd/lotus-miner/main.go b/cmd/lotus-miner/main.go
index 0462373ae..3cc796168 100644
--- a/cmd/lotus-miner/main.go
+++ b/cmd/lotus-miner/main.go
@@ -177,13 +177,13 @@ func getActorAddress(ctx context.Context, cctx *cli.Context) (maddr address.Addr
return
}
- nodeAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return address.Undef, err
}
defer closer()
- maddr, err = nodeAPI.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return maddr, xerrors.Errorf("getting actor address: %w", err)
}
diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go
index 37d252efa..706e49236 100644
--- a/cmd/lotus-miner/market.go
+++ b/cmd/lotus-miner/market.go
@@ -370,8 +370,8 @@ var dealsImportDataCmd = &cli.Command{
ctx := lcli.DaemonContext(cctx)
- if cctx.Args().Len() < 2 {
- return fmt.Errorf("must specify proposal CID and file path")
+ if cctx.NArg() != 2 {
+ return lcli.IncorrectNumArgs(cctx)
}
propCid, err := cid.Decode(cctx.Args().Get(0))
@@ -617,8 +617,8 @@ var setSealDurationCmd = &cli.Command{
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass duration in minutes")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
hs, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
diff --git a/cmd/lotus-miner/precommits-info.go b/cmd/lotus-miner/precommits-info.go
index 034378cff..0ce757537 100644
--- a/cmd/lotus-miner/precommits-info.go
+++ b/cmd/lotus-miner/precommits-info.go
@@ -7,7 +7,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/urfave/cli/v2"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/specs-actors/v7/actors/util/adt"
"github.com/filecoin-project/lotus/blockstore"
diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go
index 85bc48e78..9ae8bdd48 100644
--- a/cmd/lotus-miner/proving.go
+++ b/cmd/lotus-miner/proving.go
@@ -26,6 +26,7 @@ import (
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
+ cliutil "github.com/filecoin-project/lotus/cli/util"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -185,18 +186,18 @@ var provingInfoCmd = &cli.Command{
fmt.Printf("Current Epoch: %d\n", cd.CurrentEpoch)
fmt.Printf("Proving Period Boundary: %d\n", cd.PeriodStart%cd.WPoStProvingPeriod)
- fmt.Printf("Proving Period Start: %s\n", lcli.EpochTimeTs(cd.CurrentEpoch, cd.PeriodStart, head))
- fmt.Printf("Next Period Start: %s\n\n", lcli.EpochTimeTs(cd.CurrentEpoch, cd.PeriodStart+cd.WPoStProvingPeriod, head))
+ fmt.Printf("Proving Period Start: %s\n", cliutil.EpochTimeTs(cd.CurrentEpoch, cd.PeriodStart, head))
+ fmt.Printf("Next Period Start: %s\n\n", cliutil.EpochTimeTs(cd.CurrentEpoch, cd.PeriodStart+cd.WPoStProvingPeriod, head))
fmt.Printf("Faults: %d (%.2f%%)\n", faults, faultPerc)
fmt.Printf("Recovering: %d\n", recovering)
fmt.Printf("Deadline Index: %d\n", cd.Index)
fmt.Printf("Deadline Sectors: %d\n", curDeadlineSectors)
- fmt.Printf("Deadline Open: %s\n", lcli.EpochTime(cd.CurrentEpoch, cd.Open))
- fmt.Printf("Deadline Close: %s\n", lcli.EpochTime(cd.CurrentEpoch, cd.Close))
- fmt.Printf("Deadline Challenge: %s\n", lcli.EpochTime(cd.CurrentEpoch, cd.Challenge))
- fmt.Printf("Deadline FaultCutoff: %s\n", lcli.EpochTime(cd.CurrentEpoch, cd.FaultCutoff))
+ fmt.Printf("Deadline Open: %s\n", cliutil.EpochTime(cd.CurrentEpoch, cd.Open))
+ fmt.Printf("Deadline Close: %s\n", cliutil.EpochTime(cd.CurrentEpoch, cd.Close))
+ fmt.Printf("Deadline Challenge: %s\n", cliutil.EpochTime(cd.CurrentEpoch, cd.Challenge))
+ fmt.Printf("Deadline FaultCutoff: %s\n", cliutil.EpochTime(cd.CurrentEpoch, cd.FaultCutoff))
return nil
},
}
@@ -314,8 +315,8 @@ var provingDeadlineInfoCmd = &cli.Command{
ArgsUsage: "",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass deadline index")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
dlIdx, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -461,8 +462,8 @@ var provingCheckProvableCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass deadline index")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
dlIdx, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -476,7 +477,7 @@ var provingCheckProvableCmd = &cli.Command{
}
defer closer()
- sapi, scloser, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, scloser, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -484,7 +485,7 @@ var provingCheckProvableCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
- addr, err := sapi.ActorAddress(ctx)
+ addr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -510,7 +511,7 @@ var provingCheckProvableCmd = &cli.Command{
var filter map[abi.SectorID]struct{}
if cctx.IsSet("storage-id") {
- sl, err := sapi.StorageList(ctx)
+ sl, err := minerApi.StorageList(ctx)
if err != nil {
return err
}
@@ -582,7 +583,7 @@ var provingCheckProvableCmd = &cli.Command{
})
}
- bad, err := sapi.CheckProvable(ctx, info.WindowPoStProofType, tocheck, cctx.Bool("slow"))
+ bad, err := minerApi.CheckProvable(ctx, info.WindowPoStProofType, tocheck)
if err != nil {
return err
}
@@ -616,8 +617,8 @@ var provingComputeWindowPoStCmd = &cli.Command{
It will not send any messages to the chain.`,
ArgsUsage: "[deadline index]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass deadline index")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
dlIdx, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -625,7 +626,7 @@ It will not send any messages to the chain.`,
return xerrors.Errorf("could not parse deadline index: %w", err)
}
- sapi, scloser, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, scloser, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -634,7 +635,7 @@ It will not send any messages to the chain.`,
ctx := lcli.ReqContext(cctx)
start := time.Now()
- res, err := sapi.ComputeWindowPoSt(ctx, dlIdx, types.EmptyTSK)
+ res, err := minerApi.ComputeWindowPoSt(ctx, dlIdx, types.EmptyTSK)
fmt.Printf("Took %s\n", time.Now().Sub(start))
if err != nil {
return err
@@ -661,8 +662,8 @@ var provingRecoverFaultsCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 1 {
- return xerrors.Errorf("must pass at least 1 sector number")
+ if cctx.NArg() < 1 {
+ return lcli.ShowHelp(cctx, xerrors.Errorf("must pass at least 1 sector number"))
}
arglist := cctx.Args().Slice()
@@ -675,7 +676,7 @@ var provingRecoverFaultsCmd = &cli.Command{
sectors = append(sectors, abi.SectorNumber(s))
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -689,7 +690,7 @@ var provingRecoverFaultsCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
- msgs, err := nodeApi.RecoverFault(ctx, sectors)
+ msgs, err := minerApi.RecoverFault(ctx, sectors)
if err != nil {
return err
}
@@ -707,7 +708,7 @@ var provingRecoverFaultsCmd = &cli.Command{
return
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
results <- xerrors.Errorf("Failed to execute message %s: %w", wait.Message, wait.Receipt.ExitCode.Error())
return
}
diff --git a/cmd/lotus-miner/sealing.go b/cmd/lotus-miner/sealing.go
index 970f54a55..4810b9ab9 100644
--- a/cmd/lotus-miner/sealing.go
+++ b/cmd/lotus-miner/sealing.go
@@ -57,7 +57,7 @@ func workersCmd(sealing bool) *cli.Command {
color.NoColor = !cctx.Bool("color")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -65,7 +65,7 @@ func workersCmd(sealing bool) *cli.Command {
ctx := lcli.ReqContext(cctx)
- stats, err := nodeApi.WorkerStats(ctx)
+ stats, err := minerApi.WorkerStats(ctx)
if err != nil {
return err
}
@@ -146,7 +146,7 @@ func workersCmd(sealing bool) *cli.Command {
})
var taskStr string
for _, t := range tc {
- taskStr = t[1] + " "
+ taskStr += t[1] + " "
}
if taskStr != "" {
fmt.Printf("\tTASK: %s\n", taskStr)
@@ -233,7 +233,7 @@ var sealingJobsCmd = &cli.Command{
color.NoColor = !cctx.Bool("color")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -241,7 +241,7 @@ var sealingJobsCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
- jobs, err := nodeApi.WorkerJobs(ctx)
+ jobs, err := minerApi.WorkerJobs(ctx)
if err != nil {
return xerrors.Errorf("getting worker jobs: %w", err)
}
@@ -275,7 +275,7 @@ var sealingJobsCmd = &cli.Command{
workerHostnames := map[uuid.UUID]string{}
- wst, err := nodeApi.WorkerStats(ctx)
+ wst, err := minerApi.WorkerStats(ctx)
if err != nil {
return xerrors.Errorf("getting worker stats: %w", err)
}
@@ -337,7 +337,7 @@ var sealingSchedDiagCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -345,7 +345,7 @@ var sealingSchedDiagCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
- st, err := nodeApi.SealingSchedDiag(ctx, cctx.Bool("force-sched"))
+ st, err := minerApi.SealingSchedDiag(ctx, cctx.Bool("force-sched"))
if err != nil {
return err
}
@@ -372,11 +372,11 @@ var sealingAbortCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("expected 1 argument")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -385,14 +385,14 @@ var sealingAbortCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
if cctx.Bool("sched") {
- err = nodeApi.SealingRemoveRequest(ctx, uuid.Must(uuid.Parse(cctx.Args().First())))
+ err = minerApi.SealingRemoveRequest(ctx, uuid.Must(uuid.Parse(cctx.Args().First())))
if err != nil {
return xerrors.Errorf("Failed to removed the request with UUID %s: %w", cctx.Args().First(), err)
}
return nil
}
- jobs, err := nodeApi.WorkerJobs(ctx)
+ jobs, err := minerApi.WorkerJobs(ctx)
if err != nil {
return xerrors.Errorf("getting worker jobs: %w", err)
}
@@ -415,7 +415,7 @@ var sealingAbortCmd = &cli.Command{
fmt.Printf("aborting job %s, task %s, sector %d, running on host %s\n", job.ID.String(), job.Task.Short(), job.Sector.Number, job.Hostname)
- return nodeApi.SealingAbort(ctx, job.ID)
+ return minerApi.SealingAbort(ctx, job.ID)
},
}
@@ -430,11 +430,11 @@ var sealingDataCidCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 1 || cctx.Args().Len() > 2 {
- return xerrors.Errorf("expected 1 or 2 arguments")
+ if cctx.NArg() < 1 || cctx.NArg() > 2 {
+ return lcli.ShowHelp(cctx, xerrors.Errorf("expected 1 or 2 arguments"))
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -484,7 +484,7 @@ var sealingDataCidCmd = &cli.Command{
}
var psize abi.PaddedPieceSize
- if cctx.Args().Len() == 2 {
+ if cctx.NArg() == 2 {
rps, err := humanize.ParseBytes(cctx.Args().Get(1))
if err != nil {
return xerrors.Errorf("parsing piece size: %w", err)
@@ -500,7 +500,7 @@ var sealingDataCidCmd = &cli.Command{
psize = padreader.PaddedSize(sz).Padded()
}
- pc, err := nodeApi.ComputeDataCid(ctx, psize.Unpadded(), r)
+ pc, err := minerApi.ComputeDataCid(ctx, psize.Unpadded(), r)
if err != nil {
return xerrors.Errorf("computing data CID: %w", err)
}
diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go
index 84c2d8e95..3bb904d7a 100644
--- a/cmd/lotus-miner/sectors.go
+++ b/cmd/lotus-miner/sectors.go
@@ -21,7 +21,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/api"
@@ -32,6 +32,7 @@ import (
"github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
+ cliutil "github.com/filecoin-project/lotus/cli/util"
"github.com/filecoin-project/lotus/lib/strle"
"github.com/filecoin-project/lotus/lib/tablewriter"
sealing "github.com/filecoin-project/lotus/storage/pipeline"
@@ -69,14 +70,14 @@ var sectorsPledgeCmd = &cli.Command{
Name: "pledge",
Usage: "store random data in a sector",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- id, err := nodeApi.PledgeSector(ctx)
+ id, err := minerApi.PledgeSector(ctx)
if err != nil {
return err
}
@@ -113,7 +114,7 @@ var sectorsStatusCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -130,7 +131,7 @@ var sectorsStatusCmd = &cli.Command{
}
onChainInfo := cctx.Bool("on-chain-info")
- status, err := nodeApi.SectorsStatus(ctx, abi.SectorNumber(id), onChainInfo)
+ status, err := minerApi.SectorsStatus(ctx, abi.SectorNumber(id), onChainInfo)
if err != nil {
return err
}
@@ -318,7 +319,7 @@ var sectorsListCmd = &cli.Command{
color.NoColor = !cctx.Bool("color")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -359,16 +360,16 @@ var sectorsListCmd = &cli.Command{
}
if len(states) == 0 {
- list, err = nodeApi.SectorsList(ctx)
+ list, err = minerApi.SectorsList(ctx)
} else {
- list, err = nodeApi.SectorsListInStates(ctx, states)
+ list, err = minerApi.SectorsListInStates(ctx, states)
}
if err != nil {
return err
}
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -418,7 +419,7 @@ var sectorsListCmd = &cli.Command{
fast := cctx.Bool("fast")
for _, s := range list {
- st, err := nodeApi.SectorsStatus(ctx, s, !fast)
+ st, err := minerApi.SectorsStatus(ctx, s, !fast)
if err != nil {
tw.Write(map[string]interface{}{
"ID": s,
@@ -485,9 +486,9 @@ var sectorsListCmd = &cli.Command{
if !inSSet {
m["Expiration"] = "n/a"
} else {
- m["Expiration"] = lcli.EpochTime(head.Height(), exp)
+ m["Expiration"] = cliutil.EpochTime(head.Height(), exp)
if st.Early > 0 {
- m["RecoveryTimeout"] = color.YellowString(lcli.EpochTime(head.Height(), st.Early))
+ m["RecoveryTimeout"] = color.YellowString(cliutil.EpochTime(head.Height(), st.Early))
}
}
if inSSet && cctx.Bool("initial-pledge") {
@@ -666,10 +667,10 @@ var sectorsCheckExpireCmd = &cli.Command{
"ID": sector.SectorNumber,
"SealProof": sector.SealProof,
"InitialPledge": types.FIL(sector.InitialPledge).Short(),
- "Activation": lcli.EpochTime(currEpoch, sector.Activation),
- "Expiration": lcli.EpochTime(currEpoch, sector.Expiration),
- "MaxExpiration": lcli.EpochTime(currEpoch, MaxExpiration),
- "MaxExtendNow": lcli.EpochTime(currEpoch, MaxExtendNow),
+ "Activation": cliutil.EpochTime(currEpoch, sector.Activation),
+ "Expiration": cliutil.EpochTime(currEpoch, sector.Expiration),
+ "MaxExpiration": cliutil.EpochTime(currEpoch, MaxExpiration),
+ "MaxExtendNow": cliutil.EpochTime(currEpoch, MaxExtendNow),
})
}
@@ -921,6 +922,9 @@ var sectorsRenewCmd = &cli.Command{
if !found {
return xerrors.Errorf("sector %d is not active", id)
}
+ if len(si.DealIDs) > 0 && cctx.Bool("only-cc") {
+ continue
+ }
sis = append(sis, si)
}
@@ -1372,14 +1376,14 @@ var sectorsTerminateCmd = &cli.Command{
if !cctx.Bool("really-do-it") {
return xerrors.Errorf("pass --really-do-it to confirm this action")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass sector number")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -1387,7 +1391,7 @@ var sectorsTerminateCmd = &cli.Command{
return xerrors.Errorf("could not parse sector number: %w", err)
}
- return nodeApi.SectorTerminate(ctx, abi.SectorNumber(id))
+ return minerApi.SectorTerminate(ctx, abi.SectorNumber(id))
},
}
@@ -1395,14 +1399,14 @@ var sectorsTerminateFlushCmd = &cli.Command{
Name: "flush",
Usage: "Send a terminate message if there are sectors queued for termination",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- mcid, err := nodeApi.SectorTerminateFlush(ctx)
+ mcid, err := minerApi.SectorTerminateFlush(ctx)
if err != nil {
return err
}
@@ -1421,7 +1425,7 @@ var sectorsTerminatePendingCmd = &cli.Command{
Name: "pending",
Usage: "List sector numbers of sectors pending termination",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -1433,12 +1437,12 @@ var sectorsTerminatePendingCmd = &cli.Command{
defer nCloser()
ctx := lcli.ReqContext(cctx)
- pending, err := nodeApi.SectorTerminatePending(ctx)
+ pending, err := minerAPI.SectorTerminatePending(ctx)
if err != nil {
return err
}
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerAPI.ActorAddress(ctx)
if err != nil {
return err
}
@@ -1482,14 +1486,14 @@ var sectorsRemoveCmd = &cli.Command{
if !cctx.Bool("really-do-it") {
return xerrors.Errorf("this is a command for advanced users, only use it if you are sure of what you are doing")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass sector number")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -1497,7 +1501,7 @@ var sectorsRemoveCmd = &cli.Command{
return xerrors.Errorf("could not parse sector number: %w", err)
}
- return nodeApi.SectorRemove(ctx, abi.SectorNumber(id))
+ return minerAPI.SectorRemove(ctx, abi.SectorNumber(id))
},
}
@@ -1506,11 +1510,11 @@ var sectorsSnapUpCmd = &cli.Command{
Usage: "Mark a committed capacity sector to be filled with deals",
ArgsUsage: "",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number"))
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -1535,7 +1539,7 @@ var sectorsSnapUpCmd = &cli.Command{
return xerrors.Errorf("could not parse sector number: %w", err)
}
- return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), true)
+ return minerAPI.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), true)
},
}
@@ -1550,7 +1554,7 @@ var sectorsSnapAbortCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
+ if cctx.NArg() != 1 {
return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number"))
}
@@ -1560,7 +1564,7 @@ var sectorsSnapAbortCmd = &cli.Command{
return fmt.Errorf("--really-do-it must be specified for this action to have an effect; you have been warned")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -1572,7 +1576,7 @@ var sectorsSnapAbortCmd = &cli.Command{
return xerrors.Errorf("could not parse sector number: %w", err)
}
- return nodeApi.SectorAbortUpgrade(ctx, abi.SectorNumber(id))
+ return minerAPI.SectorAbortUpgrade(ctx, abi.SectorNumber(id))
},
}
@@ -1581,14 +1585,14 @@ var sectorsStartSealCmd = &cli.Command{
Usage: "Manually start sealing a sector (filling any unused space with junk)",
ArgsUsage: "",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass sector number")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -1596,7 +1600,7 @@ var sectorsStartSealCmd = &cli.Command{
return xerrors.Errorf("could not parse sector number: %w", err)
}
- return nodeApi.SectorStartSealing(ctx, abi.SectorNumber(id))
+ return minerAPI.SectorStartSealing(ctx, abi.SectorNumber(id))
},
}
@@ -1605,14 +1609,14 @@ var sectorsSealDelayCmd = &cli.Command{
Usage: "Set the time, in minutes, that a new sector waits for deals before sealing starts",
ArgsUsage: "",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("must pass duration in minutes")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
hs, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -1622,7 +1626,7 @@ var sectorsSealDelayCmd = &cli.Command{
delay := hs * uint64(time.Minute)
- return nodeApi.SectorSetSealDelay(ctx, time.Duration(delay))
+ return minerAPI.SectorSetSealDelay(ctx, time.Duration(delay))
},
}
@@ -1708,14 +1712,14 @@ var sectorsUpdateCmd = &cli.Command{
if !cctx.Bool("really-do-it") {
return xerrors.Errorf("this is a command for advanced users, only use it if you are sure of what you are doing")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() < 2 {
- return xerrors.Errorf("must pass sector number and new state")
+ if cctx.NArg() < 2 {
+ return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number and new state"))
}
id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
@@ -1723,7 +1727,7 @@ var sectorsUpdateCmd = &cli.Command{
return xerrors.Errorf("could not parse sector number: %w", err)
}
- _, err = nodeApi.SectorsStatus(ctx, abi.SectorNumber(id), false)
+ _, err = minerAPI.SectorsStatus(ctx, abi.SectorNumber(id), false)
if err != nil {
return xerrors.Errorf("sector %d not found, could not change state", id)
}
@@ -1737,7 +1741,7 @@ var sectorsUpdateCmd = &cli.Command{
return nil
}
- return nodeApi.SectorsUpdate(ctx, abi.SectorNumber(id), api.SectorState(cctx.Args().Get(1)))
+ return minerAPI.SectorsUpdate(ctx, abi.SectorNumber(id), api.SectorState(cctx.Args().Get(1)))
},
}
@@ -1765,7 +1769,7 @@ var sectorsExpiredCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -1805,7 +1809,7 @@ var sectorsExpiredCmd = &cli.Command{
return xerrors.Errorf("getting lookback tipset: %w", err)
}
- maddr, err := nodeApi.ActorAddress(ctx)
+ maddr, err := minerAPI.ActorAddress(ctx)
if err != nil {
return xerrors.Errorf("getting actor address: %w", err)
}
@@ -1813,7 +1817,7 @@ var sectorsExpiredCmd = &cli.Command{
// toCheck is a working bitfield which will only contain terminated sectors
toCheck := bitfield.New()
{
- sectors, err := nodeApi.SectorsList(ctx)
+ sectors, err := minerAPI.SectorsList(ctx)
if err != nil {
return xerrors.Errorf("getting sector list: %w", err)
}
@@ -1890,7 +1894,7 @@ var sectorsExpiredCmd = &cli.Command{
err = toCheck.ForEach(func(u uint64) error {
s := abi.SectorNumber(u)
- st, err := nodeApi.SectorsStatus(ctx, s, true)
+ st, err := minerAPI.SectorsStatus(ctx, s, true)
if err != nil {
fmt.Printf("%d:\tError getting status: %s\n", u, err)
return nil
@@ -1906,7 +1910,7 @@ var sectorsExpiredCmd = &cli.Command{
toRemove = append(toRemove, s)
}
- fmt.Printf("%d%s\t%s\t%s\n", s, rmMsg, st.State, lcli.EpochTime(head.Height(), st.Expiration))
+ fmt.Printf("%d%s\t%s\t%s\n", s, rmMsg, st.State, cliutil.EpochTime(head.Height(), st.Expiration))
return nil
})
@@ -1933,7 +1937,7 @@ var sectorsExpiredCmd = &cli.Command{
for _, number := range toRemove {
fmt.Printf("Removing sector\t%s:\t", color.YellowString("%d", number))
- err := nodeApi.SectorRemove(ctx, number)
+ err := minerAPI.SectorRemove(ctx, number)
if err != nil {
color.Red("ERROR: %s\n", err.Error())
} else {
@@ -1965,7 +1969,7 @@ var sectorsBatchingPendingCommit = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- api, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -1973,7 +1977,7 @@ var sectorsBatchingPendingCommit = &cli.Command{
ctx := lcli.ReqContext(cctx)
if cctx.Bool("publish-now") {
- res, err := api.SectorCommitFlush(ctx)
+ res, err := minerAPI.SectorCommitFlush(ctx)
if err != nil {
return xerrors.Errorf("flush: %w", err)
}
@@ -2000,7 +2004,7 @@ var sectorsBatchingPendingCommit = &cli.Command{
return nil
}
- pending, err := api.SectorCommitPending(ctx)
+ pending, err := minerAPI.SectorCommitPending(ctx)
if err != nil {
return xerrors.Errorf("getting pending deals: %w", err)
}
@@ -2027,7 +2031,7 @@ var sectorsBatchingPendingPreCommit = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- api, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -2035,7 +2039,7 @@ var sectorsBatchingPendingPreCommit = &cli.Command{
ctx := lcli.ReqContext(cctx)
if cctx.Bool("publish-now") {
- res, err := api.SectorPreCommitFlush(ctx)
+ res, err := minerAPI.SectorPreCommitFlush(ctx)
if err != nil {
return xerrors.Errorf("flush: %w", err)
}
@@ -2058,7 +2062,7 @@ var sectorsBatchingPendingPreCommit = &cli.Command{
return nil
}
- pending, err := api.SectorPreCommitPending(ctx)
+ pending, err := minerAPI.SectorPreCommitPending(ctx)
if err != nil {
return xerrors.Errorf("getting pending deals: %w", err)
}
@@ -2079,14 +2083,14 @@ var sectorsRefreshPieceMatchingCmd = &cli.Command{
Name: "match-pending-pieces",
Usage: "force a refreshed match of pending pieces to open sectors without manually waiting for more deals",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if err := nodeApi.SectorMatchPendingPiecesToOpenSectors(ctx); err != nil {
+ if err := minerAPI.SectorMatchPendingPiecesToOpenSectors(ctx); err != nil {
return err
}
@@ -2195,7 +2199,7 @@ var sectorsCompactPartitionsCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Println(cctx.App.Writer, "compact partitions failed!")
return err
}
@@ -2219,14 +2223,14 @@ var sectorsNumbersInfoCmd = &cli.Command{
Name: "info",
Usage: "view sector assigner state",
Action: func(cctx *cli.Context) error {
- api, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- am, err := api.SectorNumAssignerMeta(ctx)
+ am, err := minerAPI.SectorNumAssignerMeta(ctx)
if err != nil {
return err
}
@@ -2253,14 +2257,14 @@ var sectorsNumbersReservationsCmd = &cli.Command{
Name: "reservations",
Usage: "list sector number reservations",
Action: func(cctx *cli.Context) error {
- api, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- rs, err := api.SectorNumReservations(ctx)
+ rs, err := minerAPI.SectorNumReservations(ctx)
if err != nil {
return err
}
@@ -2303,15 +2307,15 @@ var sectorsNumbersReserveCmd = &cli.Command{
},
ArgsUsage: "[reservation name] [reserved ranges]",
Action: func(cctx *cli.Context) error {
- api, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 2 {
- return xerrors.Errorf("expected 2 arguments: [reservation name] [reserved ranges]")
+ if cctx.NArg() != 2 {
+ return lcli.IncorrectNumArgs(cctx)
}
bf, err := strle.HumanRangesToBitField(cctx.Args().Get(1))
@@ -2319,7 +2323,7 @@ var sectorsNumbersReserveCmd = &cli.Command{
return xerrors.Errorf("parsing ranges: %w", err)
}
- return api.SectorNumReserve(ctx, cctx.Args().First(), bf, cctx.Bool("force"))
+ return minerAPI.SectorNumReserve(ctx, cctx.Args().First(), bf, cctx.Bool("force"))
},
}
@@ -2328,17 +2332,17 @@ var sectorsNumbersFreeCmd = &cli.Command{
Usage: "remove sector number reservations",
ArgsUsage: "[reservation name]",
Action: func(cctx *cli.Context) error {
- api, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("expected 1 argument: [reservation name]")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
- return api.SectorNumFree(ctx, cctx.Args().First())
+ return minerAPI.SectorNumFree(ctx, cctx.Args().First())
},
}
diff --git a/cmd/lotus-miner/storage.go b/cmd/lotus-miner/storage.go
index cc5d94534..b5bfb730d 100644
--- a/cmd/lotus-miner/storage.go
+++ b/cmd/lotus-miner/storage.go
@@ -29,7 +29,6 @@ import (
"github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/lib/tablewriter"
- "github.com/filecoin-project/lotus/storage/paths"
sealing "github.com/filecoin-project/lotus/storage/pipeline"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
@@ -109,7 +108,7 @@ over time
},
},
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -148,7 +147,7 @@ over time
}
}
- cfg := &paths.LocalStorageMeta{
+ cfg := &storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: cctx.Uint64("weight"),
CanSeal: cctx.Bool("seal"),
@@ -172,7 +171,7 @@ over time
}
}
- return nodeApi.StorageAddLocal(ctx, p)
+ return minerApi.StorageAddLocal(ctx, p)
},
}
@@ -186,7 +185,7 @@ var storageDetachCmd = &cli.Command{
},
ArgsUsage: "[path]",
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -206,7 +205,7 @@ var storageDetachCmd = &cli.Command{
return xerrors.Errorf("pass --really-do-it to execute the action")
}
- return nodeApi.StorageDetachLocal(ctx, p)
+ return minerApi.StorageDetachLocal(ctx, p)
},
}
@@ -228,7 +227,7 @@ var storageRedeclareCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
@@ -241,11 +240,11 @@ var storageRedeclareCmd = &cli.Command{
if cctx.IsSet("id") {
id := storiface.ID(cctx.String("id"))
- return nodeApi.StorageRedeclareLocal(ctx, &id, cctx.Bool("drop-missing"))
+ return minerApi.StorageRedeclareLocal(ctx, &id, cctx.Bool("drop-missing"))
}
if cctx.Bool("all") {
- return nodeApi.StorageRedeclareLocal(ctx, nil, cctx.Bool("drop-missing"))
+ return minerApi.StorageRedeclareLocal(ctx, nil, cctx.Bool("drop-missing"))
}
return xerrors.Errorf("either --all or --id must be specified")
@@ -270,19 +269,19 @@ var storageListCmd = &cli.Command{
color.NoColor = !cctx.Bool("color")
}
- nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
- st, err := nodeApi.StorageList(ctx)
+ st, err := minerApi.StorageList(ctx)
if err != nil {
return err
}
- local, err := nodeApi.StorageLocal(ctx)
+ local, err := minerApi.StorageLocal(ctx)
if err != nil {
return err
}
@@ -295,7 +294,7 @@ var storageListCmd = &cli.Command{
sorted := make([]fsInfo, 0, len(st))
for id, decls := range st {
- st, err := nodeApi.StorageStat(ctx, id)
+ st, err := minerApi.StorageStat(ctx, id)
if err != nil {
sorted = append(sorted, fsInfo{ID: id, sectors: decls})
continue
@@ -313,7 +312,7 @@ var storageListCmd = &cli.Command{
for _, s := range sorted {
- var cnt [3]int
+ var cnt [5]int
for _, decl := range s.sectors {
for i := range cnt {
if decl.SectorFileType&(1<",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
+ if cctx.NArg() != 1 {
return fmt.Errorf("must specify genesis file")
}
@@ -539,7 +539,7 @@ var genesisSetActorVersionCmd = &cli.Command{
}
nv := network.Version(cctx.Int("network-version"))
- if nv > build.NewestNetworkVersion {
+ if nv > build.TestNetworkVersion {
return xerrors.Errorf("invalid network version: %d", nv)
}
@@ -597,7 +597,7 @@ var genesisSetVRKSignersCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
+ if cctx.NArg() != 1 {
return fmt.Errorf("must specify template file")
}
diff --git a/cmd/lotus-seed/seed/seed.go b/cmd/lotus-seed/seed/seed.go
index 3b305e3a6..b98673712 100644
--- a/cmd/lotus-seed/seed/seed.go
+++ b/cmd/lotus-seed/seed/seed.go
@@ -22,12 +22,11 @@ import (
"github.com/filecoin-project/go-commp-utils/zerocomm"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet/key"
"github.com/filecoin-project/lotus/genesis"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper/basicfs"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
@@ -126,7 +125,7 @@ func PreSeal(maddr address.Address, spt abi.RegisteredSealProof, offset abi.Sect
}
{
- b, err := json.MarshalIndent(&paths.LocalStorageMeta{
+ b, err := json.MarshalIndent(&storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 0, // read-only
CanSeal: false,
@@ -165,7 +164,7 @@ func presealSector(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, sid storiface.
return nil, xerrors.Errorf("commit: %w", err)
}
- if err := sb.FinalizeSector(context.TODO(), sid, nil); err != nil {
+ if err := sb.FinalizeSector(context.TODO(), sid); err != nil {
return nil, xerrors.Errorf("trim cache: %w", err)
}
@@ -250,12 +249,12 @@ func WriteGenesisMiner(maddr address.Address, sbroot string, gm *genesis.Miner,
func createDeals(m *genesis.Miner, k *key.Key, maddr address.Address, ssize abi.SectorSize) error {
for i, sector := range m.Sectors {
- label, err := market8.NewLabelFromString(fmt.Sprintf("%d", i))
+ label, err := markettypes.NewLabelFromString(fmt.Sprintf("%d", i))
if err != nil {
return xerrors.Errorf("error creating deal label: %w", err)
}
- proposal := &market8.DealProposal{
+ proposal := &markettypes.DealProposal{
PieceCID: sector.CommD,
PieceSize: abi.PaddedPieceSize(ssize),
Client: k.Address,
@@ -268,7 +267,7 @@ func createDeals(m *genesis.Miner, k *key.Key, maddr address.Address, ssize abi.
ClientCollateral: big.Zero(),
}
- sector.DealClientKey = k
+ sector.DealClientKey = k.KeyInfo
sector.Deal = *proposal
}
diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go
index fa337d3ec..f8d56a0da 100644
--- a/cmd/lotus-shed/actor.go
+++ b/cmd/lotus-shed/actor.go
@@ -2,6 +2,7 @@ package main
import (
"bytes"
+ "encoding/hex"
"fmt"
"os"
@@ -33,12 +34,13 @@ var actorCmd = &cli.Command{
actorControl,
actorProposeChangeWorker,
actorConfirmChangeWorker,
+ actorGetMethodNum,
},
}
var actorWithdrawCmd = &cli.Command{
Name: "withdraw",
- Usage: "withdraw available balance",
+ Usage: "withdraw available balance to beneficiary",
ArgsUsage: "[amount (FIL)]",
Flags: []cli.Flag{
&cli.StringFlag{
@@ -50,6 +52,10 @@ var actorWithdrawCmd = &cli.Command{
Usage: "number of block confirmations to wait for",
Value: int(build.MessageConfidence),
},
+ &cli.BoolFlag{
+ Name: "beneficiary",
+ Usage: "send withdraw message from the beneficiary address",
+ },
},
Action: func(cctx *cli.Context) error {
var maddr address.Address
@@ -70,13 +76,13 @@ var actorWithdrawCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
if maddr.Empty() {
- minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
- maddr, err = minerAPI.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -113,9 +119,16 @@ var actorWithdrawCmd = &cli.Command{
return err
}
+ var sender address.Address
+ if cctx.IsSet("beneficiary") {
+ sender = mi.Beneficiary
+ } else {
+ sender = mi.Owner
+ }
+
smsg, err := nodeAPI.MpoolPushMessage(ctx, &types.Message{
To: maddr,
- From: mi.Owner,
+ From: sender,
Value: types.NewInt(0),
Method: builtin.MethodsMiner.WithdrawBalance,
Params: params,
@@ -133,7 +146,7 @@ var actorWithdrawCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Println(cctx.App.Writer, "withdrawal failed!")
return err
}
@@ -181,7 +194,7 @@ var actorSetOwnerCmd = &cli.Command{
}
if cctx.NArg() != 2 {
- return fmt.Errorf("must pass new owner address and sender address")
+ return lcli.IncorrectNumArgs(cctx)
}
var maddr address.Address
@@ -222,13 +235,13 @@ var actorSetOwnerCmd = &cli.Command{
}
if maddr.Empty() {
- minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
- maddr, err = minerAPI.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -268,7 +281,7 @@ var actorSetOwnerCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Println("owner change failed!")
return err
}
@@ -328,13 +341,13 @@ var actorControlList = &cli.Command{
ctx := lcli.ReqContext(cctx)
if maddr.Empty() {
- minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
- maddr, err = minerAPI.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -367,7 +380,9 @@ var actorControlList = &cli.Command{
kstr := k.String()
if !cctx.Bool("verbose") {
- kstr = kstr[:9] + "..."
+ if len(kstr) > 9 {
+ kstr = kstr[:6] + "..."
+ }
}
bstr := types.FIL(b).String()
@@ -407,6 +422,11 @@ var actorControlSet = &cli.Command{
Name: "actor",
Usage: "specify the address of miner actor",
},
+ &cli.BoolFlag{
+ Name: "dump-bytes",
+ Usage: "Dumps the bytes of the message that would propose this change",
+ Value: false,
+ },
&cli.BoolFlag{
Name: "really-do-it",
Usage: "Actually send transaction performing the action",
@@ -414,11 +434,6 @@ var actorControlSet = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if !cctx.Bool("really-do-it") {
- fmt.Println("Pass --really-do-it to actually execute this action")
- return nil
- }
-
var maddr address.Address
if act := cctx.String("actor"); act != "" {
var err error
@@ -437,13 +452,13 @@ var actorControlSet = &cli.Command{
ctx := lcli.ReqContext(cctx)
if maddr.Empty() {
- minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
- maddr, err = minerAPI.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -508,14 +523,36 @@ var actorControlSet = &cli.Command{
return xerrors.Errorf("serializing params: %w", err)
}
- smsg, err := nodeAPI.MpoolPushMessage(ctx, &types.Message{
+ msg := &types.Message{
From: mi.Owner,
To: maddr,
Method: builtin.MethodsMiner.ChangeWorkerAddress,
-
Value: big.Zero(),
Params: sp,
- }, nil)
+ }
+
+ if cctx.Bool("dump-bytes") {
+
+ msg, err = nodeAPI.GasEstimateMessageGas(ctx, msg, nil, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ msgBytes, err := msg.Serialize()
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprintln(cctx.App.Writer, hex.EncodeToString(msgBytes))
+ return nil
+ }
+
+ if !cctx.Bool("really-do-it") {
+ fmt.Fprintln(cctx.App.Writer, "Pass --really-do-it to actually execute this action")
+ return nil
+ }
+
+ smsg, err := nodeAPI.MpoolPushMessage(ctx, msg, nil)
if err != nil {
return xerrors.Errorf("mpool push: %w", err)
}
@@ -579,13 +616,13 @@ var actorProposeChangeWorker = &cli.Command{
}
if maddr.Empty() {
- minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
- maddr, err = minerAPI.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -636,7 +673,7 @@ var actorProposeChangeWorker = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Propose worker change failed!")
return err
}
@@ -709,13 +746,13 @@ var actorConfirmChangeWorker = &cli.Command{
}
if maddr.Empty() {
- minerAPI, closer, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
- maddr, err = minerAPI.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -757,7 +794,7 @@ var actorConfirmChangeWorker = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Worker change failed!")
return err
}
@@ -773,3 +810,24 @@ var actorConfirmChangeWorker = &cli.Command{
return nil
},
}
+
+var actorGetMethodNum = &cli.Command{
+ Name: "generate-method-num",
+ Usage: "Generate method number from method name",
+ ArgsUsage: "[methodName]",
+ Action: func(cctx *cli.Context) error {
+ if !cctx.Args().Present() {
+ return fmt.Errorf("must pass methodNum")
+ }
+
+ methodName := cctx.Args().First()
+ methodNum, err := builtin.GenerateMethodNum(methodName)
+ if err != nil {
+ return err
+ }
+
+ fmt.Println("Method Num: ", methodNum)
+
+ return nil
+ },
+}
diff --git a/cmd/lotus-shed/base16.go b/cmd/lotus-shed/base16.go
index adfdfeddb..a5d384815 100644
--- a/cmd/lotus-shed/base16.go
+++ b/cmd/lotus-shed/base16.go
@@ -24,7 +24,7 @@ var base16Cmd = &cli.Command{
Action: func(cctx *cli.Context) error {
var input io.Reader
- if cctx.Args().Len() == 0 {
+ if cctx.NArg() == 0 {
input = os.Stdin
} else {
input = strings.NewReader(cctx.Args().First())
diff --git a/cmd/lotus-shed/base32.go b/cmd/lotus-shed/base32.go
index 4ca177316..66e180ddc 100644
--- a/cmd/lotus-shed/base32.go
+++ b/cmd/lotus-shed/base32.go
@@ -24,7 +24,7 @@ var base32Cmd = &cli.Command{
Action: func(cctx *cli.Context) error {
var input io.Reader
- if cctx.Args().Len() == 0 {
+ if cctx.NArg() == 0 {
input = os.Stdin
} else {
input = strings.NewReader(cctx.Args().First())
diff --git a/cmd/lotus-shed/base64.go b/cmd/lotus-shed/base64.go
index 9143a6a19..cacc60152 100644
--- a/cmd/lotus-shed/base64.go
+++ b/cmd/lotus-shed/base64.go
@@ -32,7 +32,7 @@ var base64Cmd = &cli.Command{
Action: func(cctx *cli.Context) error {
var input io.Reader
- if cctx.Args().Len() == 0 {
+ if cctx.NArg() == 0 {
input = os.Stdin
} else {
input = strings.NewReader(cctx.Args().First())
diff --git a/cmd/lotus-shed/chain.go b/cmd/lotus-shed/chain.go
index efbbd3b62..9eaa42795 100644
--- a/cmd/lotus-shed/chain.go
+++ b/cmd/lotus-shed/chain.go
@@ -56,7 +56,7 @@ var computeStateRangeCmd = &cli.Command{
ArgsUsage: "[START_TIPSET_REF] [END_TIPSET_REF]",
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 2 {
- return fmt.Errorf("expected two arguments: a start and an end tipset")
+ return lcli.IncorrectNumArgs(cctx)
}
api, closer, err := lcli.GetFullNodeAPI(cctx)
diff --git a/cmd/lotus-shed/consensus.go b/cmd/lotus-shed/consensus.go
index f6bd7688f..197de56f9 100644
--- a/cmd/lotus-shed/consensus.go
+++ b/cmd/lotus-shed/consensus.go
@@ -84,7 +84,7 @@ var consensusCheckCmd = &cli.Command{
filePath := cctx.Args().First()
var input *bufio.Reader
- if cctx.Args().Len() == 0 {
+ if cctx.NArg() == 0 {
input = bufio.NewReader(os.Stdin)
} else {
var err error
diff --git a/cmd/lotus-shed/datastore.go b/cmd/lotus-shed/datastore.go
index 7cdb2b1e6..5614e34f6 100644
--- a/cmd/lotus-shed/datastore.go
+++ b/cmd/lotus-shed/datastore.go
@@ -20,6 +20,7 @@ import (
"go.uber.org/multierr"
"golang.org/x/xerrors"
+ lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/lib/backupds"
"github.com/filecoin-project/lotus/node/repo"
)
@@ -171,8 +172,8 @@ var datastoreBackupStatCmd = &cli.Command{
Description: "validate and print info about datastore backup",
ArgsUsage: "[file]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("expected 1 argument")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
f, err := os.Open(cctx.Args().First())
@@ -220,8 +221,8 @@ var datastoreBackupListCmd = &cli.Command{
},
ArgsUsage: "[file]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("expected 1 argument")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
f, err := os.Open(cctx.Args().First())
@@ -308,7 +309,7 @@ var datastoreRewriteCmd = &cli.Command{
ArgsUsage: "source destination",
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 2 {
- return xerrors.Errorf("expected 2 arguments, got %d", cctx.NArg())
+ return lcli.IncorrectNumArgs(cctx)
}
fromPath, err := homedir.Expand(cctx.Args().Get(0))
if err != nil {
diff --git a/cmd/lotus-shed/diff.go b/cmd/lotus-shed/diff.go
index 9fc6f7963..981dc850c 100644
--- a/cmd/lotus-shed/diff.go
+++ b/cmd/lotus-shed/diff.go
@@ -1,20 +1,177 @@
package main
import (
+ "context"
"fmt"
+ "io"
"github.com/ipfs/go-cid"
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"
+ "github.com/filecoin-project/go-state-types/abi"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+
+ "github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
+ "github.com/filecoin-project/lotus/node/repo"
)
var diffCmd = &cli.Command{
- Name: "diff",
- Usage: "diff state objects",
- Subcommands: []*cli.Command{diffStateTrees},
+ Name: "diff",
+ Usage: "diff state objects",
+ Subcommands: []*cli.Command{
+ diffStateTrees,
+ diffMinerStates,
+ },
+}
+
+var diffMinerStates = &cli.Command{
+ Name: "miner-states",
+ Usage: "diff two miner-states",
+ ArgsUsage: " ",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo",
+ Value: "~/.lotus",
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ ctx := context.TODO()
+
+ if cctx.NArg() != 2 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ stCidA, err := cid.Decode(cctx.Args().First())
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ stCidB, err := cid.Decode(cctx.Args().Get(1))
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ fsrepo, err := repo.NewFS(cctx.String("repo"))
+ if err != nil {
+ return err
+ }
+
+ lkrepo, err := fsrepo.Lock(repo.FullNode)
+ if err != nil {
+ return err
+ }
+
+ defer lkrepo.Close() //nolint:errcheck
+
+ bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore)
+ if err != nil {
+ return fmt.Errorf("failed to open blockstore: %w", err)
+ }
+
+ defer func() {
+ if c, ok := bs.(io.Closer); ok {
+ if err := c.Close(); err != nil {
+ log.Warnf("failed to close blockstore: %s", err)
+ }
+ }
+ }()
+
+ actorStore := store.ActorStore(ctx, bs)
+
+ var minerStA miner9.State
+ if err = actorStore.Get(ctx, stCidA, &minerStA); err != nil {
+ return err
+ }
+
+ var minerStB miner9.State
+ if err = actorStore.Get(ctx, stCidB, &minerStB); err != nil {
+ return err
+ }
+
+ fmt.Println(minerStA.Deadlines)
+ fmt.Println(minerStB.Deadlines)
+
+ minerDeadlinesA, err := minerStA.LoadDeadlines(actorStore)
+ if err != nil {
+ return err
+ }
+
+ minerDeadlinesB, err := minerStB.LoadDeadlines(actorStore)
+ if err != nil {
+ return err
+ }
+
+ for i, dACid := range minerDeadlinesA.Due {
+ dBCid := minerDeadlinesB.Due[i]
+ if dACid != dBCid {
+ fmt.Println("Difference at index ", i, dACid, " != ", dBCid)
+ dA, err := minerDeadlinesA.LoadDeadline(actorStore, uint64(i))
+ if err != nil {
+ return err
+ }
+
+ dB, err := minerDeadlinesB.LoadDeadline(actorStore, uint64(i))
+ if err != nil {
+ return err
+ }
+
+ if dA.SectorsSnapshot != dB.SectorsSnapshot {
+ fmt.Println("They differ at Sectors snapshot ", dA.SectorsSnapshot, " != ", dB.SectorsSnapshot)
+
+ sectorsSnapshotA, err := miner9.LoadSectors(actorStore, dA.SectorsSnapshot)
+ if err != nil {
+ return err
+ }
+ sectorsSnapshotB, err := miner9.LoadSectors(actorStore, dB.SectorsSnapshot)
+ if err != nil {
+ return err
+ }
+
+ if sectorsSnapshotA.Length() != sectorsSnapshotB.Length() {
+ fmt.Println("sector snapshots have different lengts!")
+ }
+
+ var infoA miner9.SectorOnChainInfo
+ err = sectorsSnapshotA.ForEach(&infoA, func(i int64) error {
+ infoB, ok, err := sectorsSnapshotB.Get(abi.SectorNumber(i))
+ if err != nil {
+ return err
+ }
+
+ if !ok {
+ fmt.Println(i, "isn't found in infoB!!")
+ }
+
+ if !infoA.DealWeight.Equals(infoB.DealWeight) {
+ fmt.Println("Deal Weights differ! ", infoA.DealWeight, infoB.DealWeight)
+ }
+
+ if !infoA.VerifiedDealWeight.Equals(infoB.VerifiedDealWeight) {
+ fmt.Println("Verified Deal Weights differ! ", infoA.VerifiedDealWeight, infoB.VerifiedDealWeight)
+ }
+
+ infoStrA := fmt.Sprint(infoA)
+ infoStrB := fmt.Sprint(*infoB)
+ if infoStrA != infoStrB {
+ fmt.Println(infoStrA)
+ fmt.Println(infoStrB)
+ }
+
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ }
+ }
+ }
+
+ return nil
+ },
}
var diffStateTrees = &cli.Command{
@@ -31,7 +188,7 @@ var diffStateTrees = &cli.Command{
ctx := lcli.ReqContext(cctx)
if cctx.NArg() != 2 {
- return xerrors.Errorf("expected two state-tree roots")
+ return lcli.IncorrectNumArgs(cctx)
}
argA := cctx.Args().Get(0)
diff --git a/cmd/lotus-shed/export-car.go b/cmd/lotus-shed/export-car.go
index 97e4fb6c6..5cb4737ea 100644
--- a/cmd/lotus-shed/export-car.go
+++ b/cmd/lotus-shed/export-car.go
@@ -14,6 +14,8 @@ import (
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"
+ "github.com/filecoin-project/lotus/blockstore"
+ "github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/node/repo"
)
@@ -30,18 +32,18 @@ func carWalkFunc(nd format.Node) (out []*format.Link, err error) {
var exportCarCmd = &cli.Command{
Name: "export-car",
- Description: "Export a car from repo (requires node to be offline)",
+ Description: "Export a car from repo",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "repo",
Value: "~/.lotus",
},
},
+ ArgsUsage: "[outfile] [root cid]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return lcli.ShowHelp(cctx, fmt.Errorf("must specify file name and object"))
+ if cctx.NArg() != 2 {
+ return lcli.IncorrectNumArgs(cctx)
}
-
outfile := cctx.Args().First()
var roots []cid.Cid
for _, arg := range cctx.Args().Tail() {
@@ -51,14 +53,11 @@ var exportCarCmd = &cli.Command{
}
roots = append(roots, c)
}
-
ctx := lcli.ReqContext(cctx)
-
r, err := repo.NewFS(cctx.String("repo"))
if err != nil {
return xerrors.Errorf("opening fs repo: %w", err)
}
-
exists, err := r.Exists()
if err != nil {
return err
@@ -67,11 +66,25 @@ var exportCarCmd = &cli.Command{
return xerrors.Errorf("lotus repo doesn't exist")
}
+ var bs blockstore.Blockstore
+
lr, err := r.Lock(repo.FullNode)
- if err != nil {
- return err
+ if err == nil {
+ bs, err = lr.Blockstore(ctx, repo.UniversalBlockstore)
+ if err != nil {
+ return fmt.Errorf("failed to open blockstore: %w", err)
+ }
+ defer lr.Close() //nolint:errcheck
+ } else {
+ api, closer, err := lcli.GetFullNodeAPI(cctx)
+ if err != nil {
+ return err
+ }
+
+ defer closer()
+
+ bs = blockstore.NewAPIBlockstore(api)
}
- defer lr.Close() //nolint:errcheck
fi, err := os.Create(outfile)
if err != nil {
@@ -80,11 +93,6 @@ var exportCarCmd = &cli.Command{
defer fi.Close() //nolint:errcheck
- bs, err := lr.Blockstore(ctx, repo.UniversalBlockstore)
- if err != nil {
- return fmt.Errorf("failed to open blockstore: %w", err)
- }
-
defer func() {
if c, ok := bs.(io.Closer); ok {
if err := c.Close(); err != nil {
@@ -98,6 +106,14 @@ var exportCarCmd = &cli.Command{
if err != nil {
return err
}
+
+ sz, err := fi.Seek(0, io.SeekEnd)
+ if err != nil {
+ return err
+ }
+
+ fmt.Printf("done %s\n", types.SizeStr(types.NewInt(uint64(sz))))
+
return nil
},
}
diff --git a/cmd/lotus-shed/export.go b/cmd/lotus-shed/export.go
index 8de3f48df..459de3383 100644
--- a/cmd/lotus-shed/export.go
+++ b/cmd/lotus-shed/export.go
@@ -32,7 +32,6 @@ import (
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/chain/store"
- "github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/cmd/lotus-shed/shedgen"
"github.com/filecoin-project/lotus/node/repo"
@@ -125,22 +124,9 @@ var exportChainCmd = &cli.Command{
fullstate := cctx.Bool("full-state")
skipoldmsgs := cctx.Bool("skip-old-msgs")
- var ts *types.TipSet
- if tss := cctx.String("tipset"); tss != "" {
- cids, err := lcli.ParseTipSetString(tss)
- if err != nil {
- return xerrors.Errorf("failed to parse tipset (%q): %w", tss, err)
- }
-
- tsk := types.NewTipSetKey(cids...)
-
- selts, err := cs.LoadTipSet(context.Background(), tsk)
- if err != nil {
- return xerrors.Errorf("loading tipset: %w", err)
- }
- ts = selts
- } else {
- ts = cs.GetHeaviestTipSet()
+ ts, err := lcli.ParseTipSetRefOffline(ctx, cs, cctx.String("tipset"))
+ if err != nil {
+ return err
}
if fullstate {
diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go
new file mode 100644
index 000000000..485302b9b
--- /dev/null
+++ b/cmd/lotus-shed/fip-0036.go
@@ -0,0 +1,554 @@
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "sort"
+ "strconv"
+
+ "github.com/ipfs/go-cid"
+ cbor "github.com/ipfs/go-ipld-cbor"
+ "github.com/mitchellh/go-homedir"
+ "github.com/urfave/cli/v2"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/market"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/power"
+ "github.com/filecoin-project/lotus/chain/consensus/filcns"
+ "github.com/filecoin-project/lotus/chain/state"
+ "github.com/filecoin-project/lotus/chain/store"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/node/repo"
+)
+
+type Option uint64
+
+const (
+ Approve Option = 49
+ Reject Option = 50
+)
+
+type Vote struct {
+ ID uint64
+ OptionID Option
+ SignerAddress address.Address
+}
+
+type msigVote struct {
+ Multisig msigBriefInfo
+ ApproveCount uint64
+ RejectCount uint64
+}
+
+// https://filpoll.io/poll/16
+// snapshot height: 2162760
+// state root: bafy2bzacebdnzh43hw66bmvguk65wiwr5ssaejlq44fpdei2ysfh3eefpdlqs
+var fip36PollCmd = &cli.Command{
+ Name: "fip36poll",
+ Usage: "Process the FIP0036 FilPoll result",
+ ArgsUsage: "[state root, votes]",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo",
+ Value: "~/.lotus",
+ },
+ },
+ Subcommands: []*cli.Command{
+ finalResultCmd,
+ },
+}
+
+var finalResultCmd = &cli.Command{
+ Name: "results",
+ Usage: "get poll results",
+ ArgsUsage: "[state root] [height] [votes json]",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo",
+ Value: "~/.lotus",
+ },
+ },
+
+ Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 3 {
+ return xerrors.New("filpoll0036 results [state root] [height] [votes.json]")
+ }
+
+ ctx := context.TODO()
+ if !cctx.Args().Present() {
+ return fmt.Errorf("must pass state root")
+ }
+
+ sroot, err := cid.Decode(cctx.Args().First())
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ fsrepo, err := repo.NewFS(cctx.String("repo"))
+ if err != nil {
+ return err
+ }
+
+ lkrepo, err := fsrepo.Lock(repo.FullNode)
+ if err != nil {
+ return err
+ }
+
+ defer lkrepo.Close() //nolint:errcheck
+
+ bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore)
+ if err != nil {
+ return fmt.Errorf("failed to open blockstore: %w", err)
+ }
+
+ defer func() {
+ if c, ok := bs.(io.Closer); ok {
+ if err := c.Close(); err != nil {
+ log.Warnf("failed to close blockstore: %s", err)
+ }
+ }
+ }()
+
+ mds, err := lkrepo.Datastore(context.Background(), "/metadata")
+ if err != nil {
+ return err
+ }
+
+ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil)
+ defer cs.Close() //nolint:errcheck
+
+ cst := cbor.NewCborStore(bs)
+ store := adt.WrapStore(ctx, cst)
+
+ st, err := state.LoadStateTree(cst, sroot)
+ if err != nil {
+ return err
+ }
+
+ height, err := strconv.Atoi(cctx.Args().Get(1))
+ if err != nil {
+ return err
+ }
+
+ //get all the votes' signer ID address && their vote
+ vj, err := homedir.Expand(cctx.Args().Get(2))
+ if err != nil {
+ return xerrors.Errorf("fail to get votes json")
+ }
+ votes, err := getVotesMap(vj)
+ if err != nil {
+ return xerrors.Errorf("failed to get voters: %w\n", err)
+ }
+
+ type minerBriefInfo struct {
+ rawBytePower abi.StoragePower
+ dealPower abi.StoragePower
+ balance abi.TokenAmount
+ }
+
+ // power actor
+ pa, err := st.GetActor(power.Address)
+ if err != nil {
+ return xerrors.Errorf("failed to get power actor: %w\n", err)
+ }
+
+ powerState, err := power.Load(store, pa)
+ if err != nil {
+ return xerrors.Errorf("failed to get power state: %w\n", err)
+ }
+
+ //market actor
+ ma, err := st.GetActor(market.Address)
+ if err != nil {
+ return xerrors.Errorf("fail to get market actor: %w\n", err)
+ }
+
+ marketState, err := market.Load(store, ma)
+ if err != nil {
+ return xerrors.Errorf("fail to load market state: %w\n", err)
+ }
+
+ lookupId := func(addr address.Address) address.Address {
+ ret, err := st.LookupID(addr)
+ if err != nil {
+ panic(err)
+ }
+
+ return ret
+ }
+
+ // we need to build several pieces of information, as we traverse the state tree:
+ // a map of accounts to every msig that they are a signer of
+ accountsToMultisigs := make(map[address.Address][]address.Address)
+ // a map of multisigs to some info about them for quick lookup
+ msigActorsInfo := make(map[address.Address]msigBriefInfo)
+ // a map of actors (accounts+multisigs) to every miner that they are an owner of
+ ownerMap := make(map[address.Address][]address.Address)
+ // a map of accounts to every miner that they are a worker of
+ workerMap := make(map[address.Address][]address.Address)
+ // a map of miners to some info about them for quick lookup
+ minerActorsInfo := make(map[address.Address]minerBriefInfo)
+ // a map of client addresses to deal data stored in proposals
+ clientToDealStorage := make(map[address.Address]abi.StoragePower)
+
+ fmt.Println("iterating over all actors")
+ count := 0
+ err = st.ForEach(func(addr address.Address, act *types.Actor) error {
+ if count%200000 == 0 {
+ fmt.Println("processed ", count, " actors building maps")
+ }
+ count++
+ if builtin.IsMultisigActor(act.Code) {
+ ms, err := multisig.Load(store, act)
+ if err != nil {
+ return fmt.Errorf("load msig failed %v", err)
+
+ }
+
+ // TODO: Confirm that these are always ID addresses
+ signers, err := ms.Signers()
+ if err != nil {
+ return xerrors.Errorf("fail to get msig signers: %w", err)
+ }
+ for _, s := range signers {
+ signerId := lookupId(s)
+ accountsToMultisigs[signerId] = append(accountsToMultisigs[signerId], addr)
+ }
+
+ locked, err := ms.LockedBalance(abi.ChainEpoch(height))
+ if err != nil {
+ return xerrors.Errorf("failed to compute locked multisig balance: %w", err)
+ }
+
+ threshold, _ := ms.Threshold()
+ info := msigBriefInfo{
+ ID: addr,
+ Signer: signers,
+ Balance: big.Max(big.Zero(), types.BigSub(act.Balance, locked)),
+ Threshold: threshold,
+ }
+ msigActorsInfo[addr] = info
+ }
+
+ if builtin.IsStorageMinerActor(act.Code) {
+ m, err := miner.Load(store, act)
+ if err != nil {
+ return xerrors.Errorf("fail to load miner actor: %w", err)
+ }
+
+ info, err := m.Info()
+ if err != nil {
+ return xerrors.Errorf("fail to get miner info: %w\n", err)
+ }
+
+ ownerId := lookupId(info.Owner)
+ ownerMap[ownerId] = append(ownerMap[ownerId], addr)
+
+ workerId := lookupId(info.Worker)
+ workerMap[workerId] = append(workerMap[workerId], addr)
+
+ lockedFunds, err := m.LockedFunds()
+ if err != nil {
+ return err
+ }
+
+ bal := big.Sub(act.Balance, lockedFunds.TotalLockedFunds())
+ bal = big.Max(big.Zero(), bal)
+
+ pow, ok, err := powerState.MinerPower(addr)
+ if err != nil {
+ return err
+ }
+
+ if !ok {
+ pow.RawBytePower = big.Zero()
+ }
+
+ minerActorsInfo[addr] = minerBriefInfo{
+ rawBytePower: pow.RawBytePower,
+ // gets added up outside this loop
+ dealPower: big.Zero(),
+ balance: bal,
+ }
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ fmt.Println("iterating over proposals")
+ dealProposals, err := marketState.Proposals()
+ if err != nil {
+ return err
+ }
+
+ dealStates, err := marketState.States()
+ if err != nil {
+ return err
+ }
+
+ if err := dealProposals.ForEach(func(dealID abi.DealID, d market.DealProposal) error {
+
+ dealState, ok, err := dealStates.Get(dealID)
+ if err != nil {
+ return err
+ }
+ if !ok || dealState.SectorStartEpoch == -1 {
+ // effectively a continue
+ return nil
+ }
+
+ clientId := lookupId(d.Client)
+ if cd, found := clientToDealStorage[clientId]; found {
+ clientToDealStorage[clientId] = big.Add(cd, big.NewInt(int64(d.PieceSize)))
+ } else {
+ clientToDealStorage[clientId] = big.NewInt(int64(d.PieceSize))
+ }
+
+ providerId := lookupId(d.Provider)
+ mai, found := minerActorsInfo[providerId]
+
+ if !found {
+ return xerrors.Errorf("didn't find miner %s", providerId)
+ }
+
+ mai.dealPower = big.Add(mai.dealPower, big.NewInt(int64(d.PieceSize)))
+ minerActorsInfo[providerId] = mai
+ return nil
+ }); err != nil {
+ return xerrors.Errorf("fail to get deals")
+ }
+
+ // now tabulate votes
+
+ approveBalance := abi.NewTokenAmount(0)
+ rejectionBalance := abi.NewTokenAmount(0)
+ clientApproveBytes := big.Zero()
+ clientRejectBytes := big.Zero()
+ msigPendingVotes := make(map[address.Address]msigVote) //map[msig ID]msigVote
+ msigVotes := make(map[address.Address]Option)
+ minerVotes := make(map[address.Address]Option)
+ fmt.Println("counting account and multisig votes")
+ for _, vote := range votes {
+ signerId, err := st.LookupID(vote.SignerAddress)
+ if err != nil {
+ fmt.Println("voter ", vote.SignerAddress, " not found in state tree, skipping")
+ continue
+ }
+
+ //process votes for regular accounts
+ accountActor, err := st.GetActor(signerId)
+ if err != nil {
+ return xerrors.Errorf("fail to get account account for signer: %w\n", err)
+ }
+
+ clientBytes, ok := clientToDealStorage[signerId]
+ if !ok {
+ clientBytes = big.Zero()
+ }
+
+ if vote.OptionID == Approve {
+ approveBalance = types.BigAdd(approveBalance, accountActor.Balance)
+ clientApproveBytes = big.Add(clientApproveBytes, clientBytes)
+ } else {
+ rejectionBalance = types.BigAdd(rejectionBalance, accountActor.Balance)
+ clientRejectBytes = big.Add(clientRejectBytes, clientBytes)
+ }
+
+ if minerInfos, found := ownerMap[signerId]; found {
+ for _, minerInfo := range minerInfos {
+ minerVotes[minerInfo] = vote.OptionID
+ }
+ }
+ if minerInfos, found := workerMap[signerId]; found {
+ for _, minerInfo := range minerInfos {
+ if _, ok := minerVotes[minerInfo]; !ok {
+ minerVotes[minerInfo] = vote.OptionID
+ }
+ }
+ }
+
+ //process msigs
+ // There is a possibility that enough signers have voted for BOTH options in the poll to be above the threshold
+ // Because we are iterating over votes in order they arrived, the first option to go over the threshold will win
+ // This is in line with onchain behaviour (consider a case where signers are competing to withdraw all the funds
+ // in an msig into 2 different accounts)
+ if mss, found := accountsToMultisigs[signerId]; found {
+ for _, ms := range mss { //get all the msig signer has
+ if _, ok := msigVotes[ms]; ok {
+ // msig has already voted, skip
+ continue
+ }
+ if mpv, found := msigPendingVotes[ms]; found { //other signers of the multisig have voted, yet the threshold has not met
+ if vote.OptionID == Approve {
+ if mpv.ApproveCount+1 == mpv.Multisig.Threshold { //met threshold
+ approveBalance = types.BigAdd(approveBalance, mpv.Multisig.Balance)
+ delete(msigPendingVotes, ms) //threshold, can skip later signer votes
+ msigVotes[ms] = vote.OptionID
+
+ } else {
+ mpv.ApproveCount++
+ msigPendingVotes[ms] = mpv
+ }
+ } else {
+ if mpv.RejectCount+1 == mpv.Multisig.Threshold { //met threshold
+ rejectionBalance = types.BigAdd(rejectionBalance, mpv.Multisig.Balance)
+ delete(msigPendingVotes, ms) //threshold, can skip later signer votes
+ msigVotes[ms] = vote.OptionID
+
+ } else {
+ mpv.RejectCount++
+ msigPendingVotes[ms] = mpv
+ }
+ }
+ } else { //first vote received from one of the signers of the msig
+ msi, ok := msigActorsInfo[ms]
+ if !ok {
+ return xerrors.Errorf("didn't find msig %s in msig map", ms)
+ }
+
+ if msi.Threshold == 1 { //met threshold with this signer's single vote
+ if vote.OptionID == Approve {
+ approveBalance = types.BigAdd(approveBalance, msi.Balance)
+ msigVotes[ms] = Approve
+
+ } else {
+ rejectionBalance = types.BigAdd(rejectionBalance, msi.Balance)
+ msigVotes[ms] = Reject
+ }
+ } else { //threshold not met, add to pending vote
+ if vote.OptionID == Approve {
+ msigPendingVotes[ms] = msigVote{
+ Multisig: msi,
+ ApproveCount: 1,
+ }
+ } else {
+ msigPendingVotes[ms] = msigVote{
+ Multisig: msi,
+ RejectCount: 1,
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ for s, v := range msigVotes {
+ if minerInfos, found := ownerMap[s]; found {
+ for _, minerInfo := range minerInfos {
+ minerVotes[minerInfo] = v
+ }
+ }
+ if minerInfos, found := workerMap[s]; found {
+ for _, minerInfo := range minerInfos {
+ if _, ok := minerVotes[minerInfo]; !ok {
+ minerVotes[minerInfo] = v
+ }
+ }
+ }
+ }
+
+ approveRBP := big.Zero()
+ approveDealPower := big.Zero()
+ rejectionRBP := big.Zero()
+ rejectionDealPower := big.Zero()
+ fmt.Println("adding up miner votes")
+ for minerAddr, vote := range minerVotes {
+ mbi, ok := minerActorsInfo[minerAddr]
+ if !ok {
+ return xerrors.Errorf("failed to find miner info for %s", minerAddr)
+ }
+
+ if vote == Approve {
+ approveBalance = big.Add(approveBalance, mbi.balance)
+ approveRBP = big.Add(approveRBP, mbi.rawBytePower)
+ approveDealPower = big.Add(approveDealPower, mbi.dealPower)
+ } else {
+ rejectionBalance = big.Add(rejectionBalance, mbi.balance)
+ rejectionRBP = big.Add(rejectionRBP, mbi.rawBytePower)
+ rejectionDealPower = big.Add(rejectionDealPower, mbi.dealPower)
+ }
+ }
+
+ fmt.Println("Total acceptance token: ", approveBalance)
+ fmt.Println("Total rejection token: ", rejectionBalance)
+
+ fmt.Println("Total acceptance SP deal power: ", approveDealPower)
+ fmt.Println("Total rejection SP deal power: ", rejectionDealPower)
+
+ fmt.Println("Total acceptance SP rb power: ", approveRBP)
+ fmt.Println("Total rejection SP rb power: ", rejectionRBP)
+
+ fmt.Println("Total acceptance Client rb power: ", clientApproveBytes)
+ fmt.Println("Total rejection Client rb power: ", clientRejectBytes)
+
+ fmt.Println("\n\nFinal results **drumroll**")
+ if rejectionBalance.GreaterThanEqual(big.Mul(approveBalance, big.NewInt(3))) {
+ fmt.Println("token holders VETO FIP-0036!")
+ } else if approveBalance.LessThanEqual(rejectionBalance) {
+ fmt.Println("token holders REJECT FIP-0036")
+ } else {
+ fmt.Println("token holders ACCEPT FIP-0036")
+ }
+
+ if rejectionDealPower.GreaterThanEqual(big.Mul(approveDealPower, big.NewInt(3))) {
+ fmt.Println("SPs by deal data stored VETO FIP-0036!")
+ } else if approveDealPower.LessThanEqual(rejectionDealPower) {
+ fmt.Println("SPs by deal data stored REJECT FIP-0036")
+ } else {
+ fmt.Println("SPs by deal data stored ACCEPT FIP-0036")
+ }
+
+ if rejectionRBP.GreaterThanEqual(big.Mul(approveRBP, big.NewInt(3))) {
+ fmt.Println("SPs by total raw byte power VETO FIP-0036!")
+ } else if approveRBP.LessThanEqual(rejectionRBP) {
+ fmt.Println("SPs by total raw byte power REJECT FIP-0036")
+ } else {
+ fmt.Println("SPs by total raw byte power ACCEPT FIP-0036")
+ }
+
+ if clientRejectBytes.GreaterThanEqual(big.Mul(clientApproveBytes, big.NewInt(3))) {
+ fmt.Println("Storage Clients VETO FIP-0036!")
+ } else if clientApproveBytes.LessThanEqual(clientRejectBytes) {
+ fmt.Println("Storage Clients REJECT FIP-0036")
+ } else {
+ fmt.Println("Storage Clients ACCEPT FIP-0036")
+ }
+
+ return nil
+ },
+}
+
+// Returns voted sorted by votes from earliest to latest
+func getVotesMap(file string) ([]Vote, error) {
+ var votes []Vote
+ vb, err := ioutil.ReadFile(file)
+ if err != nil {
+ return nil, xerrors.Errorf("read vote: %w", err)
+ }
+
+ if err := json.Unmarshal(vb, &votes); err != nil {
+ return nil, xerrors.Errorf("unmarshal vote: %w", err)
+ }
+
+ sort.SliceStable(votes, func(i, j int) bool {
+ return votes[i].ID < votes[j].ID
+ })
+
+ return votes, nil
+}
diff --git a/cmd/lotus-shed/gas-estimation.go b/cmd/lotus-shed/gas-estimation.go
new file mode 100644
index 000000000..cf56ea03d
--- /dev/null
+++ b/cmd/lotus-shed/gas-estimation.go
@@ -0,0 +1,280 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "os"
+ "strconv"
+ "text/tabwriter"
+
+ "github.com/ipfs/go-cid"
+ "github.com/urfave/cli/v2"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/network"
+
+ "github.com/filecoin-project/lotus/build"
+ "github.com/filecoin-project/lotus/chain/beacon"
+ "github.com/filecoin-project/lotus/chain/beacon/drand"
+ "github.com/filecoin-project/lotus/chain/consensus/filcns"
+ "github.com/filecoin-project/lotus/chain/stmgr"
+ "github.com/filecoin-project/lotus/chain/store"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/chain/vm"
+ lcli "github.com/filecoin-project/lotus/cli"
+ "github.com/filecoin-project/lotus/node/repo"
+ "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
+)
+
+const MAINNET_GENESIS_TIME = 1598306400
+
+// USAGE: Sync a node, then call migrate-nv17 on some old state. Pass in the cid of the migrated state root,
+// the epoch you migrated at, the network version you migrated to, and a message CID. You will be able to replay any
+// message from between the migration epoch, and where your node originally synced to. Note: You may run into issues
+// with state that changed between the epoch you migrated at, and when the message was originally processed.
+// This can be avoided by replaying messages from close to the migration epoch, or circumvented by using a custom
+// FVM bundle.
+var gasTraceCmd = &cli.Command{
+ Name: "trace-gas",
+ Description: "replay a message on the specified stateRoot and network version to get an execution trace",
+ ArgsUsage: "[migratedStateRootCid networkVersion messageCid]",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo",
+ Value: "~/.lotus",
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ ctx := context.TODO()
+
+ if cctx.NArg() != 3 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ stateRootCid, err := cid.Decode(cctx.Args().Get(0))
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ nv, err := strconv.ParseInt(cctx.Args().Get(1), 10, 32)
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ messageCid, err := cid.Decode(cctx.Args().Get(2))
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ fsrepo, err := repo.NewFS(cctx.String("repo"))
+ if err != nil {
+ return err
+ }
+
+ lkrepo, err := fsrepo.Lock(repo.FullNode)
+ if err != nil {
+ return err
+ }
+
+ defer lkrepo.Close() //nolint:errcheck
+
+ bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore)
+ if err != nil {
+ return fmt.Errorf("failed to open blockstore: %w", err)
+ }
+
+ defer func() {
+ if c, ok := bs.(io.Closer); ok {
+ if err := c.Close(); err != nil {
+ log.Warnf("failed to close blockstore: %s", err)
+ }
+ }
+ }()
+
+ mds, err := lkrepo.Datastore(context.Background(), "/metadata")
+ if err != nil {
+ return err
+ }
+
+ dcs := build.DrandConfigSchedule()
+ shd := beacon.Schedule{}
+ for _, dc := range dcs {
+ bc, err := drand.NewDrandBeacon(MAINNET_GENESIS_TIME, build.BlockDelaySecs, nil, dc.Config)
+ if err != nil {
+ return xerrors.Errorf("creating drand beacon: %w", err)
+ }
+ shd = append(shd, beacon.BeaconPoint{Start: dc.Start, Beacon: bc})
+ }
+ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil)
+ defer cs.Close() //nolint:errcheck
+
+ sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd)
+ if err != nil {
+ return err
+ }
+
+ msg, err := cs.GetMessage(ctx, messageCid)
+ if err != nil {
+ return err
+ }
+
+ // Set to block limit so message will not run out of gas
+ msg.GasLimit = build.BlockGasLimit
+
+ err = cs.Load(ctx)
+ if err != nil {
+ return err
+ }
+
+ tw := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', tabwriter.AlignRight)
+ res, err := sm.CallAtStateAndVersion(ctx, msg, stateRootCid, network.Version(nv))
+ if err != nil {
+ return err
+ }
+ fmt.Println("Total gas used: ", res.MsgRct.GasUsed)
+ printInternalExecutions(0, []types.ExecutionTrace{res.ExecutionTrace}, tw)
+
+ return tw.Flush()
+ },
+}
+
+var replayOfflineCmd = &cli.Command{
+ Name: "replay-offline",
+ Description: "replay a message to get a gas trace",
+ ArgsUsage: "[messageCid]",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo",
+ Value: "~/.lotus",
+ },
+ &cli.Int64Flag{
+ Name: "lookback-limit",
+ Value: 10000,
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ ctx := context.TODO()
+
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ messageCid, err := cid.Decode(cctx.Args().Get(0))
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ lookbackLimit := cctx.Int("lookback-limit")
+
+ fsrepo, err := repo.NewFS(cctx.String("repo"))
+ if err != nil {
+ return err
+ }
+
+ lkrepo, err := fsrepo.Lock(repo.FullNode)
+ if err != nil {
+ return err
+ }
+
+ defer lkrepo.Close() //nolint:errcheck
+
+ bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore)
+ if err != nil {
+ return fmt.Errorf("failed to open blockstore: %w", err)
+ }
+
+ defer func() {
+ if c, ok := bs.(io.Closer); ok {
+ if err := c.Close(); err != nil {
+ log.Warnf("failed to close blockstore: %s", err)
+ }
+ }
+ }()
+
+ mds, err := lkrepo.Datastore(context.Background(), "/metadata")
+ if err != nil {
+ return err
+ }
+
+ dcs := build.DrandConfigSchedule()
+ shd := beacon.Schedule{}
+ for _, dc := range dcs {
+ bc, err := drand.NewDrandBeacon(MAINNET_GENESIS_TIME, build.BlockDelaySecs, nil, dc.Config)
+ if err != nil {
+ return xerrors.Errorf("creating drand beacon: %w", err)
+ }
+ shd = append(shd, beacon.BeaconPoint{Start: dc.Start, Beacon: bc})
+ }
+
+ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil)
+ defer cs.Close() //nolint:errcheck
+
+ sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd)
+ if err != nil {
+ return err
+ }
+
+ msg, err := cs.GetMessage(ctx, messageCid)
+ if err != nil {
+ return err
+ }
+
+ err = cs.Load(ctx)
+ if err != nil {
+ return err
+ }
+
+ ts, _, _, err := sm.SearchForMessage(ctx, cs.GetHeaviestTipSet(), messageCid, abi.ChainEpoch(lookbackLimit), true)
+ if err != nil {
+ return err
+ }
+ if ts == nil {
+ return xerrors.Errorf("could not find message within the last %d epochs", lookbackLimit)
+ }
+ executionTs, err := cs.GetTipsetByHeight(ctx, ts.Height()-2, ts, true)
+ if err != nil {
+ return err
+ }
+
+ tw := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', tabwriter.AlignRight)
+ res, err := sm.CallWithGas(ctx, msg, []types.ChainMsg{}, executionTs)
+ if err != nil {
+ return err
+ }
+ fmt.Println("Total gas used: ", res.MsgRct.GasUsed)
+ printInternalExecutions(0, []types.ExecutionTrace{res.ExecutionTrace}, tw)
+
+ return tw.Flush()
+ },
+}
+
+func printInternalExecutions(depth int, trace []types.ExecutionTrace, tw *tabwriter.Writer) {
+ if depth == 0 {
+ _, _ = fmt.Fprintf(tw, "Depth\tFrom\tTo\tMethod\tTotalGas\tComputeGas\tStorageGas\t\tExitCode\n")
+ }
+ for _, im := range trace {
+ sumGas := im.SumGas()
+ _, _ = fmt.Fprintf(tw, "%d\t%s\t%s\t%d\t%d\t%d\t%d\t\t%d\n", depth, truncateString(im.Msg.From.String(), 10), truncateString(im.Msg.To.String(), 10), im.Msg.Method, sumGas.TotalGas, sumGas.ComputeGas, sumGas.StorageGas, im.MsgRct.ExitCode)
+ printInternalExecutions(depth+1, im.Subcalls, tw)
+ }
+}
+
+func truncateString(str string, length int) string {
+ if len(str) <= length {
+ return str
+ }
+
+ truncated := ""
+ count := 0
+ for _, char := range str {
+ truncated += string(char)
+ count++
+ if count >= length {
+ break
+ }
+ }
+ truncated += "..."
+ return truncated
+}
diff --git a/cmd/lotus-shed/genesis-verify.go b/cmd/lotus-shed/genesis-verify.go
index 4d961492f..6795f1528 100644
--- a/cmd/lotus-shed/genesis-verify.go
+++ b/cmd/lotus-shed/genesis-verify.go
@@ -51,7 +51,7 @@ var genesisVerifyCmd = &cli.Command{
if !cctx.Args().Present() {
return fmt.Errorf("must pass genesis car file")
}
- bs := blockstore.FromDatastore(datastore.NewMapDatastore())
+ bs := blockstore.NewMemory()
cs := store.NewChainStore(bs, bs, datastore.NewMapDatastore(), filcns.Weight, nil)
defer cs.Close() //nolint:errcheck
diff --git a/cmd/lotus-shed/invariants.go b/cmd/lotus-shed/invariants.go
new file mode 100644
index 000000000..e48f301c4
--- /dev/null
+++ b/cmd/lotus-shed/invariants.go
@@ -0,0 +1,148 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "strconv"
+ "time"
+
+ "github.com/ipfs/go-cid"
+ "github.com/urfave/cli/v2"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/builtin"
+ v8 "github.com/filecoin-project/go-state-types/builtin/v8"
+ v9 "github.com/filecoin-project/go-state-types/builtin/v9"
+
+ "github.com/filecoin-project/lotus/blockstore"
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/consensus/filcns"
+ "github.com/filecoin-project/lotus/chain/stmgr"
+ "github.com/filecoin-project/lotus/chain/store"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/chain/vm"
+ lcli "github.com/filecoin-project/lotus/cli"
+ "github.com/filecoin-project/lotus/node/repo"
+ "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
+)
+
+var invariantsCmd = &cli.Command{
+ Name: "check-invariants",
+ Description: "Check state invariants",
+ ArgsUsage: "[StateRootCid, height]",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo",
+ Value: "~/.lotus",
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ ctx := context.TODO()
+
+ if cctx.NArg() != 2 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ stateRootCid, err := cid.Decode(cctx.Args().Get(0))
+ if err != nil {
+ return fmt.Errorf("failed to parse state root cid: %w", err)
+ }
+
+ epoch, err := strconv.ParseInt(cctx.Args().Get(1), 10, 64)
+ if err != nil {
+ return fmt.Errorf("failed to parse epoch: %w", err)
+ }
+
+ fsrepo, err := repo.NewFS(cctx.String("repo"))
+ if err != nil {
+ return err
+ }
+
+ lkrepo, err := fsrepo.Lock(repo.FullNode)
+ if err != nil {
+ return err
+ }
+
+ defer lkrepo.Close() //nolint:errcheck
+
+ bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore)
+ if err != nil {
+ return fmt.Errorf("failed to open blockstore: %w", err)
+ }
+
+ defer func() {
+ if c, ok := bs.(io.Closer); ok {
+ if err := c.Close(); err != nil {
+ log.Warnf("failed to close blockstore: %s", err)
+ }
+ }
+ }()
+
+ mds, err := lkrepo.Datastore(context.Background(), "/metadata")
+ if err != nil {
+ return err
+ }
+
+ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil)
+ defer cs.Close() //nolint:errcheck
+
+ sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil)
+ if err != nil {
+ return err
+ }
+
+ nv := sm.GetNetworkVersion(ctx, abi.ChainEpoch(epoch))
+ fmt.Println("Network Version ", nv)
+
+ av, err := actorstypes.VersionForNetwork(nv)
+ if err != nil {
+ return err
+ }
+ fmt.Println("Actors Version ", av)
+
+ actorCodeCids, err := actors.GetActorCodeIDs(av)
+ if err != nil {
+ return err
+ }
+
+ actorStore := store.ActorStore(ctx, blockstore.NewTieredBstore(bs, blockstore.NewMemorySync()))
+
+ // Load the state root.
+ var stateRoot types.StateRoot
+ if err := actorStore.Get(ctx, stateRootCid, &stateRoot); err != nil {
+ return xerrors.Errorf("failed to decode state root: %w", err)
+ }
+
+ actorTree, err := builtin.LoadTree(actorStore, stateRoot.Actors)
+ if err != nil {
+ return err
+ }
+
+ startTime := time.Now()
+
+ var messages *builtin.MessageAccumulator
+ switch av {
+ case actorstypes.Version8:
+ messages, err = v8.CheckStateInvariants(actorTree, abi.ChainEpoch(epoch), actorCodeCids)
+ if err != nil {
+ return xerrors.Errorf("checking state invariants: %w", err)
+ }
+ case actorstypes.Version9:
+ messages, err = v9.CheckStateInvariants(actorTree, abi.ChainEpoch(epoch), actorCodeCids)
+ if err != nil {
+ return xerrors.Errorf("checking state invariants: %w", err)
+ }
+ }
+
+ fmt.Println("completed, took ", time.Since(startTime))
+
+ for _, message := range messages.Messages() {
+ fmt.Println("got the following error: ", message)
+ }
+
+ return nil
+ },
+}
diff --git a/cmd/lotus-shed/itestd.go b/cmd/lotus-shed/itestd.go
index 3ac542d27..7b9b7460d 100644
--- a/cmd/lotus-shed/itestd.go
+++ b/cmd/lotus-shed/itestd.go
@@ -9,6 +9,7 @@ import (
"net/http/httptest"
"os"
"os/exec"
+ "time"
"github.com/chzyer/readline"
"github.com/urfave/cli/v2"
@@ -25,6 +26,10 @@ var itestdCmd = &cli.Command{
Name: "listen",
Value: "127.0.0.1:5674",
},
+ &cli.StringFlag{
+ Name: "http-server-timeout",
+ Value: "30s",
+ },
},
Action: func(cctx *cli.Context) error {
var nodes []kit.ItestdNotif
@@ -44,9 +49,14 @@ var itestdCmd = &cli.Command{
if err != nil {
return xerrors.Errorf("net listen: %w", err)
}
+
+ timeout, err := time.ParseDuration(cctx.String("http-server-timeout"))
+ if err != nil {
+ return xerrors.Errorf("invalid time string %s: %x", cctx.String("http-server-timeout"), err)
+ }
s := &httptest.Server{
Listener: l,
- Config: &http.Server{Handler: m},
+ Config: &http.Server{Handler: m, ReadHeaderTimeout: timeout},
}
s.Start()
fmt.Printf("ITest env:\n\nLOTUS_ITESTD=%s\n\nSay 'sh' to spawn a shell connected to test nodes\n--- waiting for clients\n", s.URL)
diff --git a/cmd/lotus-shed/keyinfo.go b/cmd/lotus-shed/keyinfo.go
index 135b5bc9d..373964dc6 100644
--- a/cmd/lotus-shed/keyinfo.go
+++ b/cmd/lotus-shed/keyinfo.go
@@ -149,7 +149,7 @@ var keyinfoImportCmd = &cli.Command{
flagRepo := cctx.String("repo")
var input io.Reader
- if cctx.Args().Len() == 0 {
+ if cctx.NArg() == 0 {
input = os.Stdin
} else {
var err error
@@ -261,7 +261,7 @@ var keyinfoInfoCmd = &cli.Command{
format := cctx.String("format")
var input io.Reader
- if cctx.Args().Len() == 0 {
+ if cctx.NArg() == 0 {
input = os.Stdin
} else {
var err error
diff --git a/cmd/lotus-shed/ledger.go b/cmd/lotus-shed/ledger.go
index 20de8dd89..d9a888d20 100644
--- a/cmd/lotus-shed/ledger.go
+++ b/cmd/lotus-shed/ledger.go
@@ -300,7 +300,7 @@ var ledgerNewAddressesCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
if cctx.NArg() != 1 {
- return fmt.Errorf("must pass account index")
+ return lcli.IncorrectNumArgs(cctx)
}
index, err := strconv.ParseUint(cctx.Args().First(), 10, 32)
diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go
index 0f10a617f..623afb55e 100644
--- a/cmd/lotus-shed/main.go
+++ b/cmd/lotus-shed/main.go
@@ -13,7 +13,10 @@ import (
var log = logging.Logger("lotus-shed")
func main() {
- logging.SetLogLevel("*", "INFO")
+ _ = logging.SetLogLevel("*", "INFO")
+ _ = logging.SetLogLevelRegex("badger*", "ERROR")
+ _ = logging.SetLogLevel("drand", "ERROR")
+ _ = logging.SetLogLevel("chainstore", "ERROR")
local := []*cli.Command{
addressCmd,
@@ -73,6 +76,11 @@ func main() {
migrationsCmd,
diffCmd,
itestdCmd,
+ msigCmd,
+ fip36PollCmd,
+ invariantsCmd,
+ gasTraceCmd,
+ replayOfflineCmd,
}
app := &cli.App{
@@ -105,7 +113,7 @@ func main() {
}
if err := app.Run(os.Args); err != nil {
- log.Warnf("%+v", err)
+ log.Errorf("%+v", err)
os.Exit(1)
return
}
diff --git a/cmd/lotus-shed/mempool-stats.go b/cmd/lotus-shed/mempool-stats.go
index 9e4a2629c..08aceb020 100644
--- a/cmd/lotus-shed/mempool-stats.go
+++ b/cmd/lotus-shed/mempool-stats.go
@@ -13,6 +13,7 @@ import (
"go.opencensus.io/stats"
"go.opencensus.io/stats/view"
"go.opencensus.io/tag"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/builtin"
@@ -76,8 +77,14 @@ type msgInfo struct {
var mpoolStatsCmd = &cli.Command{
Name: "mpool-stats",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "http-server-timeout",
+ Value: "30s",
+ },
+ },
Action: func(cctx *cli.Context) error {
- logging.SetLogLevel("rpc", "ERROR")
+ _ = logging.SetLogLevel("rpc", "ERROR")
if err := view.Register(AgeView, SizeView, InboundRate, InclusionRate, MsgWait); err != nil {
return err
@@ -92,8 +99,18 @@ var mpoolStatsCmd = &cli.Command{
http.Handle("/debug/metrics", expo)
+ timeout, err := time.ParseDuration(cctx.String("http-server-timeout"))
+ if err != nil {
+ return xerrors.Errorf("invalid time string %s: %x", cctx.String("http-server-timeout"), err)
+ }
+
go func() {
- if err := http.ListenAndServe(":10555", nil); err != nil {
+ server := &http.Server{
+ Addr: ":10555",
+ ReadHeaderTimeout: timeout,
+ }
+
+ if err := server.ListenAndServe(); err != nil {
panic(err)
}
}()
diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go
index 2c75edd74..f23942326 100644
--- a/cmd/lotus-shed/migrations.go
+++ b/cmd/lotus-shed/migrations.go
@@ -7,34 +7,70 @@ import (
"time"
"github.com/ipfs/go-cid"
+ logging "github.com/ipfs/go-log/v2"
"github.com/urfave/cli/v2"
+ cbg "github.com/whyrusleeping/cbor-gen"
+ "golang.org/x/xerrors"
+ ffi "github.com/filecoin-project/filecoin-ffi"
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+ "github.com/filecoin-project/go-state-types/builtin"
+ market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
+ v9 "github.com/filecoin-project/go-state-types/builtin/v9"
+ market9 "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
+ verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/specs-actors/v7/actors/migration/nv15"
+ "github.com/filecoin-project/lotus/blockstore"
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ lbuiltin "github.com/filecoin-project/lotus/chain/actors/builtin"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/datacap"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/market"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
"github.com/filecoin-project/lotus/chain/consensus/filcns"
+ "github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/stmgr"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/vm"
+ lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/node/repo"
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
)
var migrationsCmd = &cli.Command{
- Name: "migrate-nv16",
- Description: "Run the nv16 migration",
+ Name: "migrate-nv17",
+ Description: "Run the nv17 migration",
ArgsUsage: "[block to look back from]",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "repo",
Value: "~/.lotus",
},
+ &cli.BoolFlag{
+ Name: "skip-pre-migration",
+ },
+ &cli.BoolFlag{
+ Name: "check-invariants",
+ },
},
Action: func(cctx *cli.Context) error {
ctx := context.TODO()
+ err := logging.SetLogLevelRegex("badger*", "ERROR")
+ if err != nil {
+ return err
+ }
+
if cctx.NArg() != 1 {
- return fmt.Errorf("must pass block cid")
+ return lcli.IncorrectNumArgs(cctx)
}
blkCid, err := cid.Decode(cctx.Args().First())
@@ -80,8 +116,6 @@ var migrationsCmd = &cli.Command{
return err
}
- cache := nv15.NewMemMigrationCache()
-
blk, err := cs.GetBlock(ctx, blkCid)
if err != nil {
return err
@@ -92,36 +126,581 @@ var migrationsCmd = &cli.Command{
return err
}
- ts1, err := cs.GetTipsetByHeight(ctx, blk.Height-180, migrationTs, false)
- if err != nil {
- return err
- }
-
startTime := time.Now()
- err = filcns.PreUpgradeActorsV8(ctx, sm, cache, ts1.ParentState(), ts1.Height()-1, ts1)
+ newCid2, err := filcns.UpgradeActorsV9(ctx, sm, nv15.NewMemMigrationCache(), nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
if err != nil {
return err
}
- fmt.Println("completed round 1, took ", time.Since(startTime))
- startTime = time.Now()
+ uncachedMigrationTime := time.Since(startTime)
- newCid1, err := filcns.UpgradeActorsV8(ctx, sm, cache, nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
- if err != nil {
- return err
+ fmt.Println("migration height ", blk.Height-1)
+ fmt.Println("old cid ", blk.ParentStateRoot)
+ fmt.Println("new cid ", newCid2)
+ fmt.Println("completed round actual (without cache), took ", uncachedMigrationTime)
+
+ if !cctx.IsSet("skip-pre-migration") {
+ cache := nv15.NewMemMigrationCache()
+
+ ts1, err := cs.GetTipsetByHeight(ctx, blk.Height-240, migrationTs, false)
+ if err != nil {
+ return err
+ }
+
+ startTime = time.Now()
+
+ err = filcns.PreUpgradeActorsV9(ctx, sm, cache, ts1.ParentState(), ts1.Height()-1, ts1)
+ if err != nil {
+ return err
+ }
+
+ preMigration1Time := time.Since(startTime)
+
+ ts2, err := cs.GetTipsetByHeight(ctx, blk.Height-15, migrationTs, false)
+ if err != nil {
+ return err
+ }
+
+ startTime = time.Now()
+
+ err = filcns.PreUpgradeActorsV9(ctx, sm, cache, ts2.ParentState(), ts2.Height()-1, ts2)
+ if err != nil {
+ return err
+ }
+
+ preMigration2Time := time.Since(startTime)
+
+ startTime = time.Now()
+
+ newCid1, err := filcns.UpgradeActorsV9(ctx, sm, cache, nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
+ if err != nil {
+ return err
+ }
+
+ cachedMigrationTime := time.Since(startTime)
+
+ if newCid1 != newCid2 {
+ return xerrors.Errorf("got different results with and without the cache: %s, %s", newCid1,
+ newCid2)
+ }
+ fmt.Println("completed premigration 1, took ", preMigration1Time)
+ fmt.Println("completed premigration 2, took ", preMigration2Time)
+ fmt.Println("completed round actual (with cache), took ", cachedMigrationTime)
}
- fmt.Println("completed round actual (with cache), took ", time.Since(startTime))
- fmt.Println("new cid", newCid1)
-
- newCid2, err := filcns.UpgradeActorsV8(ctx, sm, nv15.NewMemMigrationCache(), nil, blk.ParentStateRoot, blk.Height-1, migrationTs)
- if err != nil {
- return err
+ if cctx.Bool("check-invariants") {
+ err = checkMigrationInvariants(ctx, blk.ParentStateRoot, newCid2, bs, blk.Height-1)
+ if err != nil {
+ return err
+ }
}
- fmt.Println("completed round actual (without cache), took ", time.Since(startTime))
- fmt.Println("new cid", newCid2)
return nil
},
}
+
+func checkMigrationInvariants(ctx context.Context, v8StateRootCid cid.Cid, v9StateRootCid cid.Cid, bs blockstore.Blockstore, epoch abi.ChainEpoch) error {
+ actorStore := store.ActorStore(ctx, bs)
+ startTime := time.Now()
+
+ stateTreeV8, err := state.LoadStateTree(actorStore, v8StateRootCid)
+ if err != nil {
+ return err
+ }
+
+ stateTreeV9, err := state.LoadStateTree(actorStore, v9StateRootCid)
+ if err != nil {
+ return err
+ }
+
+ err = checkDatacaps(stateTreeV8, stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ err = checkPendingVerifiedDeals(stateTreeV8, stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ err = checkAllMinersUnsealedCID(stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ // Load the state root.
+ var v9stateRoot types.StateRoot
+ if err := actorStore.Get(ctx, v9StateRootCid, &v9stateRoot); err != nil {
+ return xerrors.Errorf("failed to decode state root: %w", err)
+ }
+
+ actorCodeCids, err := actors.GetActorCodeIDs(actorstypes.Version9)
+ if err != nil {
+ return err
+ }
+ v9actorTree, err := builtin.LoadTree(actorStore, v9stateRoot.Actors)
+ if err != nil {
+ return err
+ }
+ messages, err := v9.CheckStateInvariants(v9actorTree, epoch, actorCodeCids)
+ if err != nil {
+ return xerrors.Errorf("checking state invariants: %w", err)
+ }
+
+ for _, message := range messages.Messages() {
+ fmt.Println("got the following error: ", message)
+ }
+
+ fmt.Println("completed invariant checks, took ", time.Since(startTime))
+
+ return nil
+}
+
+func checkDatacaps(stateTreeV8 *state.StateTree, stateTreeV9 *state.StateTree, actorStore adt.Store) error {
+ verifregDatacaps, err := getVerifreg8Datacaps(stateTreeV8, actorStore)
+ if err != nil {
+ return err
+ }
+
+ newDatacaps, err := getDatacap9Datacaps(stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ // Should have all the v8 datacaps, plus the verifreg actor itself
+ if len(verifregDatacaps)+1 != len(newDatacaps) {
+ return xerrors.Errorf("size of datacap maps do not match. verifreg: %d, datacap: %d", len(verifregDatacaps), len(newDatacaps))
+ }
+
+ for addr, oldDcap := range verifregDatacaps {
+ dcap, ok := newDatacaps[addr]
+ if !ok {
+ return xerrors.Errorf("datacap for address: %s not found in datacap state", addr)
+ }
+ if !dcap.Equals(oldDcap) {
+ return xerrors.Errorf("datacap for address: %s do not match. verifreg: %d, datacap: %d", addr, oldDcap, dcap)
+ }
+ }
+
+ return nil
+}
+
+func getVerifreg8Datacaps(stateTreeV8 *state.StateTree, actorStore adt.Store) (map[address.Address]abi.StoragePower, error) {
+ verifregStateV8, err := getVerifregActorV8(stateTreeV8, actorStore)
+ if err != nil {
+ return nil, xerrors.Errorf("failed to get verifreg actor state: %w", err)
+ }
+
+ var verifregDatacaps = make(map[address.Address]abi.StoragePower)
+ err = verifregStateV8.ForEachClient(func(addr address.Address, dcap abi.StoragePower) error {
+ verifregDatacaps[addr] = dcap
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ return verifregDatacaps, nil
+}
+
+func getDatacap9Datacaps(stateTreeV9 *state.StateTree, actorStore adt.Store) (map[address.Address]abi.StoragePower, error) {
+ datacapStateV9, err := getDatacapActorV9(stateTreeV9, actorStore)
+ if err != nil {
+ return nil, xerrors.Errorf("failed to get datacap actor state: %w", err)
+ }
+
+ var datacaps = make(map[address.Address]abi.StoragePower)
+ err = datacapStateV9.ForEachClient(func(addr address.Address, dcap abi.StoragePower) error {
+ datacaps[addr] = dcap
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ return datacaps, nil
+}
+
+func checkPendingVerifiedDeals(stateTreeV8 *state.StateTree, stateTreeV9 *state.StateTree, actorStore adt.Store) error {
+ marketActorV9, err := getMarketActorV9(stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ verifregActorV9, err := getVerifregActorV9(stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ verifregStateV9, err := getVerifregStateV9(stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ marketStateV8, err := getMarketStateV8(stateTreeV8, actorStore)
+ if err != nil {
+ return err
+ }
+
+ marketStateV9, err := getMarketStateV9(stateTreeV9, actorStore)
+ if err != nil {
+ return err
+ }
+
+ pendingProposalsV8, err := adt8.AsSet(actorStore, marketStateV8.PendingProposals, builtin.DefaultHamtBitwidth)
+ if err != nil {
+ return xerrors.Errorf("failed to load pending proposals: %w", err)
+ }
+
+ dealProposalsV8, err := market8.AsDealProposalArray(actorStore, marketStateV8.Proposals)
+ if err != nil {
+ return xerrors.Errorf("failed to get proposals: %w", err)
+ }
+
+ // We only want those pending deals that haven't been activated -- an activated deal has an entry in dealStates8
+ dealStates8, err := adt9.AsArray(actorStore, marketStateV8.States, market8.StatesAmtBitwidth)
+ if err != nil {
+ return xerrors.Errorf("failed to load v8 states array: %w", err)
+ }
+
+ var numPendingVerifiedDeals = 0
+ var proposal market8.DealProposal
+ err = dealProposalsV8.ForEach(&proposal, func(dealID int64) error {
+ // If not verified, do nothing
+ if !proposal.VerifiedDeal {
+ return nil
+ }
+
+ pcid, err := proposal.Cid()
+ if err != nil {
+ return err
+ }
+
+ isPending, err := pendingProposalsV8.Has(abi.CidKey(pcid))
+ if err != nil {
+ return xerrors.Errorf("failed to check pending: %w", err)
+ }
+
+ // Nothing to do for not-pending deals
+ if !isPending {
+ return nil
+ }
+
+ var _dealState8 market8.DealState
+ found, err := dealStates8.Get(uint64(dealID), &_dealState8)
+ if err != nil {
+ return xerrors.Errorf("failed to lookup deal state: %w", err)
+ }
+
+ // the deal has an entry in deal states, which means it's already been allocated, nothing to do
+ if found {
+ return nil
+ }
+
+ numPendingVerifiedDeals++
+ // Checks if allocation ID is in market map
+ allocationId, err := marketActorV9.GetAllocationIdForPendingDeal(abi.DealID(dealID))
+ if err != nil {
+ return err
+ }
+
+ // Checks if allocation is in verifreg
+ allocation, found, err := verifregActorV9.GetAllocation(proposal.Client, allocationId)
+ if !found {
+ return xerrors.Errorf("allocation %d not found for address %s", allocationId, proposal.Client)
+ }
+ if err != nil {
+ return err
+ }
+
+ err = compareProposalToAllocation(proposal, *allocation)
+ if err != nil {
+ return err
+ }
+
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ fmt.Printf("Pending Verified deals in market v8: %d\n", numPendingVerifiedDeals)
+
+ numAllocationIds, err := countAllocationIds(actorStore, marketStateV9)
+ if err != nil {
+ return err
+ }
+ fmt.Printf("Allocation IDs in market v9: %d\n", numAllocationIds)
+
+ if numAllocationIds != numPendingVerifiedDeals {
+ return xerrors.Errorf("number of allocation IDsf: %d did not match the number of pending verified deals: %d", numAllocationIds, numPendingVerifiedDeals)
+ }
+
+ numAllocations, err := countAllocations(verifregStateV9, actorStore)
+ if err != nil {
+ return err
+ }
+ fmt.Printf("Allocations in verifreg v9: %d\n", numAllocations)
+
+ if numAllocations != numPendingVerifiedDeals {
+ return xerrors.Errorf("number of allocations: %d did not match the number of pending verified deals: %d", numAllocations, numPendingVerifiedDeals)
+ }
+
+ nextAllocationId := int(verifregStateV9.NextAllocationId)
+ fmt.Printf("Next Allocation ID: %d\n", nextAllocationId)
+
+ if numAllocations+1 != nextAllocationId {
+ return xerrors.Errorf("number of allocations + 1: %d did not match the next allocation ID: %d", numAllocations+1, nextAllocationId)
+ }
+
+ return nil
+}
+
+func compareProposalToAllocation(prop market8.DealProposal, alloc verifreg9.Allocation) error {
+ if prop.PieceCID != alloc.Data {
+ return xerrors.Errorf("piece cid mismatch between proposal and allocation: %s, %s", prop.PieceCID, alloc.Data)
+ }
+
+ proposalClientID, err := address.IDFromAddress(prop.Client)
+ if err != nil {
+ return xerrors.Errorf("couldnt get ID from address")
+ }
+ if proposalClientID != uint64(alloc.Client) {
+ return xerrors.Errorf("client id mismatch between proposal and allocation: %v, %v", proposalClientID, alloc.Client)
+ }
+
+ proposalProviderID, err := address.IDFromAddress(prop.Provider)
+ if err != nil {
+ return xerrors.Errorf("couldnt get ID from address")
+ }
+ if proposalProviderID != uint64(alloc.Provider) {
+ return xerrors.Errorf("provider id mismatch between proposal and allocation: %v, %v", proposalProviderID, alloc.Provider)
+ }
+
+ if prop.PieceSize != alloc.Size {
+ return xerrors.Errorf("piece size mismatch between proposal and allocation: %v, %v", prop.PieceSize, alloc.Size)
+ }
+
+ if alloc.TermMax != 540*builtin.EpochsInDay {
+ return xerrors.Errorf("allocation term should be 540 days. Got %d epochs", alloc.TermMax)
+ }
+
+ if prop.EndEpoch-prop.StartEpoch != alloc.TermMin {
+ return xerrors.Errorf("allocation term mismatch between proposal and allocation: %d, %d", prop.EndEpoch-prop.StartEpoch, alloc.TermMin)
+ }
+
+ return nil
+}
+
+func getMarketStateV8(stateTreeV8 *state.StateTree, actorStore adt.Store) (market8.State, error) {
+ marketV8, err := stateTreeV8.GetActor(market.Address)
+ if err != nil {
+ return market8.State{}, err
+ }
+
+ var marketStateV8 market8.State
+ if err = actorStore.Get(actorStore.Context(), marketV8.Head, &marketStateV8); err != nil {
+ return market8.State{}, xerrors.Errorf("failed to get market actor state: %w", err)
+ }
+
+ return marketStateV8, nil
+}
+
+func getMarketStateV9(stateTreeV9 *state.StateTree, actorStore adt.Store) (market9.State, error) {
+ marketV9, err := stateTreeV9.GetActor(market.Address)
+ if err != nil {
+ return market9.State{}, err
+ }
+
+ var marketStateV9 market9.State
+ if err = actorStore.Get(actorStore.Context(), marketV9.Head, &marketStateV9); err != nil {
+ return market9.State{}, xerrors.Errorf("failed to get market actor state: %w", err)
+ }
+
+ return marketStateV9, nil
+}
+
+func getMarketActorV9(stateTreeV9 *state.StateTree, actorStore adt.Store) (market.State, error) {
+ marketV9, err := stateTreeV9.GetActor(market.Address)
+ if err != nil {
+ return nil, err
+ }
+
+ return market.Load(actorStore, marketV9)
+}
+
+func getVerifregActorV8(stateTreeV8 *state.StateTree, actorStore adt.Store) (verifreg.State, error) {
+ verifregV8, err := stateTreeV8.GetActor(verifreg.Address)
+ if err != nil {
+ return nil, err
+ }
+
+ return verifreg.Load(actorStore, verifregV8)
+}
+
+func getVerifregActorV9(stateTreeV9 *state.StateTree, actorStore adt.Store) (verifreg.State, error) {
+ verifregV9, err := stateTreeV9.GetActor(verifreg.Address)
+ if err != nil {
+ return nil, err
+ }
+
+ return verifreg.Load(actorStore, verifregV9)
+}
+
+func getVerifregStateV9(stateTreeV9 *state.StateTree, actorStore adt.Store) (verifreg9.State, error) {
+ verifregV9, err := stateTreeV9.GetActor(verifreg.Address)
+ if err != nil {
+ return verifreg9.State{}, err
+ }
+
+ var verifregStateV9 verifreg9.State
+ if err = actorStore.Get(actorStore.Context(), verifregV9.Head, &verifregStateV9); err != nil {
+ return verifreg9.State{}, xerrors.Errorf("failed to get verifreg actor state: %w", err)
+ }
+
+ return verifregStateV9, nil
+}
+
+func getDatacapActorV9(stateTreeV9 *state.StateTree, actorStore adt.Store) (datacap.State, error) {
+ datacapV9, err := stateTreeV9.GetActor(datacap.Address)
+ if err != nil {
+ return nil, err
+ }
+
+ return datacap.Load(actorStore, datacapV9)
+}
+
+func checkAllMinersUnsealedCID(stateTreeV9 *state.StateTree, store adt.Store) error {
+ return stateTreeV9.ForEach(func(addr address.Address, actor *types.Actor) error {
+ if !lbuiltin.IsStorageMinerActor(actor.Code) {
+ return nil // no need to check
+ }
+
+ err := checkMinerUnsealedCID(actor, stateTreeV9, store)
+ if err != nil {
+ fmt.Println("failure for miner ", addr)
+ return err
+ }
+ return nil
+ })
+}
+
+func checkMinerUnsealedCID(act *types.Actor, stateTreeV9 *state.StateTree, store adt.Store) error {
+ minerCodeCid, found := actors.GetActorCodeID(actorstypes.Version9, actors.MinerKey)
+ if !found {
+ return xerrors.Errorf("could not find code cid for miner actor")
+ }
+ if minerCodeCid != act.Code {
+ return nil // no need to check
+ }
+
+ marketActorV9, err := getMarketActorV9(stateTreeV9, store)
+ if err != nil {
+ return err
+ }
+ dealProposals, err := marketActorV9.Proposals()
+ if err != nil {
+ return err
+ }
+
+ m, err := miner.Load(store, act)
+ if err != nil {
+ return err
+ }
+
+ err = m.ForEachPrecommittedSector(func(info miner9.SectorPreCommitOnChainInfo) error {
+ dealIDs := info.Info.DealIDs
+
+ if len(dealIDs) == 0 {
+ return nil // Nothing to check here
+ }
+
+ pieceCids := make([]abi.PieceInfo, len(dealIDs))
+ for i, dealId := range dealIDs {
+ dealProposal, found, err := dealProposals.Get(dealId)
+ if err != nil {
+ return err
+ }
+ if !found {
+ return nil
+ }
+
+ pieceCids[i] = abi.PieceInfo{
+ Size: dealProposal.PieceSize,
+ PieceCID: dealProposal.PieceCID,
+ }
+ }
+
+ if len(pieceCids) == 0 {
+ return nil
+ }
+
+ if info.Info.UnsealedCid == nil {
+ return xerrors.Errorf("nil unsealed CID for sector with deals")
+ }
+
+ pieceCID, err := ffi.GenerateUnsealedCID(abi.RegisteredSealProof_StackedDrg64GiBV1_1, pieceCids)
+ if err != nil {
+ return err
+ }
+
+ if pieceCID != *info.Info.UnsealedCid {
+ return xerrors.Errorf("calculated piece CID %s did not match unsealed CID in precommitted sector info: %s", pieceCID, *info.Info.UnsealedCid)
+ }
+
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func countAllocations(verifregState verifreg9.State, store adt.Store) (int, error) {
+ var count = 0
+
+ actorToHamtMap, err := adt9.AsMap(store, verifregState.Allocations, builtin.DefaultHamtBitwidth)
+ if err != nil {
+ return 0, xerrors.Errorf("couldn't get outer map: %x", err)
+ }
+
+ var innerHamtCid cbg.CborCid
+ err = actorToHamtMap.ForEach(&innerHamtCid, func(key string) error {
+ innerMap, err := adt9.AsMap(store, cid.Cid(innerHamtCid), builtin.DefaultHamtBitwidth)
+ if err != nil {
+ return xerrors.Errorf("couldn't get outer map: %x", err)
+ }
+
+ var allocation verifreg9.Allocation
+ err = innerMap.ForEach(&allocation, func(key string) error {
+ count++
+ return nil
+ })
+ if err != nil {
+ return xerrors.Errorf("couldn't iterate over inner map: %x", err)
+ }
+
+ return nil
+ })
+ if err != nil {
+ return 0, xerrors.Errorf("couldn't iterate over outer map: %x", err)
+ }
+
+ return count, nil
+}
+
+func countAllocationIds(store adt.Store, marketState market9.State) (int, error) {
+ allocationIds, err := adt9.AsMap(store, marketState.PendingDealAllocationIds, builtin.DefaultHamtBitwidth)
+ if err != nil {
+ return 0, err
+ }
+
+ var numAllocationIds int
+ _ = allocationIds.ForEach(nil, func(key string) error {
+ numAllocationIds++
+ return nil
+ })
+
+ return numAllocationIds, nil
+}
diff --git a/cmd/lotus-shed/miner-multisig.go b/cmd/lotus-shed/miner-multisig.go
index aba08113f..080229a6a 100644
--- a/cmd/lotus-shed/miner-multisig.go
+++ b/cmd/lotus-shed/miner-multisig.go
@@ -12,9 +12,8 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner"
- miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner"
- msig5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/multisig"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/multisig"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors"
@@ -33,6 +32,8 @@ var minerMultisigsCmd = &cli.Command{
mmProposeChangeWorker,
mmConfirmChangeWorker,
mmProposeControlSet,
+ mmProposeChangeBeneficiary,
+ mmConfirmChangeBeneficiary,
},
Flags: []cli.Flag{
&cli.StringFlag{
@@ -80,7 +81,7 @@ var mmProposeWithdrawBalance = &cli.Command{
return err
}
- sp, err := actors.SerializeParams(&miner5.WithdrawBalanceParams{
+ sp, err := actors.SerializeParams(&miner.WithdrawBalanceParams{
AmountRequested: abi.TokenAmount(val),
})
if err != nil {
@@ -101,12 +102,12 @@ var mmProposeWithdrawBalance = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Propose owner change tx failed!")
return err
}
- var retval msig5.ProposeReturn
+ var retval multisig.ProposeReturn
if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil {
return fmt.Errorf("failed to unmarshal propose return value: %w", err)
}
@@ -128,7 +129,7 @@ var mmApproveWithdrawBalance = &cli.Command{
ArgsUsage: "[amount txnId proposer]",
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 3 {
- return fmt.Errorf("must pass amount, txn Id, and proposer address")
+ return lcli.IncorrectNumArgs(cctx)
}
api, closer, err := lcli.GetFullNodeAPI(cctx)
@@ -149,7 +150,7 @@ var mmApproveWithdrawBalance = &cli.Command{
return err
}
- sp, err := actors.SerializeParams(&miner5.WithdrawBalanceParams{
+ sp, err := actors.SerializeParams(&miner.WithdrawBalanceParams{
AmountRequested: abi.TokenAmount(val),
})
if err != nil {
@@ -180,12 +181,12 @@ var mmApproveWithdrawBalance = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Approve owner change tx failed!")
return err
}
- var retval msig5.ApproveReturn
+ var retval multisig.ApproveReturn
if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil {
return fmt.Errorf("failed to unmarshal approve return value: %w", err)
}
@@ -261,12 +262,12 @@ var mmProposeChangeOwner = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Propose owner change tx failed!")
return err
}
- var retval msig5.ProposeReturn
+ var retval multisig.ProposeReturn
if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil {
return fmt.Errorf("failed to unmarshal propose return value: %w", err)
}
@@ -287,7 +288,7 @@ var mmApproveChangeOwner = &cli.Command{
ArgsUsage: "[newOwner txnId proposer]",
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 3 {
- return fmt.Errorf("must pass new owner address, txn Id, and proposer address")
+ return lcli.IncorrectNumArgs(cctx)
}
api, closer, err := lcli.GetFullNodeAPI(cctx)
@@ -351,12 +352,12 @@ var mmApproveChangeOwner = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Approve owner change tx failed!")
return err
}
- var retval msig5.ApproveReturn
+ var retval multisig.ApproveReturn
if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil {
return fmt.Errorf("failed to unmarshal approve return value: %w", err)
}
@@ -421,7 +422,7 @@ var mmProposeChangeWorker = &cli.Command{
}
}
- cwp := &miner2.ChangeWorkerAddressParams{
+ cwp := &miner.ChangeWorkerAddressParams{
NewWorker: newAddr,
NewControlAddrs: mi.ControlAddresses,
}
@@ -448,12 +449,12 @@ var mmProposeChangeWorker = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Propose worker change tx failed!")
return err
}
- var retval msig5.ProposeReturn
+ var retval multisig.ProposeReturn
if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil {
return fmt.Errorf("failed to unmarshal propose return value: %w", err)
}
@@ -469,6 +470,114 @@ var mmProposeChangeWorker = &cli.Command{
},
}
+var mmProposeChangeBeneficiary = &cli.Command{
+ Name: "propose-change-beneficiary",
+ Usage: "Propose a beneficiary address change",
+ ArgsUsage: "[beneficiaryAddress quota expiration]",
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "really-do-it",
+ Usage: "Actually send transaction performing the action",
+ Value: false,
+ },
+ &cli.BoolFlag{
+ Name: "overwrite-pending-change",
+ Usage: "Overwrite the current beneficiary change proposal",
+ Value: false,
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 3 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ api, acloser, err := lcli.GetFullNodeAPI(cctx)
+ if err != nil {
+ return xerrors.Errorf("getting fullnode api: %w", err)
+ }
+ defer acloser()
+
+ ctx := lcli.ReqContext(cctx)
+
+ na, err := address.NewFromString(cctx.Args().Get(0))
+ if err != nil {
+ return xerrors.Errorf("parsing beneficiary address: %w", err)
+ }
+
+ newAddr, err := api.StateLookupID(ctx, na, types.EmptyTSK)
+ if err != nil {
+ return xerrors.Errorf("looking up new beneficiary address: %w", err)
+ }
+
+ quota, err := types.ParseFIL(cctx.Args().Get(1))
+ if err != nil {
+ return xerrors.Errorf("parsing quota: %w", err)
+ }
+
+ expiration, err := types.BigFromString(cctx.Args().Get(2))
+ if err != nil {
+ return xerrors.Errorf("parsing expiration: %w", err)
+ }
+
+ multisigAddr, sender, minerAddr, err := getInputs(cctx)
+ if err != nil {
+ return err
+ }
+
+ mi, err := api.StateMinerInfo(ctx, minerAddr, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ if mi.PendingBeneficiaryTerm != nil {
+ fmt.Println("WARNING: replacing Pending Beneficiary Term of:")
+ fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary)
+ fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota)
+ fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration)
+
+ if !cctx.Bool("overwrite-pending-change") {
+ return fmt.Errorf("must pass --overwrite-pending-change to replace current pending beneficiary change. Please review CAREFULLY")
+ }
+ }
+
+ if !cctx.Bool("really-do-it") {
+ fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please")
+ return nil
+ }
+
+ params := &miner.ChangeBeneficiaryParams{
+ NewBeneficiary: newAddr,
+ NewQuota: abi.TokenAmount(quota),
+ NewExpiration: abi.ChainEpoch(expiration.Int64()),
+ }
+
+ sp, err := actors.SerializeParams(params)
+ if err != nil {
+ return xerrors.Errorf("serializing params: %w", err)
+ }
+
+ pcid, err := api.MsigPropose(ctx, multisigAddr, minerAddr, big.Zero(), sender, uint64(builtin.MethodsMiner.ChangeBeneficiary), sp)
+ if err != nil {
+ return xerrors.Errorf("proposing message: %w", err)
+ }
+
+ fmt.Println("Propose Message CID: ", pcid)
+
+ // wait for it to get mined into a block
+ wait, err := api.StateWaitMsg(ctx, pcid, build.MessageConfidence)
+ if err != nil {
+ return xerrors.Errorf("waiting for message to be included in block: %w", err)
+ }
+
+ // check it executed successfully
+ if wait.Receipt.ExitCode.IsError() {
+ return fmt.Errorf("propose beneficiary change failed")
+ }
+
+ return nil
+ },
+}
+
var mmConfirmChangeWorker = &cli.Command{
Name: "confirm-change-worker",
Usage: "Confirm an worker address change",
@@ -532,12 +641,12 @@ var mmConfirmChangeWorker = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Propose worker change tx failed!")
return err
}
- var retval msig5.ProposeReturn
+ var retval multisig.ProposeReturn
if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil {
return fmt.Errorf("failed to unmarshal propose return value: %w", err)
}
@@ -552,6 +661,98 @@ var mmConfirmChangeWorker = &cli.Command{
},
}
+var mmConfirmChangeBeneficiary = &cli.Command{
+ Name: "confirm-change-beneficiary",
+ Usage: "Confirm a beneficiary address change",
+ ArgsUsage: "[minerAddress]",
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "really-do-it",
+ Usage: "Actually send transaction performing the action",
+ Value: false,
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
+ }
+
+ api, acloser, err := lcli.GetFullNodeAPI(cctx)
+ if err != nil {
+ return xerrors.Errorf("getting fullnode api: %w", err)
+ }
+ defer acloser()
+
+ ctx := lcli.ReqContext(cctx)
+
+ multisigAddr, sender, minerAddr, err := getInputs(cctx)
+ if err != nil {
+ return err
+ }
+
+ mi, err := api.StateMinerInfo(ctx, minerAddr, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ if mi.PendingBeneficiaryTerm == nil {
+ return fmt.Errorf("no pending beneficiary term found for miner %s", minerAddr)
+ }
+
+ fmt.Println("Confirming Pending Beneficiary Term of:")
+ fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary)
+ fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota)
+ fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration)
+
+ if !cctx.Bool("really-do-it") {
+ fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please")
+ return nil
+ }
+
+ params := &miner.ChangeBeneficiaryParams{
+ NewBeneficiary: mi.PendingBeneficiaryTerm.NewBeneficiary,
+ NewQuota: mi.PendingBeneficiaryTerm.NewQuota,
+ NewExpiration: mi.PendingBeneficiaryTerm.NewExpiration,
+ }
+
+ sp, err := actors.SerializeParams(params)
+ if err != nil {
+ return xerrors.Errorf("serializing params: %w", err)
+ }
+
+ pcid, err := api.MsigPropose(ctx, multisigAddr, minerAddr, big.Zero(), sender, uint64(builtin.MethodsMiner.ChangeBeneficiary), sp)
+ if err != nil {
+ return xerrors.Errorf("proposing message: %w", err)
+ }
+
+ fmt.Println("Confirm Message CID:", pcid)
+
+ // wait for it to get mined into a block
+ wait, err := api.StateWaitMsg(ctx, pcid, build.MessageConfidence)
+ if err != nil {
+ return xerrors.Errorf("waiting for message to be included in block: %w", err)
+ }
+
+ // check it executed successfully
+ if wait.Receipt.ExitCode.IsError() {
+ return fmt.Errorf("confirm beneficiary change failed with code %d", wait.Receipt.ExitCode)
+ }
+
+ updatedMinerInfo, err := api.StateMinerInfo(ctx, minerAddr, types.EmptyTSK)
+ if err != nil {
+ return err
+ }
+
+ if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == mi.PendingBeneficiaryTerm.NewBeneficiary {
+ fmt.Println("Beneficiary address successfully changed")
+ } else {
+ fmt.Println("Beneficiary address change awaiting additional confirmations")
+ }
+
+ return nil
+ },
+}
+
var mmProposeControlSet = &cli.Command{
Name: "propose-control-set",
Usage: "Set control address(-es)",
@@ -623,7 +824,7 @@ var mmProposeControlSet = &cli.Command{
}
}
- cwp := &miner2.ChangeWorkerAddressParams{
+ cwp := &miner.ChangeWorkerAddressParams{
NewWorker: mi.Worker,
NewControlAddrs: toSet,
}
@@ -647,12 +848,12 @@ var mmProposeControlSet = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Fprintln(cctx.App.Writer, "Propose worker change tx failed!")
return err
}
- var retval msig5.ProposeReturn
+ var retval multisig.ProposeReturn
if err := retval.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil {
return fmt.Errorf("failed to unmarshal propose return value: %w", err)
}
diff --git a/cmd/lotus-shed/miner-peerid.go b/cmd/lotus-shed/miner-peerid.go
index 85f720a10..e43063797 100644
--- a/cmd/lotus-shed/miner-peerid.go
+++ b/cmd/lotus-shed/miner-peerid.go
@@ -20,6 +20,7 @@ import (
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
+ lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/node/repo"
)
@@ -35,7 +36,7 @@ var minerPeeridCmd = &cli.Command{
ctx := context.TODO()
if cctx.NArg() != 2 {
- return fmt.Errorf("must pass peer id and state root")
+ return lcli.IncorrectNumArgs(cctx)
}
pid, err := peer.Decode(cctx.Args().Get(0))
diff --git a/cmd/lotus-shed/miner.go b/cmd/lotus-shed/miner.go
index a23a44410..348626fe1 100644
--- a/cmd/lotus-shed/miner.go
+++ b/cmd/lotus-shed/miner.go
@@ -135,8 +135,8 @@ var minerCreateCmd = &cli.Command{
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() != 4 {
- return xerrors.Errorf("expected 4 args (sender owner worker sectorSize)")
+ if cctx.NArg() != 4 {
+ return lcli.IncorrectNumArgs(cctx)
}
sender, err := address.NewFromString(cctx.Args().First())
@@ -273,8 +273,8 @@ var minerUnpackInfoCmd = &cli.Command{
Usage: "unpack miner info all dump",
ArgsUsage: "[allinfo.txt] [dir]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 2 {
- return xerrors.Errorf("expected 2 args")
+ if cctx.NArg() != 2 {
+ return lcli.IncorrectNumArgs(cctx)
}
src, err := homedir.Expand(cctx.Args().Get(0))
@@ -475,7 +475,7 @@ var sendInvalidWindowPoStCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Println(cctx.App.Writer, "Invalid PoST message failed!")
return err
}
@@ -488,9 +488,10 @@ var generateAndSendConsensusFaultCmd = &cli.Command{
Name: "generate-and-send-consensus-fault",
Usage: "Provided a block CID mined by the miner, will create another block at the same height, and send both block headers to generate a consensus fault.",
Description: `Note: This is meant for testing purposes and should NOT be used on mainnet or you will be slashed`,
+ ArgsUsage: "blockCID",
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 1 {
- return xerrors.Errorf("expected 1 arg (blockCID)")
+ return lcli.IncorrectNumArgs(cctx)
}
blockCid, err := cid.Parse(cctx.Args().First())
@@ -574,7 +575,7 @@ var generateAndSendConsensusFaultCmd = &cli.Command{
}
// check it executed successfully
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
fmt.Println(cctx.App.Writer, "Report consensus fault failed!")
return err
}
diff --git a/cmd/lotus-shed/msg.go b/cmd/lotus-shed/msg.go
index bd8bd64f0..9096c6a5f 100644
--- a/cmd/lotus-shed/msg.go
+++ b/cmd/lotus-shed/msg.go
@@ -27,8 +27,8 @@ var msgCmd = &cli.Command{
Usage: "Translate message between various formats",
ArgsUsage: "Message in any form",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("expected 1 argument")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
msg, err := messageFromString(cctx, cctx.Args().First())
diff --git a/cmd/lotus-shed/msig.go b/cmd/lotus-shed/msig.go
new file mode 100644
index 000000000..ccc932c93
--- /dev/null
+++ b/cmd/lotus-shed/msig.go
@@ -0,0 +1,135 @@
+package main
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+
+ "github.com/ipfs/go-cid"
+ cbor "github.com/ipfs/go-ipld-cbor"
+ "github.com/urfave/cli/v2"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+
+ "github.com/filecoin-project/lotus/chain/actors/adt"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
+ "github.com/filecoin-project/lotus/chain/consensus/filcns"
+ "github.com/filecoin-project/lotus/chain/state"
+ "github.com/filecoin-project/lotus/chain/store"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/node/repo"
+)
+
+type msigBriefInfo struct {
+ ID address.Address
+ Signer []address.Address
+ Balance abi.TokenAmount
+ Threshold uint64
+}
+
+var msigCmd = &cli.Command{
+ Name: "msig",
+ Subcommands: []*cli.Command{
+ multisigGetAllCmd,
+ },
+}
+
+var multisigGetAllCmd = &cli.Command{
+ Name: "all",
+ Usage: "get all multisig actor on chain with id, signers, threshold and balance at a tipset",
+ ArgsUsage: "[state root]",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo",
+ Value: "~/.lotus",
+ },
+ },
+ Action: func(cctx *cli.Context) error {
+ ctx := context.TODO()
+ if !cctx.Args().Present() {
+ return fmt.Errorf("must pass state root")
+ }
+
+ sroot, err := cid.Decode(cctx.Args().First())
+ if err != nil {
+ return fmt.Errorf("failed to parse input: %w", err)
+ }
+
+ fsrepo, err := repo.NewFS(cctx.String("repo"))
+ if err != nil {
+ return err
+ }
+
+ lkrepo, err := fsrepo.Lock(repo.FullNode)
+ if err != nil {
+ return err
+ }
+
+ defer lkrepo.Close() //nolint:errcheck
+
+ bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore)
+ if err != nil {
+ return fmt.Errorf("failed to open blockstore: %w", err)
+ }
+
+ defer func() {
+ if c, ok := bs.(io.Closer); ok {
+ if err := c.Close(); err != nil {
+ log.Warnf("failed to close blockstore: %s", err)
+ }
+ }
+ }()
+
+ mds, err := lkrepo.Datastore(context.Background(), "/metadata")
+ if err != nil {
+ return err
+ }
+
+ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil)
+ defer cs.Close() //nolint:errcheck
+
+ cst := cbor.NewCborStore(bs)
+ store := adt.WrapStore(ctx, cst)
+
+ tree, err := state.LoadStateTree(cst, sroot)
+ if err != nil {
+ return err
+ }
+
+ var msigActorsInfo []msigBriefInfo
+ err = tree.ForEach(func(addr address.Address, act *types.Actor) error {
+ if builtin.IsMultisigActor(act.Code) {
+ ms, err := multisig.Load(store, act)
+ if err != nil {
+ return fmt.Errorf("load msig failed %v", err)
+
+ }
+
+ signers, _ := ms.Signers()
+ threshold, _ := ms.Threshold()
+ info := msigBriefInfo{
+ ID: addr,
+ Signer: signers,
+ Balance: act.Balance,
+ Threshold: threshold,
+ }
+ msigActorsInfo = append(msigActorsInfo, info)
+
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ out, err := json.MarshalIndent(msigActorsInfo, "", " ")
+ if err != nil {
+ return err
+ }
+ fmt.Println(string(out))
+ return nil
+ },
+}
diff --git a/cmd/lotus-shed/proofs.go b/cmd/lotus-shed/proofs.go
index 65cf04918..1a16e2fdc 100644
--- a/cmd/lotus-shed/proofs.go
+++ b/cmd/lotus-shed/proofs.go
@@ -11,6 +11,8 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
prooftypes "github.com/filecoin-project/go-state-types/proof"
+
+ lcli "github.com/filecoin-project/lotus/cli"
)
var proofsCmd = &cli.Command{
@@ -42,8 +44,8 @@ var verifySealProofCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 3 {
- return fmt.Errorf("must specify commR, commD, and proof to verify")
+ if cctx.NArg() != 3 {
+ return lcli.IncorrectNumArgs(cctx)
}
commr, err := cid.Decode(cctx.Args().Get(0))
diff --git a/cmd/lotus-shed/rpc.go b/cmd/lotus-shed/rpc.go
index b253304a1..3be269358 100644
--- a/cmd/lotus-shed/rpc.go
+++ b/cmd/lotus-shed/rpc.go
@@ -112,8 +112,8 @@ var rpcCmd = &cli.Command{
}
if cctx.Args().Present() {
- if cctx.Args().Len() > 2 {
- return xerrors.Errorf("expected 1 or 2 arguments: method [params]")
+ if cctx.NArg() > 2 {
+ return lcli.ShowHelp(cctx, xerrors.Errorf("expected 1 or 2 arguments: method [params]"))
}
params := cctx.Args().Get(1)
diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go
index deb5cff8b..52d07f5b6 100644
--- a/cmd/lotus-shed/sectors.go
+++ b/cmd/lotus-shed/sectors.go
@@ -58,10 +58,14 @@ var terminateSectorCmd = &cli.Command{
Name: "really-do-it",
Usage: "pass this flag if you know what you are doing",
},
+ &cli.StringFlag{
+ Name: "from",
+ Usage: "specify the address to send the terminate message from",
+ },
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 1 {
- return fmt.Errorf("at least one sector must be specified")
+ if cctx.NArg() < 1 {
+ return lcli.ShowHelp(cctx, fmt.Errorf("at least one sector must be specified"))
}
var maddr address.Address
@@ -86,13 +90,13 @@ var terminateSectorCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
if maddr.Empty() {
- api, acloser, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, acloser, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer acloser()
- maddr, err = api.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
@@ -137,8 +141,19 @@ var terminateSectorCmd = &cli.Command{
return xerrors.Errorf("serializing params: %w", err)
}
+ var fromAddr address.Address
+ if from := cctx.String("from"); from != "" {
+ var err error
+ fromAddr, err = address.NewFromString(from)
+ if err != nil {
+ return fmt.Errorf("parsing address %s: %w", from, err)
+ }
+ } else {
+ fromAddr = mi.Worker
+ }
+
smsg, err := nodeApi.MpoolPushMessage(ctx, &types.Message{
- From: mi.Owner,
+ From: fromAddr,
To: maddr,
Method: builtin.MethodsMiner.TerminateSectors,
@@ -156,7 +171,7 @@ var terminateSectorCmd = &cli.Command{
return err
}
- if wait.Receipt.ExitCode != 0 {
+ if wait.Receipt.ExitCode.IsError() {
return fmt.Errorf("terminate sectors message returned exit %d", wait.Receipt.ExitCode)
}
@@ -185,8 +200,8 @@ var terminateSectorPenaltyEstimationCmd = &cli.Command{
},
},
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 1 {
- return fmt.Errorf("at least one sector must be specified")
+ if cctx.NArg() < 1 {
+ return lcli.ShowHelp(cctx, fmt.Errorf("at least one sector must be specified"))
}
var maddr address.Address
@@ -207,13 +222,13 @@ var terminateSectorPenaltyEstimationCmd = &cli.Command{
ctx := lcli.ReqContext(cctx)
if maddr.Empty() {
- api, acloser, err := lcli.GetStorageMinerAPI(cctx)
+ minerApi, acloser, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer acloser()
- maddr, err = api.ActorAddress(ctx)
+ maddr, err = minerApi.ActorAddress(ctx)
if err != nil {
return err
}
diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go
index ce1c8b68a..17b62150f 100644
--- a/cmd/lotus-shed/send-csv.go
+++ b/cmd/lotus-shed/send-csv.go
@@ -34,7 +34,7 @@ var sendCsvCmd = &cli.Command{
ArgsUsage: "[csvfile]",
Action: func(cctx *cli.Context) error {
if cctx.NArg() != 1 {
- return xerrors.New("must supply path to csv file")
+ return lcli.IncorrectNumArgs(cctx)
}
api, closer, err := lcli.GetFullNodeAPIV1(cctx)
diff --git a/cmd/lotus-shed/signatures.go b/cmd/lotus-shed/signatures.go
index 0f43503f6..536f8e82d 100644
--- a/cmd/lotus-shed/signatures.go
+++ b/cmd/lotus-shed/signatures.go
@@ -31,8 +31,8 @@ var sigsVerifyBlsMsgsCmd = &cli.Command{
Description: "given a block, verifies the bls signature of the messages in the block",
Usage: "",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 1 {
- return xerrors.Errorf("usage: ")
+ if cctx.NArg() != 1 {
+ return lcli.IncorrectNumArgs(cctx)
}
api, closer, err := lcli.GetFullNodeAPI(cctx)
@@ -101,8 +101,8 @@ var sigsVerifyVoteCmd = &cli.Command{
Usage: " ",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 3 {
- return xerrors.Errorf("usage: verify-vote ")
+ if cctx.NArg() != 3 {
+ return lcli.IncorrectNumArgs(cctx)
}
fip, err := strconv.ParseInt(cctx.Args().First(), 10, 64)
diff --git a/cmd/lotus-shed/stateroot-stats.go b/cmd/lotus-shed/stateroot-stats.go
index 7937b3ccd..f429c4e64 100644
--- a/cmd/lotus-shed/stateroot-stats.go
+++ b/cmd/lotus-shed/stateroot-stats.go
@@ -174,8 +174,8 @@ var staterootStatCmd = &cli.Command{
}
outcap := 10
- if cctx.Args().Len() > outcap {
- outcap = cctx.Args().Len()
+ if cctx.NArg() > outcap {
+ outcap = cctx.NArg()
}
if len(infos) < outcap {
outcap = len(infos)
diff --git a/cmd/lotus-shed/sync.go b/cmd/lotus-shed/sync.go
index 397e76da3..eb11dea27 100644
--- a/cmd/lotus-shed/sync.go
+++ b/cmd/lotus-shed/sync.go
@@ -38,10 +38,8 @@ var syncValidateCmd = &cli.Command{
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() < 1 {
- fmt.Println("usage: ...")
- fmt.Println("At least one block cid must be provided")
- return nil
+ if cctx.NArg() < 1 {
+ return lcli.ShowHelp(cctx, fmt.Errorf("at least one block cid must be provided"))
}
args := cctx.Args().Slice()
@@ -75,7 +73,7 @@ var syncScrapePowerCmd = &cli.Command{
Usage: "given a height and a tipset, reports what percentage of mining power had a winning ticket between the tipset and height",
ArgsUsage: "[height tipsetkey]",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() < 1 {
+ if cctx.NArg() < 1 {
fmt.Println("usage: [blockCid1 blockCid2...]")
fmt.Println("Any CIDs passed after the height will be used as the tipset key")
fmt.Println("If no block CIDs are provided, chain head will be used")
@@ -90,10 +88,8 @@ var syncScrapePowerCmd = &cli.Command{
defer closer()
ctx := lcli.ReqContext(cctx)
- if cctx.Args().Len() < 1 {
- fmt.Println("usage: ...")
- fmt.Println("At least one block cid must be provided")
- return nil
+ if cctx.NArg() < 1 {
+ return lcli.ShowHelp(cctx, fmt.Errorf("at least one block cid must be provided"))
}
h, err := strconv.ParseInt(cctx.Args().Get(0), 10, 0)
diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go
index 87855cec7..c5f35995a 100644
--- a/cmd/lotus-shed/terminations.go
+++ b/cmd/lotus-shed/terminations.go
@@ -23,6 +23,7 @@ import (
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/store"
"github.com/filecoin-project/lotus/chain/types"
+ lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/node/repo"
)
@@ -40,7 +41,7 @@ var terminationsCmd = &cli.Command{
ctx := context.TODO()
if cctx.NArg() != 2 {
- return fmt.Errorf("must pass block cid && lookback period")
+ return lcli.IncorrectNumArgs(cctx)
}
blkCid, err := cid.Decode(cctx.Args().First())
diff --git a/cmd/lotus-shed/verifreg.go b/cmd/lotus-shed/verifreg.go
index 2731ea11b..872b4228d 100644
--- a/cmd/lotus-shed/verifreg.go
+++ b/cmd/lotus-shed/verifreg.go
@@ -34,7 +34,6 @@ var verifRegCmd = &cli.Command{
verifRegAddVerifierFromAccountCmd,
verifRegVerifyClientCmd,
verifRegListVerifiersCmd,
- verifRegListClientsCmd,
verifRegCheckClientCmd,
verifRegCheckVerifierCmd,
verifRegRemoveVerifiedClientDataCapCmd,
@@ -46,8 +45,8 @@ var verifRegAddVerifierFromMsigCmd = &cli.Command{
Usage: "make a given account a verifier",
ArgsUsage: " ",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 3 {
- return fmt.Errorf("must specify three arguments: sender, verifier, and allowance")
+ if cctx.NArg() != 3 {
+ return lcli.IncorrectNumArgs(cctx)
}
sender, err := address.NewFromString(cctx.Args().Get(0))
@@ -104,7 +103,7 @@ var verifRegAddVerifierFromMsigCmd = &cli.Command{
return err
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("failed to add verifier: %d", mwait.Receipt.ExitCode)
}
@@ -119,8 +118,8 @@ var verifRegAddVerifierFromAccountCmd = &cli.Command{
Usage: "make a given account a verifier",
ArgsUsage: " ",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 3 {
- return fmt.Errorf("must specify three arguments: sender, verifier, and allowance")
+ if cctx.NArg() != 3 {
+ return lcli.IncorrectNumArgs(cctx)
}
sender, err := address.NewFromString(cctx.Args().Get(0))
@@ -170,7 +169,7 @@ var verifRegAddVerifierFromAccountCmd = &cli.Command{
return err
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("failed to add verified client: %d", mwait.Receipt.ExitCode)
}
@@ -201,8 +200,8 @@ var verifRegVerifyClientCmd = &cli.Command{
return err
}
- if cctx.Args().Len() != 2 {
- return fmt.Errorf("must specify two arguments: address and allowance")
+ if cctx.NArg() != 2 {
+ return lcli.IncorrectNumArgs(cctx)
}
target, err := address.NewFromString(cctx.Args().Get(0))
@@ -246,7 +245,7 @@ var verifRegVerifyClientCmd = &cli.Command{
return err
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("failed to add verified client: %d", mwait.Receipt.ExitCode)
}
@@ -286,38 +285,6 @@ var verifRegListVerifiersCmd = &cli.Command{
},
}
-var verifRegListClientsCmd = &cli.Command{
- Name: "list-clients",
- Usage: "list all verified clients",
- Hidden: true,
- Action: func(cctx *cli.Context) error {
- fmt.Println("DEPRECATED: This behavior is being moved to `lotus filplus`")
- api, closer, err := lcli.GetFullNodeAPI(cctx)
- if err != nil {
- return err
- }
- defer closer()
- ctx := lcli.ReqContext(cctx)
-
- act, err := api.StateGetActor(ctx, verifreg.Address, types.EmptyTSK)
- if err != nil {
- return err
- }
-
- apibs := blockstore.NewAPIBlockstore(api)
- store := adt.WrapStore(ctx, cbor.NewCborStore(apibs))
-
- st, err := verifreg.Load(store, act)
- if err != nil {
- return err
- }
- return st.ForEachClient(func(addr address.Address, dcap abi.StoragePower) error {
- _, err := fmt.Printf("%s: %s\n", addr, dcap)
- return err
- })
- },
-}
-
var verifRegCheckClientCmd = &cli.Command{
Name: "check-client",
Usage: "check verified client remaining bytes",
@@ -418,8 +385,8 @@ var verifRegRemoveVerifiedClientDataCapCmd = &cli.Command{
Usage: "Remove data cap from verified client",
ArgsUsage: " ",
Action: func(cctx *cli.Context) error {
- if cctx.Args().Len() != 7 {
- return fmt.Errorf("must specify seven arguments: sender, client, allowance to remove, verifier 1 address, verifier 1 signature, verifier 2 address, verifier 2 signature")
+ if cctx.NArg() != 7 {
+ return lcli.IncorrectNumArgs(cctx)
}
srv, err := lcli.GetFullNodeServices(cctx)
@@ -555,7 +522,7 @@ var verifRegRemoveVerifiedClientDataCapCmd = &cli.Command{
return err
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
return fmt.Errorf("failed to removed verified data cap: %d", mwait.Receipt.ExitCode)
}
diff --git a/cmd/lotus-sim/create.go b/cmd/lotus-sim/create.go
index 23ea454a3..bc7f9ade9 100644
--- a/cmd/lotus-sim/create.go
+++ b/cmd/lotus-sim/create.go
@@ -31,12 +31,7 @@ var createSimCommand = &cli.Command{
}
ts = node.Chainstore.GetHeaviestTipSet()
case 1:
- cids, err := lcli.ParseTipSetString(cctx.Args().Get(1))
- if err != nil {
- return err
- }
- tsk := types.NewTipSetKey(cids...)
- ts, err = node.Chainstore.LoadTipSet(cctx.Context, tsk)
+ ts, err = lcli.ParseTipSetRefOffline(cctx.Context, node.Chainstore, cctx.Args().Get(1))
if err != nil {
return err
}
diff --git a/cmd/lotus-sim/info.go b/cmd/lotus-sim/info.go
index 864adb3bc..b92fa4b2f 100644
--- a/cmd/lotus-sim/info.go
+++ b/cmd/lotus-sim/info.go
@@ -66,7 +66,7 @@ func printInfo(ctx context.Context, sim *simulation.Simulation, out io.Writer) e
startTime := time.Unix(int64(start.MinTimestamp()), 0)
duration := headTime.Sub(startTime)
- fmt.Fprintf(tw, "Name:\t%s\n", sim.Name())
+ fmt.Fprintf(tw, "Num:\t%s\n", sim.Name())
fmt.Fprintf(tw, "Head:\t%s\n", head)
fmt.Fprintf(tw, "Start Epoch:\t%d\n", firstEpoch)
fmt.Fprintf(tw, "End Epoch:\t%d\n", headEpoch)
diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go
index 5e84688ec..f984c993d 100644
--- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go
+++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go
@@ -9,10 +9,10 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors/builtin/account"
@@ -31,12 +31,13 @@ const (
// has.
// 5 per tipset, but we effectively get 4 blocks worth of messages.
expectedBlocks = 4
- // TODO: This will produce invalid blocks but it will accurately model the amount of gas
- // we're willing to use per-tipset.
- // A more correct approach would be to produce 5 blocks. We can do that later.
- targetGas = build.BlockGasTarget * expectedBlocks
)
+// TODO: This will produce invalid blocks but it will accurately model the amount of gas
+// we're willing to use per-tipset.
+// A more correct approach would be to produce 5 blocks. We can do that later.
+var targetGas = build.BlockGasTarget * expectedBlocks
+
type BlockBuilder struct {
ctx context.Context
logger *zap.SugaredLogger
@@ -273,8 +274,8 @@ func (bb *BlockBuilder) StateManager() *stmgr.StateManager {
}
// ActorsVersion returns the actors version for the target block.
-func (bb *BlockBuilder) ActorsVersion() (actors.Version, error) {
- return actors.VersionForNetwork(bb.NetworkVersion())
+func (bb *BlockBuilder) ActorsVersion() (actorstypes.Version, error) {
+ return actorstypes.VersionForNetwork(bb.NetworkVersion())
}
func (bb *BlockBuilder) L() *zap.SugaredLogger {
diff --git a/cmd/lotus-sim/simulation/node.go b/cmd/lotus-sim/simulation/node.go
index b0317c66b..f115ffe19 100644
--- a/cmd/lotus-sim/simulation/node.go
+++ b/cmd/lotus-sim/simulation/node.go
@@ -115,7 +115,7 @@ func (nd *Node) LoadSim(ctx context.Context, name string) (*Simulation, error) {
// Create creates a new simulation.
//
// - This will fail if a simulation already exists with the given name.
-// - Name must not contain a '/'.
+// - Num must not contain a '/'.
func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) (*Simulation, error) {
if strings.Contains(name, "/") {
return nil, xerrors.Errorf("simulation name %q cannot contain a '/'", name)
diff --git a/cmd/lotus-sim/simulation/stages/commit_queue.go b/cmd/lotus-sim/simulation/stages/commit_queue.go
index ec12c2776..60cbfa4ba 100644
--- a/cmd/lotus-sim/simulation/stages/commit_queue.go
+++ b/cmd/lotus-sim/simulation/stages/commit_queue.go
@@ -5,7 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/lotus/chain/actors/policy"
)
diff --git a/cmd/lotus-sim/simulation/stages/commit_queue_test.go b/cmd/lotus-sim/simulation/stages/commit_queue_test.go
index df0de9757..0b9a2ebdb 100644
--- a/cmd/lotus-sim/simulation/stages/commit_queue_test.go
+++ b/cmd/lotus-sim/simulation/stages/commit_queue_test.go
@@ -8,7 +8,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/lotus/chain/actors/policy"
)
diff --git a/cmd/lotus-sim/simulation/stages/interface.go b/cmd/lotus-sim/simulation/stages/interface.go
index d58321d87..fffdbec6b 100644
--- a/cmd/lotus-sim/simulation/stages/interface.go
+++ b/cmd/lotus-sim/simulation/stages/interface.go
@@ -5,7 +5,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/cmd/lotus-sim/simulation/blockbuilder"
diff --git a/cmd/lotus-sim/simulation/stages/precommit_stage.go b/cmd/lotus-sim/simulation/stages/precommit_stage.go
index fc61ff08b..8f82d8988 100644
--- a/cmd/lotus-sim/simulation/stages/precommit_stage.go
+++ b/cmd/lotus-sim/simulation/stages/precommit_stage.go
@@ -11,7 +11,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/network"
miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner"
@@ -177,9 +177,9 @@ func (stage *PreCommitStage) packMiner(
}
expiration := epoch + policy.GetMaxSectorExpirationExtension()
- infos := make([]minertypes.SectorPreCommitInfo, len(sectorNos))
+ infos := make([]minertypes.PreCommitSectorParams, len(sectorNos))
for i, sno := range sectorNos {
- infos[i] = minertypes.SectorPreCommitInfo{
+ infos[i] = minertypes.PreCommitSectorParams{
SealProof: sealType,
SectorNumber: sno,
SealedCID: mock.MockCommR(minerAddr, sno),
@@ -228,7 +228,7 @@ func (stage *PreCommitStage) packMiner(
}
for _, info := range batch {
- if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, info); err != nil {
+ if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, toSectorPreCommitInfo(info)); err != nil {
return added, false, err
}
added++
@@ -253,7 +253,7 @@ func (stage *PreCommitStage) packMiner(
return added, false, err
}
- if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, info); err != nil {
+ if err := stage.committer.EnqueueProveCommit(minerAddr, epoch, toSectorPreCommitInfo(info)); err != nil {
return added, false, err
}
added++
@@ -346,3 +346,15 @@ func (stage *PreCommitStage) load(ctx context.Context, bb *blockbuilder.BlockBui
stage.initialized = true
return nil
}
+
+func toSectorPreCommitInfo(param minertypes.PreCommitSectorParams) minertypes.SectorPreCommitInfo {
+ return minertypes.SectorPreCommitInfo{
+ SealProof: param.SealProof,
+ SectorNumber: param.SectorNumber,
+ SealedCID: param.SealedCID,
+ SealRandEpoch: param.SealRandEpoch,
+ DealIDs: param.DealIDs,
+ Expiration: param.Expiration,
+ UnsealedCid: nil,
+ }
+}
diff --git a/cmd/lotus-sim/simulation/stages/provecommit_stage.go b/cmd/lotus-sim/simulation/stages/provecommit_stage.go
index efa14e4e8..d15ea60f0 100644
--- a/cmd/lotus-sim/simulation/stages/provecommit_stage.go
+++ b/cmd/lotus-sim/simulation/stages/provecommit_stage.go
@@ -8,7 +8,7 @@ import (
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner"
diff --git a/cmd/lotus-stats/main.go b/cmd/lotus-stats/main.go
index 20b2ee45c..20971c1f3 100644
--- a/cmd/lotus-stats/main.go
+++ b/cmd/lotus-stats/main.go
@@ -12,6 +12,7 @@ import (
"github.com/urfave/cli/v2"
"go.opencensus.io/stats"
"go.opencensus.io/stats/view"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-state-types/abi"
@@ -128,6 +129,10 @@ var runCmd = &cli.Command{
EnvVars: []string{"LOTUS_STATS_IPLD_STORE_CACHE_SIZE"},
Value: 2 << 15,
},
+ &cli.StringFlag{
+ Name: "http-server-timeout",
+ Value: "30s",
+ },
},
Action: func(cctx *cli.Context) error {
ctx := context.Background()
@@ -158,9 +163,18 @@ var runCmd = &cli.Command{
return err
}
+ timeout, err := time.ParseDuration(cctx.String("http-server-timeout"))
+ if err != nil {
+ return xerrors.Errorf("invalid time string %s: %x", cctx.String("http-server-timeout"), err)
+ }
+
go func() {
http.Handle("/metrics", exporter)
- if err := http.ListenAndServe(":6688", nil); err != nil {
+ server := &http.Server{
+ Addr: ":6688",
+ ReadHeaderTimeout: timeout,
+ }
+ if err := server.ListenAndServe(); err != nil {
log.Errorw("failed to start http server", "err", err)
}
}()
diff --git a/cmd/lotus-wallet/main.go b/cmd/lotus-wallet/main.go
index f15b9e84d..8360dae15 100644
--- a/cmd/lotus-wallet/main.go
+++ b/cmd/lotus-wallet/main.go
@@ -6,6 +6,7 @@ import (
"net"
"net/http"
"os"
+ "time"
"github.com/gbrlsnchs/jwt/v3"
"github.com/gorilla/mux"
@@ -142,6 +143,10 @@ var runCmd = &cli.Command{
Usage: "(insecure) disable api auth",
Hidden: true,
},
+ &cli.StringFlag{
+ Name: "http-server-timeout",
+ Value: "30s",
+ },
},
Description: "Needs FULLNODE_API_INFO env-var to be set before running (see lotus-wallet --help for setup instructions)",
Action: func(cctx *cli.Context) error {
@@ -209,7 +214,7 @@ var runCmd = &cli.Command{
rpcApi = api.PermissionedWalletAPI(rpcApi)
}
- rpcServer := jsonrpc.NewServer()
+ rpcServer := jsonrpc.NewServer(jsonrpc.WithServerErrors(api.RPCErrors))
rpcServer.Register("Filecoin", rpcApi)
mux.Handle("/rpc/v0", rpcServer)
@@ -239,8 +244,14 @@ var runCmd = &cli.Command{
}
}
+ timeout, err := time.ParseDuration(cctx.String("http-server-timeout"))
+ if err != nil {
+ return xerrors.Errorf("invalid time string %s: %x", cctx.String("http-server-timeout"), err)
+ }
+
srv := &http.Server{
- Handler: handler,
+ Handler: handler,
+ ReadHeaderTimeout: timeout,
BaseContext: func(listener net.Listener) context.Context {
ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, "lotus-wallet"))
return ctx
diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go
index 286cce883..074a6a3e5 100644
--- a/cmd/lotus-worker/main.go
+++ b/cmd/lotus-worker/main.go
@@ -224,6 +224,12 @@ var runCmd = &cli.Command{
Value: true,
EnvVars: []string{"LOTUS_WORKER_REGEN_SECTOR_KEY"},
},
+ &cli.BoolFlag{
+ Name: "sector-download",
+ Usage: "enable external sector data download",
+ Value: false,
+ EnvVars: []string{"LOTUS_WORKER_SECTOR_DOWNLOAD"},
+ },
&cli.BoolFlag{
Name: "windowpost",
Usage: "enable window post",
@@ -266,6 +272,10 @@ var runCmd = &cli.Command{
Value: "30m",
EnvVars: []string{"LOTUS_WORKER_TIMEOUT"},
},
+ &cli.StringFlag{
+ Name: "http-server-timeout",
+ Value: "30s",
+ },
},
Before: func(cctx *cli.Context) error {
if cctx.IsSet("address") {
@@ -363,7 +373,7 @@ var runCmd = &cli.Command{
}
if workerType == "" {
- taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFinalizeReplicaUpdate)
+ taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed, sealtasks.TTFinalizeReplicaUpdate)
if !cctx.Bool("no-default") {
workerType = sealtasks.WorkerSealing
@@ -373,6 +383,9 @@ var runCmd = &cli.Command{
if (workerType == sealtasks.WorkerSealing || cctx.IsSet("addpiece")) && cctx.Bool("addpiece") {
taskTypes = append(taskTypes, sealtasks.TTAddPiece, sealtasks.TTDataCid)
}
+ if (workerType == sealtasks.WorkerSealing || cctx.IsSet("sector-download")) && cctx.Bool("sector-download") {
+ taskTypes = append(taskTypes, sealtasks.TTDownloadSector)
+ }
if (workerType == sealtasks.WorkerSealing || cctx.IsSet("precommit1")) && cctx.Bool("precommit1") {
taskTypes = append(taskTypes, sealtasks.TTPreCommit1)
}
@@ -438,10 +451,10 @@ var runCmd = &cli.Command{
return err
}
- var localPaths []paths.LocalPath
+ var localPaths []storiface.LocalPath
if !cctx.Bool("no-local-storage") {
- b, err := json.MarshalIndent(&paths.LocalStorageMeta{
+ b, err := json.MarshalIndent(&storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 10,
CanSeal: true,
@@ -455,12 +468,12 @@ var runCmd = &cli.Command{
return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(lr.Path(), "sectorstore.json"), err)
}
- localPaths = append(localPaths, paths.LocalPath{
+ localPaths = append(localPaths, storiface.LocalPath{
Path: lr.Path(),
})
}
- if err := lr.SetStorage(func(sc *paths.StorageConfig) {
+ if err := lr.SetStorage(func(sc *storiface.StorageConfig) {
sc.StoragePaths = append(sc.StoragePaths, localPaths...)
}); err != nil {
return xerrors.Errorf("set storage config: %w", err)
@@ -553,8 +566,14 @@ var runCmd = &cli.Command{
log.Info("Setting up control endpoint at " + address)
+ timeout, err := time.ParseDuration(cctx.String("http-server-timeout"))
+ if err != nil {
+ return xerrors.Errorf("invalid time string %s: %x", cctx.String("http-server-timeout"), err)
+ }
+
srv := &http.Server{
- Handler: sealworker.WorkerHandler(nodeApi.AuthVerify, remoteHandler, workerApi, true),
+ Handler: sealworker.WorkerHandler(nodeApi.AuthVerify, remoteHandler, workerApi, true),
+ ReadHeaderTimeout: timeout,
BaseContext: func(listener net.Listener) context.Context {
ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, "lotus-worker"))
return ctx
diff --git a/cmd/lotus-worker/sealworker/rpc.go b/cmd/lotus-worker/sealworker/rpc.go
index 1b98ccb83..97f78942e 100644
--- a/cmd/lotus-worker/sealworker/rpc.go
+++ b/cmd/lotus-worker/sealworker/rpc.go
@@ -29,7 +29,7 @@ var log = logging.Logger("sealworker")
func WorkerHandler(authv func(ctx context.Context, token string) ([]auth.Permission, error), remote http.HandlerFunc, a api.Worker, permissioned bool) http.Handler {
mux := mux.NewRouter()
readerHandler, readerServerOpt := rpcenc.ReaderParamDecoder()
- rpcServer := jsonrpc.NewServer(readerServerOpt)
+ rpcServer := jsonrpc.NewServer(jsonrpc.WithServerErrors(api.RPCErrors), readerServerOpt)
wapi := proxy.MetricedWorkerAPI(a)
if permissioned {
@@ -92,8 +92,8 @@ func (w *Worker) StorageAddLocal(ctx context.Context, path string) error {
return xerrors.Errorf("opening local path: %w", err)
}
- if err := w.Storage.SetStorage(func(sc *paths.StorageConfig) {
- sc.StoragePaths = append(sc.StoragePaths, paths.LocalPath{Path: path})
+ if err := w.Storage.SetStorage(func(sc *storiface.StorageConfig) {
+ sc.StoragePaths = append(sc.StoragePaths, storiface.LocalPath{Path: path})
}); err != nil {
return xerrors.Errorf("get storage config: %w", err)
}
@@ -127,8 +127,8 @@ func (w *Worker) StorageDetachLocal(ctx context.Context, path string) error {
// drop from the persisted storage.json
var found bool
- if err := w.Storage.SetStorage(func(sc *paths.StorageConfig) {
- out := make([]paths.LocalPath, 0, len(sc.StoragePaths))
+ if err := w.Storage.SetStorage(func(sc *storiface.StorageConfig) {
+ out := make([]storiface.LocalPath, 0, len(sc.StoragePaths))
for _, storagePath := range sc.StoragePaths {
if storagePath.Path != path {
out = append(out, storagePath)
diff --git a/cmd/lotus-worker/storage.go b/cmd/lotus-worker/storage.go
index 0736ffbfb..6b5994c17 100644
--- a/cmd/lotus-worker/storage.go
+++ b/cmd/lotus-worker/storage.go
@@ -13,7 +13,6 @@ import (
"golang.org/x/xerrors"
lcli "github.com/filecoin-project/lotus/cli"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -103,7 +102,7 @@ var storageAttachCmd = &cli.Command{
}
}
- cfg := &paths.LocalStorageMeta{
+ cfg := &storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: cctx.Uint64("weight"),
CanSeal: cctx.Bool("seal"),
diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go
index 33c579e3a..59f9d7258 100644
--- a/cmd/lotus/daemon.go
+++ b/cmd/lotus/daemon.go
@@ -16,6 +16,7 @@ import (
"runtime/pprof"
"strings"
+ "github.com/DataDog/zstd"
metricsprom "github.com/ipfs/go-metrics-prometheus"
"github.com/mitchellh/go-homedir"
"github.com/multiformats/go-multiaddr"
@@ -30,7 +31,7 @@ import (
"github.com/filecoin-project/go-jsonrpc"
"github.com/filecoin-project/go-paramfetch"
- "github.com/filecoin-project/lotus/api"
+ lapi "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/consensus/filcns"
"github.com/filecoin-project/lotus/chain/stmgr"
@@ -303,7 +304,7 @@ var DaemonCmd = &cli.Command{
}
defer closer()
- liteModeDeps = node.Override(new(api.Gateway), gapi)
+ liteModeDeps = node.Override(new(lapi.Gateway), gapi)
}
// some libraries like ipfs/go-ds-measure and ipfs/go-ipfs-blockstore
@@ -313,7 +314,7 @@ var DaemonCmd = &cli.Command{
log.Warnf("unable to inject prometheus ipfs/go-metrics exporter; some metrics will be unavailable; err: %s", err)
}
- var api api.FullNode
+ var api lapi.FullNode
stop, err := node.New(ctx,
node.FullAPI(&api, node.Lite(isLite)),
@@ -360,7 +361,7 @@ var DaemonCmd = &cli.Command{
// ----
// Populate JSON-RPC options.
- serverOptions := make([]jsonrpc.ServerOption, 0)
+ serverOptions := []jsonrpc.ServerOption{jsonrpc.WithServerErrors(lapi.RPCErrors)}
if maxRequestSize := cctx.Int("api-max-req-size"); maxRequestSize != 0 {
serverOptions = append(serverOptions, jsonrpc.WithMaxRequestSize(int64(maxRequestSize)))
}
@@ -392,7 +393,7 @@ var DaemonCmd = &cli.Command{
},
}
-func importKey(ctx context.Context, api api.FullNode, f string) error {
+func importKey(ctx context.Context, api lapi.FullNode, f string) error {
f, err := homedir.Expand(f)
if err != nil {
return err
@@ -491,6 +492,11 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool)
bufr := bufio.NewReaderSize(rd, 1<<20)
+ header, err := bufr.Peek(4)
+ if err != nil {
+ return xerrors.Errorf("peek header: %w", err)
+ }
+
bar := pb.New64(l)
br := bar.NewProxyReader(bufr)
bar.ShowTimeLeft = true
@@ -498,8 +504,20 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool)
bar.ShowSpeed = true
bar.Units = pb.U_BYTES
+ var ir io.Reader = br
+
+ if string(header[1:]) == "\xB5\x2F\xFD" { // zstd
+ zr := zstd.NewReader(br)
+ defer func() {
+ if err := zr.Close(); err != nil {
+ log.Errorw("closing zstd reader", "error", err)
+ }
+ }()
+ ir = zr
+ }
+
bar.Start()
- ts, err := cst.Import(ctx, br)
+ ts, err := cst.Import(ctx, ir)
bar.Finish()
if err != nil {
diff --git a/cmd/tvx/extract_message.go b/cmd/tvx/extract_message.go
index db6b5322c..8ff8a2b79 100644
--- a/cmd/tvx/extract_message.go
+++ b/cmd/tvx/extract_message.go
@@ -417,10 +417,10 @@ func findMsgAndPrecursors(ctx context.Context, mode string, msgCid cid.Cid, send
case mode == PrecursorSelectAll:
fallthrough
case mode == PrecursorSelectParticipants &&
- msgSenderID == senderID ||
- msgRecipientID == recipientID ||
- msgSenderID == recipientID ||
- msgRecipientID == senderID:
+ (msgSenderID == senderID ||
+ msgRecipientID == recipientID ||
+ msgSenderID == recipientID ||
+ msgRecipientID == senderID):
related = append(related, m.Message)
}
diff --git a/cmd/tvx/stores.go b/cmd/tvx/stores.go
index 0f4f81397..9035c482a 100644
--- a/cmd/tvx/stores.go
+++ b/cmd/tvx/stores.go
@@ -16,6 +16,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
format "github.com/ipfs/go-ipld-format"
"github.com/ipfs/go-merkledag"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/lotus/api/v0api"
"github.com/filecoin-project/lotus/blockstore"
@@ -158,3 +159,12 @@ func (pb *proxyingBlockstore) PutMany(ctx context.Context, blocks []blocks.Block
pb.lk.Unlock()
return pb.Blockstore.PutMany(ctx, blocks)
}
+
+func (pb *proxyingBlockstore) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error {
+ blk, err := pb.Get(ctx, c)
+ if err != nil {
+ return xerrors.Errorf("failed to Get cid %s: %w", c, err)
+ }
+
+ return callback(blk.RawData())
+}
diff --git a/conformance/driver.go b/conformance/driver.go
index 0bb51800e..fc03a48d8 100644
--- a/conformance/driver.go
+++ b/conformance/driver.go
@@ -11,13 +11,15 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/network"
+ rtt "github.com/filecoin-project/go-state-types/rt"
"github.com/filecoin-project/test-vectors/schema"
"github.com/filecoin-project/lotus/blockstore"
- "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/consensus/filcns"
"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/stmgr"
@@ -158,7 +160,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params
return big.Zero(), nil
}
- return vm.NewLegacyVM(ctx, vmopt)
+ return vm.NewVM(ctx, vmopt)
})
postcid, receiptsroot, err := tse.ApplyBlocks(context.Background(),
@@ -201,6 +203,9 @@ type ExecuteMessageParams struct {
// Lookback is the LookbackStateGetter; returns the state tree at a given epoch.
Lookback vm.LookbackStateGetter
+
+ // TipSetGetter returns the tipset key at any given epoch.
+ TipSetGetter vm.TipSetGetter
}
// ExecuteMessage executes a conformance test vector message in a temporary VM.
@@ -215,15 +220,26 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP
params.Rand = NewFixedRand()
}
- // TODO: This lookback state returns the supplied precondition state tree, unconditionally.
- // This is obviously not correct, but the lookback state tree is only used to validate the
- // worker key when verifying a consensus fault. If the worker key hasn't changed in the
- // current finality window, this workaround is enough.
- // The correct solutions are documented in https://github.com/filecoin-project/ref-fvm/issues/381,
- // but they're much harder to implement, and the tradeoffs aren't clear.
- var lookback vm.LookbackStateGetter = func(ctx context.Context, epoch abi.ChainEpoch) (*state.StateTree, error) {
- cst := cbor.NewCborStore(bs)
- return state.LoadStateTree(cst, params.Preroot)
+ if params.TipSetGetter == nil {
+ // TODO: If/when we start writing conformance tests against the EVM, we'll need to
+ // actually implement this and (unfortunately) capture any tipsets looked up by
+ // messages.
+ params.TipSetGetter = func(context.Context, abi.ChainEpoch) (types.TipSetKey, error) {
+ return types.EmptyTSK, nil
+ }
+ }
+
+ if params.Lookback == nil {
+ // TODO: This lookback state returns the supplied precondition state tree, unconditionally.
+ // This is obviously not correct, but the lookback state tree is only used to validate the
+ // worker key when verifying a consensus fault. If the worker key hasn't changed in the
+ // current finality window, this workaround is enough.
+ // The correct solutions are documented in https://github.com/filecoin-project/ref-fvm/issues/381,
+ // but they're much harder to implement, and the tradeoffs aren't clear.
+ params.Lookback = func(ctx context.Context, epoch abi.ChainEpoch) (*state.StateTree, error) {
+ cst := cbor.NewCborStore(bs)
+ return state.LoadStateTree(cst, params.Preroot)
+ }
}
vmOpts := &vm.VMOpts{
@@ -237,25 +253,42 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP
Rand: params.Rand,
BaseFee: params.BaseFee,
NetworkVersion: params.NetworkVersion,
- LookbackState: lookback,
+ LookbackState: params.Lookback,
+ TipSetGetter: params.TipSetGetter,
}
- lvm, err := vm.NewLegacyVM(context.TODO(), vmOpts)
- if err != nil {
- return nil, cid.Undef, err
- }
-
- invoker := filcns.NewActorRegistry()
-
- // register the chaos actor if required by the vector.
+ var vmi vm.Interface
if chaosOn, ok := d.selector["chaos_actor"]; ok && chaosOn == "true" {
- av, _ := actors.VersionForNetwork(params.NetworkVersion)
- invoker.Register(av, nil, chaos.Actor{})
+ lvm, err := vm.NewLegacyVM(context.TODO(), vmOpts)
+ if err != nil {
+ return nil, cid.Undef, err
+ }
+
+ invoker := filcns.NewActorRegistry()
+ av, _ := actorstypes.VersionForNetwork(params.NetworkVersion)
+ registry := builtin.MakeRegistryLegacy([]rtt.VMActor{chaos.Actor{}})
+ invoker.Register(av, nil, registry)
+ lvm.SetInvoker(invoker)
+ vmi = lvm
+ } else {
+ if vmOpts.NetworkVersion >= network.Version16 {
+ fvm, err := vm.NewFVM(context.TODO(), vmOpts)
+ if err != nil {
+ return nil, cid.Undef, err
+ }
+ vmi = fvm
+ } else {
+ lvm, err := vm.NewLegacyVM(context.TODO(), vmOpts)
+ if err != nil {
+ return nil, cid.Undef, err
+ }
+ invoker := filcns.NewActorRegistry()
+ lvm.SetInvoker(invoker)
+ vmi = lvm
+ }
}
- lvm.SetInvoker(invoker)
-
- ret, err := lvm.ApplyMessage(d.ctx, toChainMsg(params.Message))
+ ret, err := vmi.ApplyMessage(d.ctx, toChainMsg(params.Message))
if err != nil {
return nil, cid.Undef, err
}
@@ -263,10 +296,10 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP
var root cid.Cid
if d.vmFlush {
// flush the VM, committing the state tree changes and forcing a
- // recursive copoy from the temporary blcokstore to the real blockstore.
- root, err = lvm.Flush(d.ctx)
+ // recursive copy from the temporary blockstore to the real blockstore.
+ root, err = vmi.Flush(d.ctx)
} else {
- root, err = lvm.StateTree().(*state.StateTree).Flush(d.ctx)
+ root, err = vmi.(*vm.LegacyVM).StateTree().(*state.StateTree).Flush(d.ctx)
}
return ret, root, err
diff --git a/docker-compose.yaml b/docker-compose.yaml
index d68eed8db..a269ba7b5 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -15,7 +15,7 @@
# docker swarm init (if you haven't already)
# docker stack deploy -c docker-compose.yaml mylotuscluster
#
-# for more information, please visit docs.filecoin.io
+# for more information, please visit lotus.filecoin.io
version: "3.8"
diff --git a/documentation/en/README.md b/documentation/en/README.md
index 21cdbe8b7..8c99df017 100644
--- a/documentation/en/README.md
+++ b/documentation/en/README.md
@@ -2,16 +2,12 @@
This folder contains some Lotus documentation mostly intended for Lotus developers.
-User documentation (including documentation for miners) has been moved to https://docs.filecoin.io and https://lotus.filecoin.io:
+User documentation (including documentation for miners) has been moved to https://lotus.filecoin.io:
-- https://docs.filecoin.io/get-started/overview/
- - https://lotus.filecoin.io/lotus/get-started/what-is-lotus/
-- https://docs.filecoin.io/store/
- - https://lotus.filecoin.io/tutorials/lotus/store-and-retrieve/store-data/
-- https://docs.filecoin.io/storage-provider/
- - https://lotus.filecoin.io/tutorials/lotus-miner/run-a-miner/
-- https://docs.filecoin.io/build/
- - https://lotus.filecoin.io/developers/
+- https://lotus.filecoin.io/lotus/get-started/what-is-lotus/
+- https://lotus.filecoin.io/tutorials/lotus/store-and-retrieve/store-data/
+- https://lotus.filecoin.io/tutorials/lotus-miner/run-a-miner/
+- https://lotus.filecoin.io/developers/
## Documentation Website
diff --git a/documentation/en/about.md b/documentation/en/about.md
index f2051e00b..de2bb4c37 100644
--- a/documentation/en/about.md
+++ b/documentation/en/about.md
@@ -8,12 +8,12 @@ It is written in Go and provides a suite of command-line applications:
- Lotus Miner (`lotus-miner`): a Filecoin miner. See the the respective Lotus Miner section in the Mine documentation.
- Lotus Worker (`lotus-worker`): a worker that assists miners to perform mining-related tasks. See its respective guide for more information.
-The [Lotus user documentation](https://docs.filecoin.io/get-started/lotus) is part of the [Filecoin documentation site](https://docs.filecoin.io):
+The [Lotus user documentation](https://lotus.filecoin.io/lotus/get-started/what-is-lotus/) is part of the [Filecoin documentation site](https://lotus.filecoin.io):
-* To install and get started with Lotus, visit the [Get Started section](https://docs.filecoin.io/get-started/lotus).
-* Information about how to perform deals on the Filecoin network using Lotus can be found in the [Store section](https://docs.filecoin.io/store/lotus).
-* Miners looking to provide storage to the Network can find the latest guides in the [Mine section](https://docs.filecoin.io/mine/lotus).
-* Developers and integrators that wish to use the Lotus APIs can start in the [Build section](https://docs.filecoin.io/mine/lotus).
+* To install and get started with Lotus, visit the [Get Started section](https://lotus.filecoin.io/lotus/install/prerequisites/).
+* Information about how to perform deals on the Filecoin network using Lotus can be found in the [Store section](https://lotus.filecoin.io/tutorials/lotus/store-and-retrieve/store-data/).
+* Miners looking to provide storage to the Network can find the latest guides in the [Mine section](https://lotus.filecoin.io/tutorials/lotus-miner/run-a-miner/).
+* Developers and integrators that wish to use the Lotus APIs can start in the [Build section](https://lotus.filecoin.io/tutorials/lotus/build-with-lotus-api/).
-For more details about Filecoin, check out the [Filecoin Docs](https://docs.filecoin.io) and [Filecoin Spec](https://spec.filecoin.io/).
+For more details about Filecoin, check out the [Filecoin Docs](https://lotus.filecoin.io) and [Filecoin Spec](https://spec.filecoin.io/).
diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md
index e5147340d..789f26a85 100644
--- a/documentation/en/api-v0-methods-miner.md
+++ b/documentation/en/api-v0-methods-miner.md
@@ -13,6 +13,8 @@
* [Auth](#Auth)
* [AuthNew](#AuthNew)
* [AuthVerify](#AuthVerify)
+* [Beneficiary](#Beneficiary)
+ * [BeneficiaryWithdrawBalance](#BeneficiaryWithdrawBalance)
* [Check](#Check)
* [CheckProvable](#CheckProvable)
* [Compute](#Compute)
@@ -111,6 +113,7 @@
* [Return](#Return)
* [ReturnAddPiece](#ReturnAddPiece)
* [ReturnDataCid](#ReturnDataCid)
+ * [ReturnDownloadSector](#ReturnDownloadSector)
* [ReturnFetch](#ReturnFetch)
* [ReturnFinalizeReplicaUpdate](#ReturnFinalizeReplicaUpdate)
* [ReturnFinalizeSector](#ReturnFinalizeSector)
@@ -148,6 +151,7 @@
* [SectorNumReserveCount](#SectorNumReserveCount)
* [SectorPreCommitFlush](#SectorPreCommitFlush)
* [SectorPreCommitPending](#SectorPreCommitPending)
+ * [SectorReceive](#SectorReceive)
* [SectorRemove](#SectorRemove)
* [SectorSetExpectedSealDuration](#SectorSetExpectedSealDuration)
* [SectorSetSealDelay](#SectorSetSealDelay)
@@ -163,6 +167,8 @@
* [SectorsSummary](#SectorsSummary)
* [SectorsUnsealPiece](#SectorsUnsealPiece)
* [SectorsUpdate](#SectorsUpdate)
+* [Start](#Start)
+ * [StartTime](#StartTime)
* [Storage](#Storage)
* [StorageAddLocal](#StorageAddLocal)
* [StorageAttach](#StorageAttach)
@@ -246,8 +252,8 @@ Response:
```json
{
"Version": "string value",
- "APIVersion": 131840,
- "BlockDelay": 42
+ "APIVersion": 0,
+ "BlockDelay": 0
}
```
@@ -273,20 +279,12 @@ Inputs: `null`
Response:
```json
{
- "PreCommitControl": [
- "f01234"
- ],
- "CommitControl": [
- "f01234"
- ],
- "TerminateControl": [
- "f01234"
- ],
- "DealPublishControl": [
- "f01234"
- ],
- "DisableOwnerFallback": true,
- "DisableWorkerFallback": true
+ "PreCommitControl": null,
+ "CommitControl": null,
+ "TerminateControl": null,
+ "DealPublishControl": null,
+ "DisableOwnerFallback": false,
+ "DisableWorkerFallback": false
}
```
@@ -364,6 +362,31 @@ Response:
]
```
+## Beneficiary
+
+
+### BeneficiaryWithdrawBalance
+BeneficiaryWithdrawBalance allows the beneficiary of a miner to withdraw balance from miner actor
+Specify amount as "0" to withdraw full balance. This method returns a message CID
+and does not wait for message execution
+
+
+Perms: admin
+
+Inputs:
+```json
+[
+ "0"
+]
+```
+
+Response:
+```json
+{
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+}
+```
+
## Check
@@ -379,13 +402,12 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
}
- ],
- true
+ ]
]
```
@@ -416,9 +438,7 @@ Response:
```json
{
"Size": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PieceCID": null
}
```
@@ -432,17 +452,15 @@ Inputs:
[
[
{
- "SealProof": 8,
- "SectorNumber": 9,
+ "SealProof": 0,
+ "SectorNumber": 0,
"SectorKey": null,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "SealedCID": null
}
],
"Bw==",
10101,
- 16
+ 18
]
```
@@ -450,8 +468,8 @@ Response:
```json
[
{
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
+ "PoStProof": 0,
+ "ProofBytes": null
}
]
```
@@ -492,12 +510,12 @@ Response:
],
"Proofs": [
{
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
+ "PoStProof": 0,
+ "ProofBytes": null
}
],
- "ChainCommitEpoch": 10101,
- "ChainCommitRand": "Bw=="
+ "ChainCommitEpoch": 0,
+ "ChainCommitRand": null
}
]
```
@@ -561,8 +579,8 @@ Inputs:
```json
[
{
- "MaxConcurrency": 123,
- "IncludeSealed": true
+ "MaxConcurrency": 0,
+ "IncludeSealed": false
}
]
```
@@ -776,24 +794,23 @@ Response:
[
{
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
"Client": "f01234",
"Provider": "f01234",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"State": {
- "SectorStartEpoch": 10101,
- "LastUpdatedEpoch": 10101,
- "SlashEpoch": 10101
+ "SectorStartEpoch": 0,
+ "LastUpdatedEpoch": 0,
+ "SlashEpoch": 0,
+ "VerifiedClaim": 0
}
}
]
@@ -979,16 +996,8 @@ Response:
"Subsystem": "string value"
},
"Active": true,
- "LastActive": {
- "Type": "string value",
- "Message": "json raw message",
- "Time": "0001-01-01T00:00:00Z"
- },
- "LastResolved": {
- "Type": "string value",
- "Message": "json raw message",
- "Time": "0001-01-01T00:00:00Z"
- }
+ "LastActive": null,
+ "LastResolved": null
}
]
```
@@ -1058,94 +1067,8 @@ Inputs:
Response:
```json
{
- "ReceivingTransfers": [
- {
- "RequestID": {},
- "RequestState": "string value",
- "IsCurrentChannelRequest": true,
- "ChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "ChannelState": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- },
- "Diagnostics": [
- "string value"
- ]
- }
- ],
- "SendingTransfers": [
- {
- "RequestID": {},
- "RequestState": "string value",
- "IsCurrentChannelRequest": true,
- "ChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "ChannelState": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- },
- "Diagnostics": [
- "string value"
- ]
- }
- ]
+ "ReceivingTransfers": null,
+ "SendingTransfers": null
}
```
@@ -1159,16 +1082,14 @@ Inputs: `null`
Response:
```json
{
- "TransferID": 3,
+ "TransferID": 0,
"Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
+ "BaseCID": null,
+ "IsInitiator": false,
+ "IsSender": false,
"Voucher": "string value",
"Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "OtherPeer": "",
"Transferred": 42,
"Stages": {
"Stages": [
@@ -1202,12 +1123,12 @@ Response:
"Ask": {
"Price": "0",
"VerifiedPrice": "0",
- "MinPieceSize": 1032,
- "MaxPieceSize": 1032,
+ "MinPieceSize": 0,
+ "MaxPieceSize": 0,
"Miner": "f01234",
"Timestamp": 10101,
"Expiry": 10101,
- "SeqNo": 42
+ "SeqNo": 0
},
"Signature": {
"Type": 2,
@@ -1227,57 +1148,49 @@ Response:
```json
{
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
- "Client": "f01234",
- "Provider": "f01234",
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
+ "Client": "\u003cempty\u003e",
+ "Provider": "\u003cempty\u003e",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
- "StoragePricePerEpoch": "0",
- "ProviderCollateral": "0",
- "ClientCollateral": "0"
+ "StartEpoch": 0,
+ "EndEpoch": 0,
+ "StoragePricePerEpoch": "\u003cnil\u003e",
+ "ProviderCollateral": "\u003cnil\u003e",
+ "ClientCollateral": "\u003cnil\u003e"
},
"ClientSignature": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ "Type": 0,
+ "Data": null
},
+ "ProposalCid": null,
"AddFundsCid": null,
"PublishCid": null,
"Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
"Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
"State": 42,
- "PiecePath": ".lotusminer/fstmp123",
- "MetadataPath": ".lotusminer/fstmp123",
- "SlashEpoch": 10101,
- "FastRetrieval": true,
+ "PiecePath": "",
+ "MetadataPath": "",
+ "SlashEpoch": 0,
+ "FastRetrieval": false,
"Message": "string value",
- "FundsReserved": "0",
+ "FundsReserved": "\u003cnil\u003e",
"Ref": {
- "TransferType": "string value",
+ "TransferType": "",
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
+ "PieceSize": 0,
+ "RawBlockSize": 0
},
- "AvailableForRetrieval": true,
- "DealID": 5432,
+ "AvailableForRetrieval": false,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
- "TransferChannelId": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "SectorNumber": 9,
- "InboundCAR": "string value"
+ "TransferChannelId": null,
+ "SectorNumber": 0,
+ "InboundCAR": ""
}
```
@@ -1293,8 +1206,8 @@ Response:
{
"PricePerByte": "0",
"UnsealPrice": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0
}
```
@@ -1326,16 +1239,14 @@ Response:
```json
[
{
- "TransferID": 3,
+ "TransferID": 0,
"Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
+ "BaseCID": null,
+ "IsInitiator": false,
+ "IsSender": false,
"Voucher": "string value",
"Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "OtherPeer": "",
"Transferred": 42,
"Stages": {
"Stages": [
@@ -1369,24 +1280,23 @@ Response:
[
{
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
"Client": "f01234",
"Provider": "f01234",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"State": {
- "SectorStartEpoch": 10101,
- "LastUpdatedEpoch": 10101,
- "SlashEpoch": 10101
+ "SectorStartEpoch": 0,
+ "LastUpdatedEpoch": 0,
+ "SlashEpoch": 0,
+ "VerifiedClaim": 0
}
}
]
@@ -1404,57 +1314,49 @@ Response:
[
{
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
- "Client": "f01234",
- "Provider": "f01234",
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
+ "Client": "\u003cempty\u003e",
+ "Provider": "\u003cempty\u003e",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"ClientSignature": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ "Type": 0,
+ "Data": null
},
+ "ProposalCid": null,
"AddFundsCid": null,
"PublishCid": null,
"Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
"Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
"State": 42,
- "PiecePath": ".lotusminer/fstmp123",
- "MetadataPath": ".lotusminer/fstmp123",
- "SlashEpoch": 10101,
- "FastRetrieval": true,
+ "PiecePath": "",
+ "MetadataPath": "",
+ "SlashEpoch": 0,
+ "FastRetrieval": false,
"Message": "string value",
"FundsReserved": "0",
"Ref": {
- "TransferType": "string value",
+ "TransferType": "",
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
+ "PieceSize": 0,
+ "RawBlockSize": 0
},
- "AvailableForRetrieval": true,
- "DealID": 5432,
+ "AvailableForRetrieval": false,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
- "TransferChannelId": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "SectorNumber": 9,
- "InboundCAR": "string value"
+ "TransferChannelId": null,
+ "SectorNumber": 0,
+ "InboundCAR": ""
}
]
```
@@ -1470,44 +1372,24 @@ Response:
```json
[
{
- "PayloadCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ID": 5,
- "Selector": {
- "Raw": "Ynl0ZSBhcnJheQ=="
- },
+ "PayloadCID": null,
+ "ID": 0,
+ "Selector": null,
"PieceCID": null,
"PricePerByte": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"UnsealPrice": "0",
- "StoreID": 42,
- "ChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "PieceInfo": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "Deals": [
- {
- "DealID": 5432,
- "SectorID": 9,
- "Offset": 1032,
- "Length": 1032
- }
- ]
- },
+ "StoreID": 0,
+ "ChannelID": null,
+ "PieceInfo": null,
"Status": 0,
"Receiver": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "TotalSent": 42,
+ "TotalSent": 0,
"FundsReceived": "0",
"Message": "string value",
- "CurrentInterval": 42,
- "LegacyProtocol": true
+ "CurrentInterval": 0,
+ "LegacyProtocol": false
}
]
```
@@ -1525,28 +1407,26 @@ Response:
"Deals": [
{
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
"Client": "f01234",
"Provider": "f01234",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"ClientSignature": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
+ "Type": 0,
+ "Data": null
}
}
],
"PublishPeriodStart": "0001-01-01T00:00:00Z",
- "PublishPeriod": 60000000000
+ "PublishPeriod": 0
}
```
@@ -1621,8 +1501,8 @@ Inputs:
{
"PricePerByte": "0",
"UnsealPrice": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0
}
]
```
@@ -1661,7 +1541,7 @@ Inputs: `null`
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -1693,7 +1573,7 @@ Response:
```json
{
"Reachability": 1,
- "PublicAddr": "string value"
+ "PublicAddr": ""
}
```
@@ -1707,10 +1587,10 @@ Inputs: `null`
Response:
```json
{
- "TotalIn": 9,
- "TotalOut": 9,
- "RateIn": 12.3,
- "RateOut": 12.3
+ "TotalIn": 0,
+ "TotalOut": 0,
+ "RateIn": 0,
+ "RateOut": 0
}
```
@@ -1764,12 +1644,8 @@ Inputs:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
]
```
@@ -1789,12 +1665,8 @@ Response:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
```
@@ -1810,12 +1682,8 @@ Inputs:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
]
```
@@ -1831,7 +1699,7 @@ Inputs:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -1884,7 +1752,7 @@ Inputs:
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -1932,7 +1800,7 @@ Inputs:
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Agent": "string value",
"Addrs": [
"string value"
@@ -1940,16 +1808,7 @@ Response:
"Protocols": [
"string value"
],
- "ConnMgrMeta": {
- "FirstSeen": "0001-01-01T00:00:00Z",
- "Value": 123,
- "Tags": {
- "name": 42
- },
- "Conns": {
- "name": "2021-03-08T22:52:18Z"
- }
- }
+ "ConnMgrMeta": null
}
```
@@ -1964,7 +1823,7 @@ Response:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -2043,7 +1902,7 @@ Response:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Score": {
"Score": 12.3,
"Topics": {
@@ -2054,9 +1913,9 @@ Response:
"InvalidMessageDeliveries": 3
}
},
- "AppSpecificScore": 12.3,
- "IPColocationFactor": 12.3,
- "BehaviourPenalty": 12.3
+ "AppSpecificScore": 0,
+ "IPColocationFactor": 0,
+ "BehaviourPenalty": 0
}
}
]
@@ -2102,19 +1961,19 @@ Response:
```json
{
"System": {
- "NumStreamsInbound": 123,
- "NumStreamsOutbound": 123,
- "NumConnsInbound": 123,
- "NumConnsOutbound": 123,
- "NumFD": 123,
+ "NumStreamsInbound": 0,
+ "NumStreamsOutbound": 0,
+ "NumConnsInbound": 0,
+ "NumConnsOutbound": 0,
+ "NumFD": 0,
"Memory": 9
},
"Transient": {
- "NumStreamsInbound": 123,
- "NumStreamsOutbound": 123,
- "NumConnsInbound": 123,
- "NumConnsOutbound": 123,
- "NumFD": 123,
+ "NumStreamsInbound": 0,
+ "NumStreamsOutbound": 0,
+ "NumConnsInbound": 0,
+ "NumConnsOutbound": 0,
+ "NumFD": 0,
"Memory": 9
},
"Services": {
@@ -2170,18 +2029,8 @@ Inputs:
Response:
```json
{
- "CID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceBlockLocations": [
- {
- "RelOffset": 42,
- "BlockSize": 42,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- }
- ]
+ "CID": null,
+ "PieceBlockLocations": null
}
```
@@ -2202,13 +2051,11 @@ Inputs:
Response:
```json
{
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "PieceCID": null,
"Deals": [
{
- "DealID": 5432,
- "SectorID": 9,
+ "DealID": 0,
+ "SectorID": 0,
"Offset": 1032,
"Length": 1032
}
@@ -2313,13 +2160,11 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Size": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PieceCID": null
},
{
"Code": 0,
@@ -2344,13 +2189,35 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Size": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PieceCID": null
+ },
+ {
+ "Code": 0,
+ "Message": "string value"
+ }
+]
+```
+
+Response: `{}`
+
+### ReturnDownloadSector
+
+
+Perms: admin
+
+Inputs:
+```json
+[
+ {
+ "Sector": {
+ "Miner": 1000,
+ "Number": 9
+ },
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2374,7 +2241,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2398,7 +2265,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2422,7 +2289,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2446,7 +2313,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2470,7 +2337,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2494,7 +2361,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
[
"Ynl0ZSBhcnJheQ=="
@@ -2521,7 +2388,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
"Bw==",
{
@@ -2546,7 +2413,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
true,
{
@@ -2571,7 +2438,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2595,15 +2462,11 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
- "NewSealed": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "NewUnsealed": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "NewSealed": null,
+ "NewUnsealed": null
},
{
"Code": 0,
@@ -2627,7 +2490,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
"Bw==",
{
@@ -2652,7 +2515,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
"Bw==",
{
@@ -2677,7 +2540,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
"Bw==",
{
@@ -2702,7 +2565,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Unsealed": {
@@ -2734,7 +2597,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
},
{
"Code": 0,
@@ -2783,7 +2646,7 @@ Inputs:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
]
```
@@ -2853,27 +2716,13 @@ Inputs:
{},
{
"PublishCid": null,
- "DealID": 5432,
- "DealProposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
- "Client": "f01234",
- "Provider": "f01234",
- "Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
- "StoragePricePerEpoch": "0",
- "ProviderCollateral": "0",
- "ClientCollateral": "0"
- },
+ "DealID": 0,
+ "DealProposal": null,
"DealSchedule": {
- "StartEpoch": 10101,
- "EndEpoch": 10101
+ "StartEpoch": 0,
+ "EndEpoch": 0
},
- "KeepUnsealed": true
+ "KeepUnsealed": false
}
]
```
@@ -2903,9 +2752,7 @@ Response:
123,
124
],
- "FailedSectors": {
- "123": "can't acquire read lock"
- },
+ "FailedSectors": null,
"Msg": null,
"Error": "string value"
}
@@ -2995,8 +2842,7 @@ Response:
1
],
"InUse": [
- 5,
- 1
+ 0
],
"Next": 9
}
@@ -3124,6 +2970,63 @@ Response:
]
```
+### SectorReceive
+
+
+Perms: admin
+
+Inputs:
+```json
+[
+ {
+ "State": "Proving",
+ "Sector": {
+ "Miner": 1000,
+ "Number": 9
+ },
+ "Type": 8,
+ "Pieces": [
+ {
+ "Piece": {
+ "Size": 1032,
+ "PieceCID": null
+ },
+ "DealInfo": null
+ }
+ ],
+ "TicketValue": null,
+ "TicketEpoch": 0,
+ "PreCommit1Out": null,
+ "CommD": null,
+ "CommR": null,
+ "PreCommitInfo": null,
+ "PreCommitDeposit": null,
+ "PreCommitMessage": null,
+ "PreCommitTipSet": [],
+ "SeedValue": null,
+ "SeedEpoch": 0,
+ "CommitProof": null,
+ "CommitMessage": null,
+ "Log": [
+ {
+ "Kind": "string value",
+ "Timestamp": 42,
+ "Trace": "string value",
+ "Message": "string value"
+ }
+ ],
+ "DataUnsealed": null,
+ "DataSealed": null,
+ "DataCache": null,
+ "RemoteCommit1Endpoint": "",
+ "RemoteCommit2Endpoint": "",
+ "RemoteSealingDoneEndpoint": ""
+ }
+]
+```
+
+Response: `{}`
+
### SectorRemove
SectorRemove removes the sector from storage. It doesn't terminate it on-chain, which can
be done with SectorTerminate. Removing and not terminating live sectors will cause additional penalties.
@@ -3311,7 +3214,7 @@ Inputs:
Response:
```json
{
- "SectorID": 9,
+ "SectorID": 0,
"State": "Proving",
"CommD": null,
"CommR": null,
@@ -3323,34 +3226,9 @@ Response:
{
"Piece": {
"Size": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PieceCID": null
},
- "DealInfo": {
- "PublishCid": null,
- "DealID": 5432,
- "DealProposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
- "Client": "f01234",
- "Provider": "f01234",
- "Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
- "StoragePricePerEpoch": "0",
- "ProviderCollateral": "0",
- "ClientCollateral": "0"
- },
- "DealSchedule": {
- "StartEpoch": 10101,
- "EndEpoch": 10101
- },
- "KeepUnsealed": true
- }
+ "DealInfo": null
}
],
"Ticket": {
@@ -3364,9 +3242,9 @@ Response:
"PreCommitMsg": null,
"CommitMsg": null,
"Retries": 42,
- "ToUpgrade": true,
+ "ToUpgrade": false,
"ReplicaUpdateMessage": null,
- "LastErr": "string value",
+ "LastErr": "",
"Log": [
{
"Kind": "string value",
@@ -3375,13 +3253,13 @@ Response:
"Message": "string value"
}
],
- "SealProof": 8,
+ "SealProof": 0,
"Activation": 10101,
"Expiration": 10101,
- "DealWeight": "0",
- "VerifiedDealWeight": "0",
- "InitialPledge": "0",
- "OnTime": 10101,
+ "DealWeight": "\u003cnil\u003e",
+ "VerifiedDealWeight": "\u003cnil\u003e",
+ "InitialPledge": "\u003cnil\u003e",
+ "OnTime": 0,
"Early": 10101
}
```
@@ -3411,10 +3289,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
1040384,
1024,
@@ -3440,6 +3318,18 @@ Inputs:
Response: `{}`
+## Start
+
+
+### StartTime
+
+
+Perms: read
+
+Inputs: `null`
+
+Response: `"0001-01-01T00:00:00Z"`
+
## Storage
@@ -3467,31 +3357,23 @@ Inputs:
```json
[
{
- "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8",
- "URLs": [
- "string value"
- ],
+ "ID": "",
+ "URLs": null,
"Weight": 42,
- "MaxStorage": 42,
- "CanSeal": true,
- "CanStore": true,
+ "MaxStorage": 0,
+ "CanSeal": false,
+ "CanStore": false,
"Groups": [
"string value"
],
- "AllowTo": [
- "string value"
- ],
- "AllowTypes": [
- "string value"
- ],
- "DenyTypes": [
- "string value"
- ]
+ "AllowTo": null,
+ "AllowTypes": null,
+ "DenyTypes": null
},
{
"Capacity": 9,
"Available": 9,
- "FSAvailable": 9,
+ "FSAvailable": 0,
"Reserved": 9,
"Max": 9,
"Used": 9
@@ -3541,26 +3423,18 @@ Response:
```json
[
{
- "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8",
- "URLs": [
- "string value"
- ],
+ "ID": "",
+ "URLs": null,
"Weight": 42,
- "MaxStorage": 42,
- "CanSeal": true,
- "CanStore": true,
+ "MaxStorage": 0,
+ "CanSeal": false,
+ "CanStore": false,
"Groups": [
"string value"
],
- "AllowTo": [
- "string value"
- ],
- "AllowTypes": [
- "string value"
- ],
- "DenyTypes": [
- "string value"
- ]
+ "AllowTo": null,
+ "AllowTypes": null,
+ "DenyTypes": null
}
]
```
@@ -3663,23 +3537,15 @@ Response:
```json
[
{
- "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8",
- "URLs": [
- "string value"
- ],
- "BaseURLs": [
- "string value"
- ],
+ "ID": "",
+ "URLs": null,
+ "BaseURLs": null,
"Weight": 42,
- "CanSeal": true,
- "CanStore": true,
+ "CanSeal": false,
+ "CanStore": false,
"Primary": true,
- "AllowTypes": [
- "string value"
- ],
- "DenyTypes": [
- "string value"
- ]
+ "AllowTypes": null,
+ "DenyTypes": null
}
]
```
@@ -3734,26 +3600,18 @@ Inputs:
Response:
```json
{
- "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8",
- "URLs": [
- "string value"
- ],
+ "ID": "",
+ "URLs": null,
"Weight": 42,
- "MaxStorage": 42,
- "CanSeal": true,
- "CanStore": true,
+ "MaxStorage": 0,
+ "CanSeal": false,
+ "CanStore": false,
"Groups": [
"string value"
],
- "AllowTo": [
- "string value"
- ],
- "AllowTypes": [
- "string value"
- ],
- "DenyTypes": [
- "string value"
- ]
+ "AllowTo": null,
+ "AllowTypes": null,
+ "DenyTypes": null
}
```
@@ -3838,7 +3696,7 @@ Inputs:
"Stat": {
"Capacity": 9,
"Available": 9,
- "FSAvailable": 9,
+ "FSAvailable": 0,
"Reserved": 9,
"Max": 9,
"Used": 9
@@ -3867,7 +3725,7 @@ Response:
{
"Capacity": 9,
"Available": 9,
- "FSAvailable": 9,
+ "FSAvailable": 0,
"Reserved": 9,
"Max": 9,
"Used": 9
diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md
index 554f8666d..3b80f9ad7 100644
--- a/documentation/en/api-v0-methods-worker.md
+++ b/documentation/en/api-v0-methods-worker.md
@@ -12,6 +12,8 @@
* [AddPiece](#AddPiece)
* [Data](#Data)
* [DataCid](#DataCid)
+* [Download](#Download)
+ * [DownloadSectorData](#DownloadSectorData)
* [Finalize](#Finalize)
* [FinalizeReplicaUpdate](#FinalizeReplicaUpdate)
* [FinalizeSector](#FinalizeSector)
@@ -73,10 +75,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
1,
"sealing",
@@ -91,7 +93,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -106,16 +108,14 @@ Response:
```json
{
"Hostname": "string value",
- "IgnoreResources": true,
+ "IgnoreResources": false,
"Resources": {
- "MemPhysical": 42,
- "MemUsed": 42,
- "MemSwap": 42,
- "MemSwapUsed": 42,
- "CPUs": 42,
- "GPUs": [
- "string value"
- ],
+ "MemPhysical": 0,
+ "MemUsed": 0,
+ "MemSwap": 0,
+ "MemSwapUsed": 0,
+ "CPUs": 0,
+ "GPUs": null,
"Resources": {
"post/v0/windowproof": {
"0": {
@@ -1421,11 +1421,11 @@ Response:
```json
[
{
- "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8",
+ "ID": "",
"Weight": 42,
- "LocalPath": "string value",
- "CanSeal": true,
- "CanStore": true
+ "LocalPath": "",
+ "CanSeal": false,
+ "CanStore": false
}
]
```
@@ -1490,10 +1490,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
[
1024
@@ -1510,7 +1510,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1538,7 +1538,47 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
+}
+```
+
+## Download
+
+
+### DownloadSectorData
+
+
+Perms: admin
+
+Inputs:
+```json
+[
+ {
+ "ID": {
+ "Miner": 0,
+ "Number": 0
+ },
+ "ProofType": 0
+ },
+ true,
+ {
+ "2": {
+ "Local": false,
+ "URL": "https://example.com/sealingservice/sectors/s-f0123-12345",
+ "Headers": null
+ }
+ }
+]
+```
+
+Response:
+```json
+{
+ "Sector": {
+ "Miner": 1000,
+ "Number": 9
+ },
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1555,17 +1595,11 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
- },
- [
- {
- "Offset": 1024,
- "Size": 1024
- }
- ]
+ "ProofType": 0
+ }
]
```
@@ -1576,7 +1610,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1590,17 +1624,11 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
- },
- [
- {
- "Offset": 1024,
- "Size": 1024
- }
- ]
+ "ProofType": 0
+ }
]
```
@@ -1611,7 +1639,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1628,10 +1656,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -1646,7 +1674,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1662,11 +1690,9 @@ Inputs:
1000,
[
{
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
"Challenge": [
42
],
@@ -1682,8 +1708,8 @@ Response:
```json
{
"PoStProofs": {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
+ "PoStProof": 0,
+ "ProofBytes": null
},
"Skipped": [
{
@@ -1706,11 +1732,9 @@ Inputs:
1000,
[
{
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
"Challenge": [
42
],
@@ -1725,8 +1749,8 @@ Response:
```json
[
{
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
+ "PoStProof": 0,
+ "ProofBytes": null
}
]
```
@@ -1744,10 +1768,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
1
]
@@ -1760,7 +1784,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1791,10 +1815,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -1815,7 +1839,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1829,10 +1853,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -1856,7 +1880,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1873,10 +1897,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
[
{
@@ -1894,7 +1918,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1911,17 +1935,15 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
[
{
"Size": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PieceCID": null
}
]
]
@@ -1934,7 +1956,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1951,19 +1973,17 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
"Bw==",
"Bw==",
[
{
"Size": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PieceCID": null
}
],
{
@@ -1984,7 +2004,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -1998,10 +2018,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
"Bw=="
]
@@ -2014,7 +2034,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -2028,18 +2048,16 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
"Bw==",
[
{
"Size": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PieceCID": null
}
]
]
@@ -2052,7 +2070,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -2066,10 +2084,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
"Bw=="
]
@@ -2082,7 +2100,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
@@ -2233,10 +2251,10 @@ Inputs:
[
{
"ID": {
- "Miner": 1000,
- "Number": 9
+ "Miner": 0,
+ "Number": 0
},
- "ProofType": 8
+ "ProofType": 0
},
1040384,
1024,
@@ -2254,7 +2272,7 @@ Response:
"Miner": 1000,
"Number": 9
},
- "ID": "07070707-0707-0707-0707-070707070707"
+ "ID": "00000000-0000-0000-0000-000000000000"
}
```
diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md
index 75459001a..bc8b2661c 100644
--- a/documentation/en/api-v0-methods.md
+++ b/documentation/en/api-v0-methods.md
@@ -156,6 +156,8 @@
* [PaychVoucherCreate](#PaychVoucherCreate)
* [PaychVoucherList](#PaychVoucherList)
* [PaychVoucherSubmit](#PaychVoucherSubmit)
+* [Start](#Start)
+ * [StartTime](#StartTime)
* [State](#State)
* [StateAccountKey](#StateAccountKey)
* [StateActorCodeCIDs](#StateActorCodeCIDs)
@@ -168,6 +170,11 @@
* [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds)
* [StateDecodeParams](#StateDecodeParams)
* [StateGetActor](#StateGetActor)
+ * [StateGetAllocation](#StateGetAllocation)
+ * [StateGetAllocationForPendingDeal](#StateGetAllocationForPendingDeal)
+ * [StateGetAllocations](#StateGetAllocations)
+ * [StateGetClaim](#StateGetClaim)
+ * [StateGetClaims](#StateGetClaims)
* [StateGetNetworkParams](#StateGetNetworkParams)
* [StateGetRandomnessFromBeacon](#StateGetRandomnessFromBeacon)
* [StateGetRandomnessFromTickets](#StateGetRandomnessFromTickets)
@@ -294,8 +301,8 @@ Response:
```json
{
"Version": "string value",
- "APIVersion": 131840,
- "BlockDelay": 42
+ "APIVersion": 0,
+ "BlockDelay": 0
}
```
@@ -434,24 +441,11 @@ Response:
{
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -459,25 +453,15 @@ Response:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
}
```
@@ -511,49 +495,8 @@ Inputs:
Response:
```json
{
- "BlsMessages": [
- {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- }
- ],
- "SecpkMessages": [
- {
- "Message": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "Signature": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- }
- ],
+ "BlsMessages": null,
+ "SecpkMessages": null,
"Cids": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -603,13 +546,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
@@ -647,13 +590,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
}
@@ -711,13 +654,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
}
@@ -747,7 +690,7 @@ Response:
{
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
}
]
```
@@ -1149,16 +1092,14 @@ Inputs: `null`
Response:
```json
{
- "TransferID": 3,
+ "TransferID": 0,
"Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
+ "BaseCID": null,
+ "IsInitiator": false,
+ "IsSender": false,
"Voucher": "string value",
"Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "OtherPeer": "",
"Transferred": 42,
"Stages": {
"Stages": [
@@ -1197,11 +1138,9 @@ Inputs:
Response:
```json
{
- "PayloadSize": 9,
- "PieceSize": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PayloadSize": 0,
+ "PieceSize": 0,
+ "PieceCID": null
}
```
@@ -1223,8 +1162,8 @@ Inputs:
Response:
```json
{
- "PayloadSize": 9,
- "PieceSize": 1032
+ "PayloadSize": 0,
+ "PieceSize": 0
}
```
@@ -1257,12 +1196,12 @@ Response:
"MinPrice": "0",
"UnsealPrice": "0",
"PricePerByte": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"Miner": "f01234",
"MinerPeer": {
- "Address": "f01234",
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "Address": "\u003cempty\u003e",
+ "ID": "",
"PieceCID": null
}
}
@@ -1280,7 +1219,7 @@ Inputs:
[
{
"Path": "string value",
- "IsCAR": true
+ "IsCAR": false
},
"string value"
]
@@ -1306,81 +1245,21 @@ Inputs:
Response:
```json
{
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ProposalCid": null,
"State": 42,
"Message": "string value",
- "DealStages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "ExpectedDuration": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- },
+ "DealStages": null,
"Provider": "f01234",
- "DataRef": {
- "TransferType": "string value",
- "Root": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
- },
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "DataRef": null,
+ "PieceCID": null,
"Size": 42,
"PricePerEpoch": "0",
"Duration": 42,
- "DealID": 5432,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
"Verified": true,
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- }
+ "TransferChannelID": null,
+ "DataTransfer": null
}
```
@@ -1410,81 +1289,21 @@ Inputs: `null`
Response:
```json
{
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ProposalCid": null,
"State": 42,
"Message": "string value",
- "DealStages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "ExpectedDuration": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- },
+ "DealStages": null,
"Provider": "f01234",
- "DataRef": {
- "TransferType": "string value",
- "Root": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
- },
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "DataRef": null,
+ "PieceCID": null,
"Size": 42,
- "PricePerEpoch": "0",
+ "PricePerEpoch": "\u003cnil\u003e",
"Duration": 42,
- "DealID": 5432,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
"Verified": true,
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- }
+ "TransferChannelID": null,
+ "DataTransfer": null
}
```
@@ -1499,53 +1318,19 @@ Inputs: `null`
Response:
```json
{
- "PayloadCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ID": 5,
+ "PayloadCID": null,
+ "ID": 0,
"PieceCID": null,
- "PricePerByte": "0",
- "UnsealPrice": "0",
+ "PricePerByte": "\u003cnil\u003e",
+ "UnsealPrice": "\u003cnil\u003e",
"Status": 0,
"Message": "string value",
"Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "BytesReceived": 42,
- "BytesPaidFor": 42,
- "TotalPaid": "0",
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- },
+ "BytesReceived": 0,
+ "BytesPaidFor": 0,
+ "TotalPaid": "\u003cnil\u003e",
+ "TransferChannelID": null,
+ "DataTransfer": null,
"Event": 5
}
```
@@ -1578,7 +1363,7 @@ Inputs:
[
{
"Path": "string value",
- "IsCAR": true
+ "IsCAR": false
}
]
```
@@ -1589,7 +1374,7 @@ Response:
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "ImportID": 50
+ "ImportID": 0
}
```
@@ -1605,16 +1390,14 @@ Response:
```json
[
{
- "TransferID": 3,
+ "TransferID": 0,
"Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
+ "BaseCID": null,
+ "IsInitiator": false,
+ "IsSender": false,
"Voucher": "string value",
"Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "OtherPeer": "",
"Transferred": 42,
"Stages": {
"Stages": [
@@ -1648,81 +1431,21 @@ Response:
```json
[
{
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ProposalCid": null,
"State": 42,
"Message": "string value",
- "DealStages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "ExpectedDuration": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- },
+ "DealStages": null,
"Provider": "f01234",
- "DataRef": {
- "TransferType": "string value",
- "Root": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
- },
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "DataRef": null,
+ "PieceCID": null,
"Size": 42,
"PricePerEpoch": "0",
"Duration": 42,
- "DealID": 5432,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
"Verified": true,
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- }
+ "TransferChannelID": null,
+ "DataTransfer": null
}
]
```
@@ -1743,8 +1466,8 @@ Response:
"Err": "string value",
"Root": null,
"Source": "string value",
- "FilePath": "string value",
- "CARPath": "string value"
+ "FilePath": "",
+ "CARPath": ""
}
]
```
@@ -1762,53 +1485,19 @@ Response:
```json
[
{
- "PayloadCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ID": 5,
+ "PayloadCID": null,
+ "ID": 0,
"PieceCID": null,
"PricePerByte": "0",
"UnsealPrice": "0",
"Status": 0,
"Message": "string value",
"Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "BytesReceived": 42,
- "BytesPaidFor": 42,
+ "BytesReceived": 0,
+ "BytesPaidFor": 0,
"TotalPaid": "0",
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- },
+ "TransferChannelID": null,
+ "DataTransfer": null,
"Event": 5
}
]
@@ -1840,15 +1529,15 @@ Response:
},
"Piece": null,
"Size": 42,
- "MinPrice": "0",
- "UnsealPrice": "0",
- "PricePerByte": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "MinPrice": "\u003cnil\u003e",
+ "UnsealPrice": "\u003cnil\u003e",
+ "PricePerByte": "\u003cnil\u003e",
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"Miner": "f01234",
"MinerPeer": {
- "Address": "f01234",
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "Address": "\u003cempty\u003e",
+ "ID": "",
"PieceCID": null
}
}
@@ -1872,12 +1561,12 @@ Response:
{
"Price": "0",
"VerifiedPrice": "0",
- "MinPieceSize": 1032,
- "MaxPieceSize": 1032,
+ "MinPieceSize": 0,
+ "MaxPieceSize": 0,
"Miner": "f01234",
"Timestamp": 10101,
"Expiry": 10101,
- "SeqNo": 42
+ "SeqNo": 0
}
```
@@ -1927,24 +1616,20 @@ Inputs:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Piece": null,
- "DatamodelPathSelector": "Links/21/Hash/Links/42/Hash",
+ "DatamodelPathSelector": null,
"Size": 42,
- "FromLocalCAR": "string value",
+ "FromLocalCAR": "",
"Total": "0",
- "UnsealPrice": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "UnsealPrice": "\u003cnil\u003e",
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"Client": "f01234",
"Miner": "f01234",
- "MinerPeer": {
- "Address": "f01234",
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "PieceCID": null
- }
+ "MinerPeer": null
},
{
"Path": "string value",
- "IsCAR": true
+ "IsCAR": false
}
]
```
@@ -1982,24 +1667,20 @@ Inputs:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Piece": null,
- "DatamodelPathSelector": "Links/21/Hash/Links/42/Hash",
+ "DatamodelPathSelector": null,
"Size": 42,
- "FromLocalCAR": "string value",
+ "FromLocalCAR": "",
"Total": "0",
- "UnsealPrice": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "UnsealPrice": "\u003cnil\u003e",
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"Client": "f01234",
"Miner": "f01234",
- "MinerPeer": {
- "Address": "f01234",
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "PieceCID": null
- }
+ "MinerPeer": null
},
{
"Path": "string value",
- "IsCAR": true
+ "IsCAR": false
}
]
```
@@ -2009,8 +1690,8 @@ Response:
{
"Event": 5,
"Status": 0,
- "BytesReceived": 42,
- "FundsSpent": "0",
+ "BytesReceived": 0,
+ "FundsSpent": "\u003cnil\u003e",
"Err": "string value"
}
```
@@ -2026,22 +1707,22 @@ Inputs:
[
{
"Data": {
- "TransferType": "string value",
+ "TransferType": "",
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
+ "PieceSize": 0,
+ "RawBlockSize": 0
},
"Wallet": "f01234",
"Miner": "f01234",
"EpochPrice": "0",
- "MinBlocksDuration": 42,
+ "MinBlocksDuration": 0,
"ProviderCollateral": "0",
- "DealStartEpoch": 10101,
- "FastRetrieval": true,
- "VerifiedDeal": true
+ "DealStartEpoch": 0,
+ "FastRetrieval": false,
+ "VerifiedDeal": false
}
]
```
@@ -2059,22 +1740,22 @@ Inputs:
[
{
"Data": {
- "TransferType": "string value",
+ "TransferType": "",
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
+ "PieceSize": 0,
+ "RawBlockSize": 0
},
"Wallet": "f01234",
"Miner": "f01234",
"EpochPrice": "0",
- "MinBlocksDuration": 42,
+ "MinBlocksDuration": 0,
"ProviderCollateral": "0",
- "DealStartEpoch": 10101,
- "FastRetrieval": true,
- "VerifiedDeal": true
+ "DealStartEpoch": 0,
+ "FastRetrieval": false,
+ "VerifiedDeal": false
}
]
```
@@ -2120,13 +1801,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
9,
@@ -2159,13 +1840,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
[
@@ -2222,18 +1903,18 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
{
"MaxFee": "0",
- "MsgUuid": "07070707-0707-0707-0707-070707070707"
+ "MsgUuid": "00000000-0000-0000-0000-000000000000"
},
[
{
@@ -2254,13 +1935,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
@@ -2296,16 +1977,8 @@ Response:
"Subsystem": "string value"
},
"Active": true,
- "LastActive": {
- "Type": "string value",
- "Message": "json raw message",
- "Time": "0001-01-01T00:00:00Z"
- },
- "LastResolved": {
- "Type": "string value",
- "Message": "json raw message",
- "Time": "0001-01-01T00:00:00Z"
- }
+ "LastActive": null,
+ "LastResolved": null
}
]
```
@@ -2461,18 +2134,13 @@ Inputs:
}
],
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
"Eproof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "WinCount": 0,
+ "VRFProof": null
},
- "BeaconValues": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "BeaconValues": null,
"Messages": [
{
"Message": {
@@ -2481,13 +2149,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2495,18 +2163,13 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
],
"Epoch": 10101,
"Timestamp": 42,
- "WinningPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ]
+ "WinningPoStProof": null
}
]
```
@@ -2517,24 +2180,11 @@ Response:
"Header": {
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -2542,37 +2192,19 @@ Response:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
},
- "BlsMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ],
- "SecpkMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ]
+ "BlsMessages": null,
+ "SecpkMessages": null
}
```
@@ -2604,27 +2236,20 @@ Response:
"NetworkPower": "0",
"Sectors": [
{
- "SealProof": 8,
- "SectorNumber": 9,
+ "SealProof": 0,
+ "SectorNumber": 0,
"SectorKey": null,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "SealedCID": null
}
],
- "WorkerKey": "f01234",
- "SectorSize": 34359738368,
+ "WorkerKey": "\u003cempty\u003e",
+ "SectorSize": 0,
"PrevBeaconEntry": {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
+ "Round": 0,
+ "Data": null
},
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "EligibleForMining": true
+ "BeaconEntries": null,
+ "EligibleForMining": false
}
```
@@ -2650,13 +2275,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2664,7 +2289,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2696,19 +2321,19 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
],
{
"MaxFee": "0",
- "MsgUuid": "07070707-0707-0707-0707-070707070707"
+ "MsgUuid": "00000000-0000-0000-0000-000000000000"
}
]
```
@@ -2723,13 +2348,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2737,7 +2362,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2760,13 +2385,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2774,7 +2399,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2816,14 +2441,12 @@ Inputs: `null`
Response:
```json
{
- "PriorityAddrs": [
- "f01234"
- ],
- "SizeLimitHigh": 123,
- "SizeLimitLow": 123,
- "ReplaceByFeeRatio": 12.3,
- "PruneCooldown": 60000000000,
- "GasLimitOverestimation": 12.3
+ "PriorityAddrs": null,
+ "SizeLimitHigh": 0,
+ "SizeLimitLow": 0,
+ "ReplaceByFeeRatio": 0,
+ "PruneCooldown": 0,
+ "GasLimitOverestimation": 0
}
```
@@ -2873,13 +2496,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2887,7 +2510,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2909,13 +2532,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2923,7 +2546,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2956,18 +2579,18 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
{
"MaxFee": "0",
- "MsgUuid": "07070707-0707-0707-0707-070707070707"
+ "MsgUuid": "00000000-0000-0000-0000-000000000000"
}
]
```
@@ -2981,13 +2604,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2995,7 +2618,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
@@ -3016,13 +2639,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3030,7 +2653,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -3074,13 +2697,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3088,7 +2711,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -3104,14 +2727,12 @@ Inputs:
```json
[
{
- "PriorityAddrs": [
- "f01234"
- ],
- "SizeLimitHigh": 123,
- "SizeLimitLow": 123,
- "ReplaceByFeeRatio": 12.3,
- "PruneCooldown": 60000000000,
- "GasLimitOverestimation": 12.3
+ "PriorityAddrs": null,
+ "SizeLimitHigh": 0,
+ "SizeLimitLow": 0,
+ "ReplaceByFeeRatio": 0,
+ "PruneCooldown": 0,
+ "GasLimitOverestimation": 0
}
]
```
@@ -3136,13 +2757,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3150,7 +2771,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
}
@@ -3401,7 +3022,7 @@ Response:
```json
[
{
- "ID": 9,
+ "ID": 0,
"To": "f01234",
"Value": "0",
"Method": 1,
@@ -3469,9 +3090,9 @@ Inputs:
Response:
```json
{
- "InitialBalance": "0",
- "StartEpoch": 10101,
- "UnlockDuration": 10101
+ "InitialBalance": "\u003cnil\u003e",
+ "StartEpoch": 0,
+ "UnlockDuration": 0
}
```
@@ -3620,7 +3241,7 @@ Inputs: `null`
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -3652,7 +3273,7 @@ Response:
```json
{
"Reachability": 1,
- "PublicAddr": "string value"
+ "PublicAddr": ""
}
```
@@ -3666,10 +3287,10 @@ Inputs: `null`
Response:
```json
{
- "TotalIn": 9,
- "TotalOut": 9,
- "RateIn": 12.3,
- "RateOut": 12.3
+ "TotalIn": 0,
+ "TotalOut": 0,
+ "RateIn": 0,
+ "RateOut": 0
}
```
@@ -3723,12 +3344,8 @@ Inputs:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
]
```
@@ -3748,12 +3365,8 @@ Response:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
```
@@ -3769,12 +3382,8 @@ Inputs:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
]
```
@@ -3790,7 +3399,7 @@ Inputs:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -3843,7 +3452,7 @@ Inputs:
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -3891,7 +3500,7 @@ Inputs:
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Agent": "string value",
"Addrs": [
"string value"
@@ -3899,16 +3508,7 @@ Response:
"Protocols": [
"string value"
],
- "ConnMgrMeta": {
- "FirstSeen": "0001-01-01T00:00:00Z",
- "Value": 123,
- "Tags": {
- "name": 42
- },
- "Conns": {
- "name": "2021-03-08T22:52:18Z"
- }
- }
+ "ConnMgrMeta": null
}
```
@@ -3923,7 +3523,7 @@ Response:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -4002,7 +3602,7 @@ Response:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Score": {
"Score": 12.3,
"Topics": {
@@ -4013,9 +3613,9 @@ Response:
"InvalidMessageDeliveries": 3
}
},
- "AppSpecificScore": 12.3,
- "IPColocationFactor": 12.3,
- "BehaviourPenalty": 12.3
+ "AppSpecificScore": 0,
+ "IPColocationFactor": 0,
+ "BehaviourPenalty": 0
}
}
]
@@ -4061,19 +3661,19 @@ Response:
```json
{
"System": {
- "NumStreamsInbound": 123,
- "NumStreamsOutbound": 123,
- "NumConnsInbound": 123,
- "NumConnsOutbound": 123,
- "NumFD": 123,
+ "NumStreamsInbound": 0,
+ "NumStreamsOutbound": 0,
+ "NumConnsInbound": 0,
+ "NumConnsOutbound": 0,
+ "NumFD": 0,
"Memory": 9
},
"Transient": {
- "NumStreamsInbound": 123,
- "NumStreamsOutbound": 123,
- "NumConnsInbound": 123,
- "NumConnsOutbound": 123,
- "NumFD": 123,
+ "NumStreamsInbound": 0,
+ "NumStreamsOutbound": 0,
+ "NumConnsInbound": 0,
+ "NumConnsOutbound": 0,
+ "NumFD": 0,
"Memory": 9
},
"Services": {
@@ -4221,9 +3821,7 @@ Response:
```json
{
"Channel": "f01234",
- "WaitSentinel": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "WaitSentinel": null
}
```
@@ -4270,9 +3868,9 @@ Inputs:
[
{
"Amount": "0",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "MinSettle": 10101,
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "MinSettle": 0,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4287,15 +3885,13 @@ Response:
```json
{
"Channel": "f01234",
- "WaitSentinel": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "WaitSentinel": null,
"Vouchers": [
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4304,7 +3900,7 @@ Response:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4354,7 +3950,7 @@ Inputs:
Response:
```json
{
- "ControlAddr": "f01234",
+ "ControlAddr": "\u003cempty\u003e",
"Direction": 1
}
```
@@ -4369,10 +3965,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4381,7 +3977,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4410,10 +4006,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4422,7 +4018,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4451,10 +4047,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4463,7 +4059,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4498,10 +4094,10 @@ Response:
```json
{
"Voucher": {
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4510,7 +4106,7 @@ Response:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4542,10 +4138,10 @@ Response:
```json
[
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4554,7 +4150,7 @@ Response:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4579,10 +4175,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4591,7 +4187,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4615,6 +4211,18 @@ Response:
}
```
+## Start
+
+
+### StartTime
+
+
+Perms: read
+
+Inputs: `null`
+
+Response: `"0001-01-01T00:00:00Z"`
+
## State
The State methods are used to query, inspect, and interact with chain state.
Most methods take a TipSetKey as a parameter. The state looked up is the parent state of the tipset.
@@ -4653,7 +4261,7 @@ Perms: read
Inputs:
```json
[
- 16
+ 18
]
```
@@ -4668,7 +4276,7 @@ Perms: read
Inputs:
```json
[
- 16
+ 18
]
```
@@ -4729,13 +4337,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
[
@@ -4752,33 +4360,25 @@ Inputs:
Response:
```json
{
- "MsgCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "MsgCid": null,
"Msg": {
"Version": 42,
"To": "f01234",
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
+ "MsgRct": null,
"GasCost": {
- "Message": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "Message": null,
"GasUsed": "0",
"BaseFeeBurn": "0",
"OverEstimationBurn": "0",
@@ -4788,95 +4388,12 @@ Response:
"TotalCost": "0"
},
"ExecutionTrace": {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": [
- {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": null
- }
- ]
+ "Msg": null,
+ "MsgRct": null,
+ "Error": "",
+ "Duration": 0,
+ "GasCharges": null,
+ "Subcalls": null
},
"Error": "string value",
"Duration": 60000000000
@@ -4913,7 +4430,8 @@ Response:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Nonce": 42,
- "Balance": "0"
+ "Balance": "0",
+ "Address": "\u003cempty\u003e"
}
}
```
@@ -4989,13 +4507,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
],
@@ -5018,33 +4536,25 @@ Response:
},
"Trace": [
{
- "MsgCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "MsgCid": null,
"Msg": {
"Version": 42,
"To": "f01234",
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
+ "MsgRct": null,
"GasCost": {
- "Message": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "Message": null,
"GasUsed": "0",
"BaseFeeBurn": "0",
"OverEstimationBurn": "0",
@@ -5054,95 +4564,12 @@ Response:
"TotalCost": "0"
},
"ExecutionTrace": {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": [
- {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": null
- }
- ]
+ "Msg": null,
+ "MsgRct": null,
+ "Error": "",
+ "Duration": 0,
+ "GasCharges": null,
+ "Subcalls": null
},
"Error": "string value",
"Duration": 60000000000
@@ -5238,10 +4665,168 @@ Response:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Nonce": 42,
- "Balance": "0"
+ "Balance": "0",
+ "Address": "\u003cempty\u003e"
}
```
+### StateGetAllocation
+StateGetAllocation returns the allocation for a given address and allocation ID.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ 0,
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response:
+```json
+{
+ "Client": 1000,
+ "Provider": 1000,
+ "Data": {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ "Size": 1032,
+ "TermMin": 0,
+ "TermMax": 0,
+ "Expiration": 10101
+}
+```
+
+### StateGetAllocationForPendingDeal
+StateGetAllocationForPendingDeal returns the allocation for a given deal ID of a pending deal.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ 5432,
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response:
+```json
+{
+ "Client": 1000,
+ "Provider": 1000,
+ "Data": {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ "Size": 1032,
+ "TermMin": 0,
+ "TermMax": 0,
+ "Expiration": 10101
+}
+```
+
+### StateGetAllocations
+StateGetAllocations returns the all the allocations for a given client.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response: `{}`
+
+### StateGetClaim
+StateGetClaim returns the claim for a given address and claim ID.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ 0,
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response:
+```json
+{
+ "Provider": 1000,
+ "Client": 1000,
+ "Data": {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ "Size": 1032,
+ "TermMin": 0,
+ "TermMax": 0,
+ "TermStart": 0,
+ "Sector": 9
+}
+```
+
+### StateGetClaims
+StateGetClaims returns the all the claims for a given provider.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response: `{}`
+
### StateGetNetworkParams
StateGetNetworkParams return current network params
@@ -5253,34 +4838,34 @@ Inputs: `null`
Response:
```json
{
- "NetworkName": "lotus",
- "BlockDelaySecs": 42,
+ "NetworkName": "",
+ "BlockDelaySecs": 0,
"ConsensusMinerMinPower": "0",
- "SupportedProofTypes": [
- 8
- ],
- "PreCommitChallengeDelay": 10101,
+ "SupportedProofTypes": null,
+ "PreCommitChallengeDelay": 0,
"ForkUpgradeParams": {
- "UpgradeSmokeHeight": 10101,
- "UpgradeBreezeHeight": 10101,
- "UpgradeIgnitionHeight": 10101,
- "UpgradeLiftoffHeight": 10101,
- "UpgradeAssemblyHeight": 10101,
- "UpgradeRefuelHeight": 10101,
- "UpgradeTapeHeight": 10101,
- "UpgradeKumquatHeight": 10101,
- "UpgradePriceListOopsHeight": 10101,
- "BreezeGasTampingDuration": 10101,
- "UpgradeCalicoHeight": 10101,
- "UpgradePersianHeight": 10101,
- "UpgradeOrangeHeight": 10101,
- "UpgradeClausHeight": 10101,
- "UpgradeTrustHeight": 10101,
- "UpgradeNorwegianHeight": 10101,
- "UpgradeTurboHeight": 10101,
- "UpgradeHyperdriveHeight": 10101,
- "UpgradeChocolateHeight": 10101,
- "UpgradeOhSnapHeight": 10101
+ "UpgradeSmokeHeight": 0,
+ "UpgradeBreezeHeight": 0,
+ "UpgradeIgnitionHeight": 0,
+ "UpgradeLiftoffHeight": 0,
+ "UpgradeAssemblyHeight": 0,
+ "UpgradeRefuelHeight": 0,
+ "UpgradeTapeHeight": 0,
+ "UpgradeKumquatHeight": 0,
+ "UpgradePriceListOopsHeight": 0,
+ "BreezeGasTampingDuration": 0,
+ "UpgradeCalicoHeight": 0,
+ "UpgradePersianHeight": 0,
+ "UpgradeOrangeHeight": 0,
+ "UpgradeClausHeight": 0,
+ "UpgradeTrustHeight": 0,
+ "UpgradeNorwegianHeight": 0,
+ "UpgradeTurboHeight": 0,
+ "UpgradeHyperdriveHeight": 0,
+ "UpgradeChocolateHeight": 0,
+ "UpgradeOhSnapHeight": 0,
+ "UpgradeSkyrHeight": 0,
+ "UpgradeSharkHeight": 0
}
}
```
@@ -5371,7 +4956,7 @@ Response:
{
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
}
```
@@ -5540,24 +5125,23 @@ Response:
{
"t026363": {
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
"Client": "f01234",
"Provider": "f01234",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"State": {
- "SectorStartEpoch": 10101,
- "LastUpdatedEpoch": 10101,
- "SlashEpoch": 10101
+ "SectorStartEpoch": 0,
+ "LastUpdatedEpoch": 0,
+ "SlashEpoch": 0,
+ "VerifiedClaim": 0
}
}
}
@@ -5618,24 +5202,23 @@ Response:
```json
{
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
"Client": "f01234",
"Provider": "f01234",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"State": {
- "SectorStartEpoch": 10101,
- "LastUpdatedEpoch": 10101,
- "SlashEpoch": 10101
+ "SectorStartEpoch": 0,
+ "LastUpdatedEpoch": 0,
+ "SlashEpoch": 0,
+ "VerifiedClaim": 0
}
}
```
@@ -5665,14 +5248,10 @@ Response:
```json
[
{
- "SectorNumber": 9,
- "SealProof": 8,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "DealIDs": [
- 5432
- ],
+ "SectorNumber": 0,
+ "SealProof": 0,
+ "SealedCID": null,
+ "DealIDs": null,
"Activation": 10101,
"Expiration": 10101,
"DealWeight": "0",
@@ -5680,9 +5259,10 @@ Response:
"InitialPledge": "0",
"ExpectedDayReward": "0",
"ExpectedStoragePledge": "0",
- "ReplacedSectorAge": 10101,
+ "ReplacedSectorAge": 0,
"ReplacedDayReward": "0",
- "SectorKeyCID": null
+ "SectorKeyCID": null,
+ "SimpleQAPower": false
}
]
```
@@ -5736,10 +5316,9 @@ Response:
[
{
"PostSubmissions": [
- 5,
- 1
+ 0
],
- "DisputableProofCount": 42
+ "DisputableProofCount": 0
}
]
```
@@ -5799,19 +5378,20 @@ Response:
{
"Owner": "f01234",
"Worker": "f01234",
- "NewWorker": "f01234",
- "ControlAddresses": [
- "f01234"
- ],
- "WorkerChangeEpoch": 10101,
- "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "NewWorker": "\u003cempty\u003e",
+ "ControlAddresses": null,
+ "WorkerChangeEpoch": 0,
+ "PeerId": null,
"Multiaddrs": [
"Ynl0ZSBhcnJheQ=="
],
- "WindowPoStProofType": 8,
- "SectorSize": 34359738368,
- "WindowPoStPartitionSectors": 42,
- "ConsensusFaultElapsed": 10101
+ "WindowPoStProofType": 0,
+ "SectorSize": 0,
+ "WindowPoStPartitionSectors": 0,
+ "ConsensusFaultElapsed": 0,
+ "Beneficiary": "f01234",
+ "BeneficiaryTerm": null,
+ "PendingBeneficiaryTerm": null
}
```
@@ -5826,20 +5406,13 @@ Inputs:
[
"f01234",
{
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "SealRandEpoch": 10101,
- "DealIDs": [
- 5432
- ],
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
+ "SealRandEpoch": 0,
+ "DealIDs": null,
"Expiration": 10101,
- "ReplaceCapacity": true,
- "ReplaceSectorDeadline": 42,
- "ReplaceSectorPartition": 42,
- "ReplaceSectorNumber": 9
+ "UnsealedCid": null
},
[
{
@@ -5881,24 +5454,19 @@ Response:
[
{
"AllSectors": [
- 5,
- 1
+ 0
],
"FaultySectors": [
- 5,
- 1
+ 0
],
"RecoveringSectors": [
- 5,
- 1
+ 0
],
"LiveSectors": [
- 5,
- 1
+ 0
],
"ActiveSectors": [
- 5,
- 1
+ 0
]
}
]
@@ -5936,7 +5504,7 @@ Response:
"RawBytePower": "0",
"QualityAdjPower": "0"
},
- "HasMinPower": true
+ "HasMinPower": false
}
```
@@ -5951,20 +5519,13 @@ Inputs:
[
"f01234",
{
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "SealRandEpoch": 10101,
- "DealIDs": [
- 5432
- ],
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
+ "SealRandEpoch": 0,
+ "DealIDs": null,
"Expiration": 10101,
- "ReplaceCapacity": true,
- "ReplaceSectorDeadline": 42,
- "ReplaceSectorPartition": 42,
- "ReplaceSectorNumber": 9
+ "UnsealedCid": null
},
[
{
@@ -6004,18 +5565,18 @@ Inputs:
Response:
```json
{
- "CurrentEpoch": 10101,
- "PeriodStart": 10101,
+ "CurrentEpoch": 0,
+ "PeriodStart": 0,
"Index": 42,
"Open": 10101,
"Close": 10101,
"Challenge": 10101,
- "FaultCutoff": 10101,
- "WPoStPeriodDeadlines": 42,
- "WPoStProvingPeriod": 10101,
- "WPoStChallengeWindow": 10101,
- "WPoStChallengeLookback": 10101,
- "FaultDeclarationCutoff": 10101
+ "FaultCutoff": 0,
+ "WPoStPeriodDeadlines": 0,
+ "WPoStProvingPeriod": 0,
+ "WPoStChallengeWindow": 0,
+ "WPoStChallengeLookback": 0,
+ "FaultDeclarationCutoff": 0
}
```
@@ -6130,14 +5691,10 @@ Response:
```json
[
{
- "SectorNumber": 9,
- "SealProof": 8,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "DealIDs": [
- 5432
- ],
+ "SectorNumber": 0,
+ "SealProof": 0,
+ "SealedCID": null,
+ "DealIDs": null,
"Activation": 10101,
"Expiration": 10101,
"DealWeight": "0",
@@ -6145,9 +5702,10 @@ Response:
"InitialPledge": "0",
"ExpectedDayReward": "0",
"ExpectedStoragePledge": "0",
- "ReplacedSectorAge": 10101,
+ "ReplacedSectorAge": 0,
"ReplacedDayReward": "0",
- "SectorKeyCID": null
+ "SectorKeyCID": null,
+ "SimpleQAPower": false
}
]
```
@@ -6182,7 +5740,7 @@ Inputs:
]
```
-Response: `16`
+Response: `18`
### StateReadState
StateReadState returns the indicated actor's state.
@@ -6258,33 +5816,25 @@ Inputs:
Response:
```json
{
- "MsgCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "MsgCid": null,
"Msg": {
"Version": 42,
"To": "f01234",
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
+ "MsgRct": null,
"GasCost": {
- "Message": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "Message": null,
"GasUsed": "0",
"BaseFeeBurn": "0",
"OverEstimationBurn": "0",
@@ -6294,95 +5844,12 @@ Response:
"TotalCost": "0"
},
"ExecutionTrace": {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": [
- {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": null
- }
- ]
+ "Msg": null,
+ "MsgRct": null,
+ "Error": "",
+ "Duration": 0,
+ "GasCharges": null,
+ "Subcalls": null
},
"Error": "string value",
"Duration": 60000000000
@@ -6427,17 +5894,10 @@ Response:
"Receipt": {
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
},
- "ReturnDec": {},
- "TipSet": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- {
- "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
- }
- ],
+ "ReturnDec": null,
+ "TipSet": [],
"Height": 10101
}
```
@@ -6481,17 +5941,10 @@ Response:
"Receipt": {
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
},
- "ReturnDec": {},
- "TipSet": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- {
- "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
- }
- ],
+ "ReturnDec": null,
+ "TipSet": [],
"Height": 10101
}
```
@@ -6521,7 +5974,7 @@ Inputs:
Response:
```json
{
- "OnTime": 10101,
+ "OnTime": 0,
"Early": 10101
}
```
@@ -6553,14 +6006,10 @@ Inputs:
Response:
```json
{
- "SectorNumber": 9,
- "SealProof": 8,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "DealIDs": [
- 5432
- ],
+ "SectorNumber": 0,
+ "SealProof": 0,
+ "SealedCID": null,
+ "DealIDs": null,
"Activation": 10101,
"Expiration": 10101,
"DealWeight": "0",
@@ -6568,9 +6017,10 @@ Response:
"InitialPledge": "0",
"ExpectedDayReward": "0",
"ExpectedStoragePledge": "0",
- "ReplacedSectorAge": 10101,
+ "ReplacedSectorAge": 0,
"ReplacedDayReward": "0",
- "SectorKeyCID": null
+ "SectorKeyCID": null,
+ "SimpleQAPower": false
}
```
@@ -6630,25 +6080,16 @@ Response:
```json
{
"Info": {
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "SealRandEpoch": 10101,
- "DealIDs": [
- 5432
- ],
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
+ "SealRandEpoch": 0,
+ "DealIDs": null,
"Expiration": 10101,
- "ReplaceCapacity": true,
- "ReplaceSectorDeadline": 42,
- "ReplaceSectorPartition": 42,
- "ReplaceSectorNumber": 9
+ "UnsealedCid": null
},
- "PreCommitDeposit": "0",
- "PreCommitEpoch": 10101,
- "DealWeight": "0",
- "VerifiedDealWeight": "0"
+ "PreCommitDeposit": "\u003cnil\u003e",
+ "PreCommitEpoch": 0
}
```
@@ -6676,12 +6117,12 @@ Inputs:
Response:
```json
{
- "FilVested": "0",
- "FilMined": "0",
- "FilBurnt": "0",
- "FilLocked": "0",
- "FilCirculating": "0",
- "FilReserveDisbursed": "0"
+ "FilVested": "\u003cnil\u003e",
+ "FilMined": "\u003cnil\u003e",
+ "FilBurnt": "\u003cnil\u003e",
+ "FilLocked": "\u003cnil\u003e",
+ "FilCirculating": "\u003cnil\u003e",
+ "FilReserveDisbursed": "\u003cnil\u003e"
}
```
@@ -6797,17 +6238,10 @@ Response:
"Receipt": {
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
},
- "ReturnDec": {},
- "TipSet": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- {
- "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
- }
- ],
+ "ReturnDec": null,
+ "TipSet": [],
"Height": 10101
}
```
@@ -6854,17 +6288,10 @@ Response:
"Receipt": {
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
},
- "ReturnDec": {},
- "TipSet": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- {
- "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
- }
- ],
+ "ReturnDec": null,
+ "TipSet": [],
"Height": 10101
}
```
@@ -6928,24 +6355,11 @@ Response:
{
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -6953,25 +6367,15 @@ Response:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
}
```
@@ -7005,27 +6409,8 @@ Inputs: `null`
Response:
```json
{
- "ActiveSyncs": [
- {
- "WorkerID": 42,
- "Base": {
- "Cids": null,
- "Blocks": null,
- "Height": 0
- },
- "Target": {
- "Cids": null,
- "Blocks": null,
- "Height": 0
- },
- "Stage": 1,
- "Height": 10101,
- "Start": "0001-01-01T00:00:00Z",
- "End": "0001-01-01T00:00:00Z",
- "Message": "string value"
- }
- ],
- "VMApplied": 42
+ "ActiveSyncs": null,
+ "VMApplied": 0
}
```
@@ -7043,24 +6428,11 @@ Inputs:
"Header": {
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -7068,37 +6440,19 @@ Inputs:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
},
- "BlsMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ],
- "SecpkMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ]
+ "BlsMessages": null,
+ "SecpkMessages": null
}
]
```
@@ -7214,7 +6568,7 @@ Response:
```json
{
"Type": "bls",
- "PrivateKey": "Ynl0ZSBhcnJheQ=="
+ "PrivateKey": null
}
```
@@ -7244,7 +6598,7 @@ Inputs:
[
{
"Type": "bls",
- "PrivateKey": "Ynl0ZSBhcnJheQ=="
+ "PrivateKey": null
}
]
```
@@ -7336,13 +6690,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -7357,13 +6711,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -7371,7 +6725,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md
index 4e9fe266c..35e63999d 100644
--- a/documentation/en/api-v1-unstable-methods.md
+++ b/documentation/en/api-v1-unstable-methods.md
@@ -164,6 +164,11 @@
* [PaychVoucherCreate](#PaychVoucherCreate)
* [PaychVoucherList](#PaychVoucherList)
* [PaychVoucherSubmit](#PaychVoucherSubmit)
+* [Raft](#Raft)
+ * [RaftLeader](#RaftLeader)
+ * [RaftState](#RaftState)
+* [Start](#Start)
+ * [StartTime](#StartTime)
* [State](#State)
* [StateAccountKey](#StateAccountKey)
* [StateActorCodeCIDs](#StateActorCodeCIDs)
@@ -178,7 +183,12 @@
* [StateDecodeParams](#StateDecodeParams)
* [StateEncodeParams](#StateEncodeParams)
* [StateGetActor](#StateGetActor)
+ * [StateGetAllocation](#StateGetAllocation)
+ * [StateGetAllocationForPendingDeal](#StateGetAllocationForPendingDeal)
+ * [StateGetAllocations](#StateGetAllocations)
* [StateGetBeaconEntry](#StateGetBeaconEntry)
+ * [StateGetClaim](#StateGetClaim)
+ * [StateGetClaims](#StateGetClaims)
* [StateGetNetworkParams](#StateGetNetworkParams)
* [StateGetRandomnessFromBeacon](#StateGetRandomnessFromBeacon)
* [StateGetRandomnessFromTickets](#StateGetRandomnessFromTickets)
@@ -304,8 +314,8 @@ Response:
```json
{
"Version": "string value",
- "APIVersion": 131840,
- "BlockDelay": 42
+ "APIVersion": 0,
+ "BlockDelay": 0
}
```
@@ -443,24 +453,11 @@ Response:
{
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -468,25 +465,15 @@ Response:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
}
```
@@ -520,49 +507,8 @@ Inputs:
Response:
```json
{
- "BlsMessages": [
- {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- }
- ],
- "SecpkMessages": [
- {
- "Message": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "Signature": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- }
- ],
+ "BlsMessages": null,
+ "SecpkMessages": null,
"Cids": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -612,13 +558,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
@@ -656,13 +602,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
}
@@ -720,13 +666,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
}
@@ -756,7 +702,7 @@ Response:
{
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
}
]
```
@@ -976,8 +922,8 @@ Inputs:
```json
[
{
- "MovingGC": true,
- "RetainState": 9
+ "MovingGC": false,
+ "RetainState": 0
}
]
```
@@ -1159,16 +1105,14 @@ Inputs: `null`
Response:
```json
{
- "TransferID": 3,
+ "TransferID": 0,
"Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
+ "BaseCID": null,
+ "IsInitiator": false,
+ "IsSender": false,
"Voucher": "string value",
"Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "OtherPeer": "",
"Transferred": 42,
"Stages": {
"Stages": [
@@ -1207,11 +1151,9 @@ Inputs:
Response:
```json
{
- "PayloadSize": 9,
- "PieceSize": 1032,
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "PayloadSize": 0,
+ "PieceSize": 0,
+ "PieceCID": null
}
```
@@ -1233,8 +1175,8 @@ Inputs:
Response:
```json
{
- "PayloadSize": 9,
- "PieceSize": 1032
+ "PayloadSize": 0,
+ "PieceSize": 0
}
```
@@ -1251,18 +1193,13 @@ Inputs:
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "DAGs": [
- {
- "DataSelector": "Links/21/Hash/Links/42/Hash",
- "ExportMerkleProof": true
- }
- ],
- "FromLocalCAR": "string value",
- "DealID": 5
+ "DAGs": null,
+ "FromLocalCAR": "",
+ "DealID": 0
},
{
"Path": "string value",
- "IsCAR": true
+ "IsCAR": false
}
]
```
@@ -1298,12 +1235,12 @@ Response:
"MinPrice": "0",
"UnsealPrice": "0",
"PricePerByte": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"Miner": "f01234",
"MinerPeer": {
- "Address": "f01234",
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "Address": "\u003cempty\u003e",
+ "ID": "",
"PieceCID": null
}
}
@@ -1321,7 +1258,7 @@ Inputs:
[
{
"Path": "string value",
- "IsCAR": true
+ "IsCAR": false
},
"string value"
]
@@ -1347,81 +1284,21 @@ Inputs:
Response:
```json
{
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ProposalCid": null,
"State": 42,
"Message": "string value",
- "DealStages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "ExpectedDuration": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- },
+ "DealStages": null,
"Provider": "f01234",
- "DataRef": {
- "TransferType": "string value",
- "Root": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
- },
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "DataRef": null,
+ "PieceCID": null,
"Size": 42,
"PricePerEpoch": "0",
"Duration": 42,
- "DealID": 5432,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
"Verified": true,
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- }
+ "TransferChannelID": null,
+ "DataTransfer": null
}
```
@@ -1451,81 +1328,21 @@ Inputs: `null`
Response:
```json
{
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ProposalCid": null,
"State": 42,
"Message": "string value",
- "DealStages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "ExpectedDuration": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- },
+ "DealStages": null,
"Provider": "f01234",
- "DataRef": {
- "TransferType": "string value",
- "Root": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
- },
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "DataRef": null,
+ "PieceCID": null,
"Size": 42,
- "PricePerEpoch": "0",
+ "PricePerEpoch": "\u003cnil\u003e",
"Duration": 42,
- "DealID": 5432,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
"Verified": true,
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- }
+ "TransferChannelID": null,
+ "DataTransfer": null
}
```
@@ -1540,53 +1357,19 @@ Inputs: `null`
Response:
```json
{
- "PayloadCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ID": 5,
+ "PayloadCID": null,
+ "ID": 0,
"PieceCID": null,
- "PricePerByte": "0",
- "UnsealPrice": "0",
+ "PricePerByte": "\u003cnil\u003e",
+ "UnsealPrice": "\u003cnil\u003e",
"Status": 0,
"Message": "string value",
"Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "BytesReceived": 42,
- "BytesPaidFor": 42,
- "TotalPaid": "0",
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- },
+ "BytesReceived": 0,
+ "BytesPaidFor": 0,
+ "TotalPaid": "\u003cnil\u003e",
+ "TransferChannelID": null,
+ "DataTransfer": null,
"Event": 5
}
```
@@ -1619,7 +1402,7 @@ Inputs:
[
{
"Path": "string value",
- "IsCAR": true
+ "IsCAR": false
}
]
```
@@ -1630,7 +1413,7 @@ Response:
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "ImportID": 50
+ "ImportID": 0
}
```
@@ -1646,16 +1429,14 @@ Response:
```json
[
{
- "TransferID": 3,
+ "TransferID": 0,
"Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
+ "BaseCID": null,
+ "IsInitiator": false,
+ "IsSender": false,
"Voucher": "string value",
"Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "OtherPeer": "",
"Transferred": 42,
"Stages": {
"Stages": [
@@ -1689,81 +1470,21 @@ Response:
```json
[
{
- "ProposalCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ProposalCid": null,
"State": 42,
"Message": "string value",
- "DealStages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "ExpectedDuration": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- },
+ "DealStages": null,
"Provider": "f01234",
- "DataRef": {
- "TransferType": "string value",
- "Root": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
- },
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "DataRef": null,
+ "PieceCID": null,
"Size": 42,
"PricePerEpoch": "0",
"Duration": 42,
- "DealID": 5432,
+ "DealID": 0,
"CreationTime": "0001-01-01T00:00:00Z",
"Verified": true,
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- }
+ "TransferChannelID": null,
+ "DataTransfer": null
}
]
```
@@ -1784,8 +1505,8 @@ Response:
"Err": "string value",
"Root": null,
"Source": "string value",
- "FilePath": "string value",
- "CARPath": "string value"
+ "FilePath": "",
+ "CARPath": ""
}
]
```
@@ -1802,53 +1523,19 @@ Response:
```json
[
{
- "PayloadCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ID": 5,
+ "PayloadCID": null,
+ "ID": 0,
"PieceCID": null,
"PricePerByte": "0",
"UnsealPrice": "0",
"Status": 0,
"Message": "string value",
"Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "BytesReceived": 42,
- "BytesPaidFor": 42,
+ "BytesReceived": 0,
+ "BytesPaidFor": 0,
"TotalPaid": "0",
- "TransferChannelID": {
- "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "ID": 3
- },
- "DataTransfer": {
- "TransferID": 3,
- "Status": 1,
- "BaseCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "IsInitiator": true,
- "IsSender": true,
- "Voucher": "string value",
- "Message": "string value",
- "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "Transferred": 42,
- "Stages": {
- "Stages": [
- {
- "Name": "string value",
- "Description": "string value",
- "CreatedTime": "0001-01-01T00:00:00Z",
- "UpdatedTime": "0001-01-01T00:00:00Z",
- "Logs": [
- {
- "Log": "string value",
- "UpdatedTime": "0001-01-01T00:00:00Z"
- }
- ]
- }
- ]
- }
- },
+ "TransferChannelID": null,
+ "DataTransfer": null,
"Event": 5
}
]
@@ -1880,15 +1567,15 @@ Response:
},
"Piece": null,
"Size": 42,
- "MinPrice": "0",
- "UnsealPrice": "0",
- "PricePerByte": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "MinPrice": "\u003cnil\u003e",
+ "UnsealPrice": "\u003cnil\u003e",
+ "PricePerByte": "\u003cnil\u003e",
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"Miner": "f01234",
"MinerPeer": {
- "Address": "f01234",
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "Address": "\u003cempty\u003e",
+ "ID": "",
"PieceCID": null
}
}
@@ -1914,16 +1601,14 @@ Response:
"Response": {
"Price": "0",
"VerifiedPrice": "0",
- "MinPieceSize": 1032,
- "MaxPieceSize": 1032,
+ "MinPieceSize": 0,
+ "MaxPieceSize": 0,
"Miner": "f01234",
"Timestamp": 10101,
"Expiry": 10101,
- "SeqNo": 42
+ "SeqNo": 0
},
- "DealProtocols": [
- "string value"
- ]
+ "DealProtocols": null
}
```
@@ -1973,19 +1658,15 @@ Inputs:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Piece": null,
- "DataSelector": "Links/21/Hash/Links/42/Hash",
+ "DataSelector": null,
"Size": 42,
"Total": "0",
- "UnsealPrice": "0",
- "PaymentInterval": 42,
- "PaymentIntervalIncrease": 42,
+ "UnsealPrice": "\u003cnil\u003e",
+ "PaymentInterval": 0,
+ "PaymentIntervalIncrease": 0,
"Client": "f01234",
"Miner": "f01234",
- "MinerPeer": {
- "Address": "f01234",
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
- "PieceCID": null
- }
+ "MinerPeer": null
}
]
```
@@ -1993,7 +1674,7 @@ Inputs:
Response:
```json
{
- "DealID": 5
+ "DealID": 0
}
```
@@ -2039,22 +1720,22 @@ Inputs:
[
{
"Data": {
- "TransferType": "string value",
+ "TransferType": "",
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
+ "PieceSize": 0,
+ "RawBlockSize": 0
},
"Wallet": "f01234",
"Miner": "f01234",
"EpochPrice": "0",
- "MinBlocksDuration": 42,
+ "MinBlocksDuration": 0,
"ProviderCollateral": "0",
- "DealStartEpoch": 10101,
- "FastRetrieval": true,
- "VerifiedDeal": true
+ "DealStartEpoch": 0,
+ "FastRetrieval": false,
+ "VerifiedDeal": false
}
]
```
@@ -2072,22 +1753,22 @@ Inputs:
[
{
"Data": {
- "TransferType": "string value",
+ "TransferType": "",
"Root": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"PieceCid": null,
- "PieceSize": 1024,
- "RawBlockSize": 42
+ "PieceSize": 0,
+ "RawBlockSize": 0
},
"Wallet": "f01234",
"Miner": "f01234",
"EpochPrice": "0",
- "MinBlocksDuration": 42,
+ "MinBlocksDuration": 0,
"ProviderCollateral": "0",
- "DealStartEpoch": 10101,
- "FastRetrieval": true,
- "VerifiedDeal": true
+ "DealStartEpoch": 0,
+ "FastRetrieval": false,
+ "VerifiedDeal": false
}
]
```
@@ -2133,13 +1814,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
9,
@@ -2172,13 +1853,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
[
@@ -2235,18 +1916,18 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
{
"MaxFee": "0",
- "MsgUuid": "07070707-0707-0707-0707-070707070707"
+ "MsgUuid": "00000000-0000-0000-0000-000000000000"
},
[
{
@@ -2267,13 +1948,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
@@ -2309,16 +1990,8 @@ Response:
"Subsystem": "string value"
},
"Active": true,
- "LastActive": {
- "Type": "string value",
- "Message": "json raw message",
- "Time": "0001-01-01T00:00:00Z"
- },
- "LastResolved": {
- "Type": "string value",
- "Message": "json raw message",
- "Time": "0001-01-01T00:00:00Z"
- }
+ "LastActive": null,
+ "LastResolved": null
}
]
```
@@ -2474,18 +2147,13 @@ Inputs:
}
],
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
"Eproof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "WinCount": 0,
+ "VRFProof": null
},
- "BeaconValues": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "BeaconValues": null,
"Messages": [
{
"Message": {
@@ -2494,13 +2162,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2508,18 +2176,13 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
],
"Epoch": 10101,
"Timestamp": 42,
- "WinningPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ]
+ "WinningPoStProof": null
}
]
```
@@ -2530,24 +2193,11 @@ Response:
"Header": {
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -2555,37 +2205,19 @@ Response:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
},
- "BlsMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ],
- "SecpkMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ]
+ "BlsMessages": null,
+ "SecpkMessages": null
}
```
@@ -2617,27 +2249,20 @@ Response:
"NetworkPower": "0",
"Sectors": [
{
- "SealProof": 8,
- "SectorNumber": 9,
+ "SealProof": 0,
+ "SectorNumber": 0,
"SectorKey": null,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "SealedCID": null
}
],
- "WorkerKey": "f01234",
- "SectorSize": 34359738368,
+ "WorkerKey": "\u003cempty\u003e",
+ "SectorSize": 0,
"PrevBeaconEntry": {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
+ "Round": 0,
+ "Data": null
},
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "EligibleForMining": true
+ "BeaconEntries": null,
+ "EligibleForMining": false
}
```
@@ -2663,13 +2288,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2677,7 +2302,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2709,19 +2334,19 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
],
{
"MaxFee": "0",
- "MsgUuid": "07070707-0707-0707-0707-070707070707"
+ "MsgUuid": "00000000-0000-0000-0000-000000000000"
}
]
```
@@ -2736,13 +2361,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2750,7 +2375,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2773,13 +2398,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -2787,7 +2412,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2820,16 +2445,16 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
]
]
@@ -2844,11 +2469,9 @@ Response:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Code": 0,
- "OK": true,
- "Err": "string value",
- "Hint": {
- "abc": 123
- }
+ "OK": false,
+ "Err": "",
+ "Hint": null
}
]
]
@@ -2876,11 +2499,9 @@ Response:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Code": 0,
- "OK": true,
- "Err": "string value",
- "Hint": {
- "abc": 123
- }
+ "OK": false,
+ "Err": "",
+ "Hint": null
}
]
]
@@ -2902,13 +2523,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -2924,11 +2545,9 @@ Response:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Code": 0,
- "OK": true,
- "Err": "string value",
- "Hint": {
- "abc": 123
- }
+ "OK": false,
+ "Err": "",
+ "Hint": null
}
]
]
@@ -2960,14 +2579,12 @@ Inputs: `null`
Response:
```json
{
- "PriorityAddrs": [
- "f01234"
- ],
- "SizeLimitHigh": 123,
- "SizeLimitLow": 123,
- "ReplaceByFeeRatio": 12.3,
- "PruneCooldown": 60000000000,
- "GasLimitOverestimation": 12.3
+ "PriorityAddrs": null,
+ "SizeLimitHigh": 0,
+ "SizeLimitLow": 0,
+ "ReplaceByFeeRatio": 0,
+ "PruneCooldown": 0,
+ "GasLimitOverestimation": 0
}
```
@@ -3017,13 +2634,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3031,7 +2648,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -3053,13 +2670,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3067,7 +2684,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -3100,18 +2717,18 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
{
"MaxFee": "0",
- "MsgUuid": "07070707-0707-0707-0707-070707070707"
+ "MsgUuid": "00000000-0000-0000-0000-000000000000"
}
]
```
@@ -3125,13 +2742,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3139,7 +2756,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
@@ -3160,13 +2777,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3174,7 +2791,7 @@ Inputs:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -3218,13 +2835,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3232,7 +2849,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -3248,14 +2865,12 @@ Inputs:
```json
[
{
- "PriorityAddrs": [
- "f01234"
- ],
- "SizeLimitHigh": 123,
- "SizeLimitLow": 123,
- "ReplaceByFeeRatio": 12.3,
- "PruneCooldown": 60000000000,
- "GasLimitOverestimation": 12.3
+ "PriorityAddrs": null,
+ "SizeLimitHigh": 0,
+ "SizeLimitLow": 0,
+ "ReplaceByFeeRatio": 0,
+ "PruneCooldown": 0,
+ "GasLimitOverestimation": 0
}
]
```
@@ -3280,13 +2895,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -3294,7 +2909,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
}
@@ -3334,16 +2949,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3375,16 +2990,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3415,16 +3030,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3453,16 +3068,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3500,16 +3115,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3538,16 +3153,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3581,16 +3196,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3625,16 +3240,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3688,7 +3303,7 @@ Response:
```json
[
{
- "ID": 9,
+ "ID": 0,
"To": "f01234",
"Value": "0",
"Method": 1,
@@ -3756,9 +3371,9 @@ Inputs:
Response:
```json
{
- "InitialBalance": "0",
- "StartEpoch": 10101,
- "UnlockDuration": 10101
+ "InitialBalance": "\u003cnil\u003e",
+ "StartEpoch": 0,
+ "UnlockDuration": 0
}
```
@@ -3791,16 +3406,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3833,16 +3448,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3875,16 +3490,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3916,16 +3531,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3956,16 +3571,16 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "ValidNonce": true
+ "ValidNonce": false
}
```
@@ -3982,7 +3597,7 @@ Inputs: `null`
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -4014,7 +3629,7 @@ Response:
```json
{
"Reachability": 1,
- "PublicAddr": "string value"
+ "PublicAddr": ""
}
```
@@ -4028,10 +3643,10 @@ Inputs: `null`
Response:
```json
{
- "TotalIn": 9,
- "TotalOut": 9,
- "RateIn": 12.3,
- "RateOut": 12.3
+ "TotalIn": 0,
+ "TotalOut": 0,
+ "RateIn": 0,
+ "RateOut": 0
}
```
@@ -4085,12 +3700,8 @@ Inputs:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
]
```
@@ -4110,12 +3721,8 @@ Response:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
```
@@ -4131,12 +3738,8 @@ Inputs:
"Peers": [
"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"
],
- "IPAddrs": [
- "string value"
- ],
- "IPSubnets": [
- "string value"
- ]
+ "IPAddrs": null,
+ "IPSubnets": null
}
]
```
@@ -4152,7 +3755,7 @@ Inputs:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -4205,7 +3808,7 @@ Inputs:
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -4253,7 +3856,7 @@ Inputs:
Response:
```json
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Agent": "string value",
"Addrs": [
"string value"
@@ -4261,16 +3864,7 @@ Response:
"Protocols": [
"string value"
],
- "ConnMgrMeta": {
- "FirstSeen": "0001-01-01T00:00:00Z",
- "Value": 123,
- "Tags": {
- "name": 42
- },
- "Conns": {
- "name": "2021-03-08T22:52:18Z"
- }
- }
+ "ConnMgrMeta": null
}
```
@@ -4285,7 +3879,7 @@ Response:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Addrs": [
"/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior"
]
@@ -4364,7 +3958,7 @@ Response:
```json
[
{
- "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "ID": "",
"Score": {
"Score": 12.3,
"Topics": {
@@ -4375,9 +3969,9 @@ Response:
"InvalidMessageDeliveries": 3
}
},
- "AppSpecificScore": 12.3,
- "IPColocationFactor": 12.3,
- "BehaviourPenalty": 12.3
+ "AppSpecificScore": 0,
+ "IPColocationFactor": 0,
+ "BehaviourPenalty": 0
}
}
]
@@ -4423,19 +4017,19 @@ Response:
```json
{
"System": {
- "NumStreamsInbound": 123,
- "NumStreamsOutbound": 123,
- "NumConnsInbound": 123,
- "NumConnsOutbound": 123,
- "NumFD": 123,
+ "NumStreamsInbound": 0,
+ "NumStreamsOutbound": 0,
+ "NumConnsInbound": 0,
+ "NumConnsOutbound": 0,
+ "NumFD": 0,
"Memory": 9
},
"Transient": {
- "NumStreamsInbound": 123,
- "NumStreamsOutbound": 123,
- "NumConnsInbound": 123,
- "NumConnsOutbound": 123,
- "NumFD": 123,
+ "NumStreamsInbound": 0,
+ "NumStreamsOutbound": 0,
+ "NumConnsInbound": 0,
+ "NumConnsOutbound": 0,
+ "NumFD": 0,
"Memory": 9
},
"Services": {
@@ -4491,16 +4085,16 @@ Response:
```json
{
"SyncStatus": {
- "Epoch": 42,
- "Behind": 42
+ "Epoch": 0,
+ "Behind": 0
},
"PeerStatus": {
- "PeersToPublishMsgs": 123,
- "PeersToPublishBlocks": 123
+ "PeersToPublishMsgs": 0,
+ "PeersToPublishBlocks": 0
},
"ChainStatus": {
- "BlocksPerTipsetLast100": 12.3,
- "BlocksPerTipsetLastFinality": 12.3
+ "BlocksPerTipsetLast100": 0,
+ "BlocksPerTipsetLastFinality": 0
}
}
```
@@ -4619,9 +4213,7 @@ Response:
```json
{
"Channel": "f01234",
- "WaitSentinel": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "WaitSentinel": null
}
```
@@ -4644,7 +4236,7 @@ Inputs:
"f01234",
"0",
{
- "OffChain": true
+ "OffChain": false
}
]
```
@@ -4653,9 +4245,7 @@ Response:
```json
{
"Channel": "f01234",
- "WaitSentinel": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
+ "WaitSentinel": null
}
```
@@ -4702,9 +4292,9 @@ Inputs:
[
{
"Amount": "0",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "MinSettle": 10101,
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "MinSettle": 0,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4719,15 +4309,13 @@ Response:
```json
{
"Channel": "f01234",
- "WaitSentinel": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "WaitSentinel": null,
"Vouchers": [
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4736,7 +4324,7 @@ Response:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4786,7 +4374,7 @@ Inputs:
Response:
```json
{
- "ControlAddr": "f01234",
+ "ControlAddr": "\u003cempty\u003e",
"Direction": 1
}
```
@@ -4801,10 +4389,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4813,7 +4401,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4842,10 +4430,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4854,7 +4442,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4883,10 +4471,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4895,7 +4483,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4930,10 +4518,10 @@ Response:
```json
{
"Voucher": {
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4942,7 +4530,7 @@ Response:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -4974,10 +4562,10 @@ Response:
```json
[
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -4986,7 +4574,7 @@ Response:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -5011,10 +4599,10 @@ Inputs:
[
"f01234",
{
- "ChannelAddr": "f01234",
- "TimeLockMin": 10101,
- "TimeLockMax": 10101,
- "SecretHash": "Ynl0ZSBhcnJheQ==",
+ "ChannelAddr": "\u003cempty\u003e",
+ "TimeLockMin": 0,
+ "TimeLockMax": 0,
+ "SecretHash": null,
"Extra": {
"Actor": "f01234",
"Method": 1,
@@ -5023,7 +4611,7 @@ Inputs:
"Lane": 42,
"Nonce": 42,
"Amount": "0",
- "MinSettleHeight": 10101,
+ "MinSettleHeight": 0,
"Merges": [
{
"Lane": 42,
@@ -5047,6 +4635,45 @@ Response:
}
```
+## Raft
+
+
+### RaftLeader
+
+
+Perms: read
+
+Inputs: `null`
+
+Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"`
+
+### RaftState
+
+
+Perms: read
+
+Inputs: `null`
+
+Response:
+```json
+{
+ "NonceMap": {},
+ "MsgUuids": {}
+}
+```
+
+## Start
+
+
+### StartTime
+
+
+Perms: read
+
+Inputs: `null`
+
+Response: `"0001-01-01T00:00:00Z"`
+
## State
The State methods are used to query, inspect, and interact with chain state.
Most methods take a TipSetKey as a parameter. The state looked up is the parent state of the tipset.
@@ -5085,7 +4712,7 @@ Perms: read
Inputs:
```json
[
- 16
+ 18
]
```
@@ -5100,7 +4727,7 @@ Perms: read
Inputs:
```json
[
- 16
+ 18
]
```
@@ -5161,13 +4788,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
[
@@ -5184,33 +4811,25 @@ Inputs:
Response:
```json
{
- "MsgCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "MsgCid": null,
"Msg": {
"Version": 42,
"To": "f01234",
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
+ "MsgRct": null,
"GasCost": {
- "Message": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "Message": null,
"GasUsed": "0",
"BaseFeeBurn": "0",
"OverEstimationBurn": "0",
@@ -5220,95 +4839,12 @@ Response:
"TotalCost": "0"
},
"ExecutionTrace": {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": [
- {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": null
- }
- ]
+ "Msg": null,
+ "MsgRct": null,
+ "Error": "",
+ "Duration": 0,
+ "GasCharges": null,
+ "Subcalls": null
},
"Error": "string value",
"Duration": 60000000000
@@ -5345,7 +4881,8 @@ Response:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Nonce": 42,
- "Balance": "0"
+ "Balance": "0",
+ "Address": "\u003cempty\u003e"
}
}
```
@@ -5421,13 +4958,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
],
@@ -5450,33 +4987,25 @@ Response:
},
"Trace": [
{
- "MsgCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "MsgCid": null,
"Msg": {
"Version": 42,
"To": "f01234",
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
+ "MsgRct": null,
"GasCost": {
- "Message": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "Message": null,
"GasUsed": "0",
"BaseFeeBurn": "0",
"OverEstimationBurn": "0",
@@ -5486,95 +5015,12 @@ Response:
"TotalCost": "0"
},
"ExecutionTrace": {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": [
- {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": null
- }
- ]
+ "Msg": null,
+ "MsgRct": null,
+ "Error": "",
+ "Duration": 0,
+ "GasCharges": null,
+ "Subcalls": null
},
"Error": "string value",
"Duration": 60000000000
@@ -5721,10 +5167,108 @@ Response:
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
"Nonce": 42,
- "Balance": "0"
+ "Balance": "0",
+ "Address": "\u003cempty\u003e"
}
```
+### StateGetAllocation
+StateGetAllocation returns the allocation for a given address and allocation ID.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ 0,
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response:
+```json
+{
+ "Client": 1000,
+ "Provider": 1000,
+ "Data": {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ "Size": 1032,
+ "TermMin": 0,
+ "TermMax": 0,
+ "Expiration": 10101
+}
+```
+
+### StateGetAllocationForPendingDeal
+StateGetAllocationForPendingDeal returns the allocation for a given deal ID of a pending deal. Returns nil if
+pending allocation is not found.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ 5432,
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response:
+```json
+{
+ "Client": 1000,
+ "Provider": 1000,
+ "Data": {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ "Size": 1032,
+ "TermMin": 0,
+ "TermMax": 0,
+ "Expiration": 10101
+}
+```
+
+### StateGetAllocations
+StateGetAllocations returns the all the allocations for a given client.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response: `{}`
+
### StateGetBeaconEntry
StateGetBeaconEntry returns the beacon entry for the given filecoin epoch. If
the entry has not yet been produced, the call will block until the entry
@@ -5748,6 +5292,67 @@ Response:
}
```
+### StateGetClaim
+StateGetClaim returns the claim for a given address and claim ID.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ 0,
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response:
+```json
+{
+ "Provider": 1000,
+ "Client": 1000,
+ "Data": {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ "Size": 1032,
+ "TermMin": 0,
+ "TermMax": 0,
+ "TermStart": 0,
+ "Sector": 9
+}
+```
+
+### StateGetClaims
+StateGetClaims returns the all the claims for a given provider.
+
+
+Perms: read
+
+Inputs:
+```json
+[
+ "f01234",
+ [
+ {
+ "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
+ },
+ {
+ "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
+ }
+ ]
+]
+```
+
+Response: `{}`
+
### StateGetNetworkParams
StateGetNetworkParams return current network params
@@ -5759,34 +5364,34 @@ Inputs: `null`
Response:
```json
{
- "NetworkName": "lotus",
- "BlockDelaySecs": 42,
+ "NetworkName": "",
+ "BlockDelaySecs": 0,
"ConsensusMinerMinPower": "0",
- "SupportedProofTypes": [
- 8
- ],
- "PreCommitChallengeDelay": 10101,
+ "SupportedProofTypes": null,
+ "PreCommitChallengeDelay": 0,
"ForkUpgradeParams": {
- "UpgradeSmokeHeight": 10101,
- "UpgradeBreezeHeight": 10101,
- "UpgradeIgnitionHeight": 10101,
- "UpgradeLiftoffHeight": 10101,
- "UpgradeAssemblyHeight": 10101,
- "UpgradeRefuelHeight": 10101,
- "UpgradeTapeHeight": 10101,
- "UpgradeKumquatHeight": 10101,
- "UpgradePriceListOopsHeight": 10101,
- "BreezeGasTampingDuration": 10101,
- "UpgradeCalicoHeight": 10101,
- "UpgradePersianHeight": 10101,
- "UpgradeOrangeHeight": 10101,
- "UpgradeClausHeight": 10101,
- "UpgradeTrustHeight": 10101,
- "UpgradeNorwegianHeight": 10101,
- "UpgradeTurboHeight": 10101,
- "UpgradeHyperdriveHeight": 10101,
- "UpgradeChocolateHeight": 10101,
- "UpgradeOhSnapHeight": 10101
+ "UpgradeSmokeHeight": 0,
+ "UpgradeBreezeHeight": 0,
+ "UpgradeIgnitionHeight": 0,
+ "UpgradeLiftoffHeight": 0,
+ "UpgradeAssemblyHeight": 0,
+ "UpgradeRefuelHeight": 0,
+ "UpgradeTapeHeight": 0,
+ "UpgradeKumquatHeight": 0,
+ "UpgradePriceListOopsHeight": 0,
+ "BreezeGasTampingDuration": 0,
+ "UpgradeCalicoHeight": 0,
+ "UpgradePersianHeight": 0,
+ "UpgradeOrangeHeight": 0,
+ "UpgradeClausHeight": 0,
+ "UpgradeTrustHeight": 0,
+ "UpgradeNorwegianHeight": 0,
+ "UpgradeTurboHeight": 0,
+ "UpgradeHyperdriveHeight": 0,
+ "UpgradeChocolateHeight": 0,
+ "UpgradeOhSnapHeight": 0,
+ "UpgradeSkyrHeight": 0,
+ "UpgradeSharkHeight": 0
}
}
```
@@ -6029,24 +5634,23 @@ Response:
{
"t026363": {
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
"Client": "f01234",
"Provider": "f01234",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"State": {
- "SectorStartEpoch": 10101,
- "LastUpdatedEpoch": 10101,
- "SlashEpoch": 10101
+ "SectorStartEpoch": 0,
+ "LastUpdatedEpoch": 0,
+ "SlashEpoch": 0,
+ "VerifiedClaim": 0
}
}
}
@@ -6107,24 +5711,23 @@ Response:
```json
{
"Proposal": {
- "PieceCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "PieceSize": 1032,
- "VerifiedDeal": true,
+ "PieceCID": null,
+ "PieceSize": 0,
+ "VerifiedDeal": false,
"Client": "f01234",
"Provider": "f01234",
"Label": "",
- "StartEpoch": 10101,
- "EndEpoch": 10101,
+ "StartEpoch": 0,
+ "EndEpoch": 0,
"StoragePricePerEpoch": "0",
"ProviderCollateral": "0",
"ClientCollateral": "0"
},
"State": {
- "SectorStartEpoch": 10101,
- "LastUpdatedEpoch": 10101,
- "SlashEpoch": 10101
+ "SectorStartEpoch": 0,
+ "LastUpdatedEpoch": 0,
+ "SlashEpoch": 0,
+ "VerifiedClaim": 0
}
}
```
@@ -6154,14 +5757,10 @@ Response:
```json
[
{
- "SectorNumber": 9,
- "SealProof": 8,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "DealIDs": [
- 5432
- ],
+ "SectorNumber": 0,
+ "SealProof": 0,
+ "SealedCID": null,
+ "DealIDs": null,
"Activation": 10101,
"Expiration": 10101,
"DealWeight": "0",
@@ -6169,9 +5768,10 @@ Response:
"InitialPledge": "0",
"ExpectedDayReward": "0",
"ExpectedStoragePledge": "0",
- "ReplacedSectorAge": 10101,
+ "ReplacedSectorAge": 0,
"ReplacedDayReward": "0",
- "SectorKeyCID": null
+ "SectorKeyCID": null,
+ "SimpleQAPower": false
}
]
```
@@ -6253,10 +5853,9 @@ Response:
[
{
"PostSubmissions": [
- 5,
- 1
+ 0
],
- "DisputableProofCount": 42
+ "DisputableProofCount": 0
}
]
```
@@ -6316,19 +5915,20 @@ Response:
{
"Owner": "f01234",
"Worker": "f01234",
- "NewWorker": "f01234",
- "ControlAddresses": [
- "f01234"
- ],
- "WorkerChangeEpoch": 10101,
- "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf",
+ "NewWorker": "\u003cempty\u003e",
+ "ControlAddresses": null,
+ "WorkerChangeEpoch": 0,
+ "PeerId": null,
"Multiaddrs": [
"Ynl0ZSBhcnJheQ=="
],
- "WindowPoStProofType": 8,
- "SectorSize": 34359738368,
- "WindowPoStPartitionSectors": 42,
- "ConsensusFaultElapsed": 10101
+ "WindowPoStProofType": 0,
+ "SectorSize": 0,
+ "WindowPoStPartitionSectors": 0,
+ "ConsensusFaultElapsed": 0,
+ "Beneficiary": "f01234",
+ "BeneficiaryTerm": null,
+ "PendingBeneficiaryTerm": null
}
```
@@ -6343,20 +5943,13 @@ Inputs:
[
"f01234",
{
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "SealRandEpoch": 10101,
- "DealIDs": [
- 5432
- ],
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
+ "SealRandEpoch": 0,
+ "DealIDs": null,
"Expiration": 10101,
- "ReplaceCapacity": true,
- "ReplaceSectorDeadline": 42,
- "ReplaceSectorPartition": 42,
- "ReplaceSectorNumber": 9
+ "UnsealedCid": null
},
[
{
@@ -6398,24 +5991,19 @@ Response:
[
{
"AllSectors": [
- 5,
- 1
+ 0
],
"FaultySectors": [
- 5,
- 1
+ 0
],
"RecoveringSectors": [
- 5,
- 1
+ 0
],
"LiveSectors": [
- 5,
- 1
+ 0
],
"ActiveSectors": [
- 5,
- 1
+ 0
]
}
]
@@ -6453,7 +6041,7 @@ Response:
"RawBytePower": "0",
"QualityAdjPower": "0"
},
- "HasMinPower": true
+ "HasMinPower": false
}
```
@@ -6468,20 +6056,13 @@ Inputs:
[
"f01234",
{
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "SealRandEpoch": 10101,
- "DealIDs": [
- 5432
- ],
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
+ "SealRandEpoch": 0,
+ "DealIDs": null,
"Expiration": 10101,
- "ReplaceCapacity": true,
- "ReplaceSectorDeadline": 42,
- "ReplaceSectorPartition": 42,
- "ReplaceSectorNumber": 9
+ "UnsealedCid": null
},
[
{
@@ -6521,18 +6102,18 @@ Inputs:
Response:
```json
{
- "CurrentEpoch": 10101,
- "PeriodStart": 10101,
+ "CurrentEpoch": 0,
+ "PeriodStart": 0,
"Index": 42,
"Open": 10101,
"Close": 10101,
"Challenge": 10101,
- "FaultCutoff": 10101,
- "WPoStPeriodDeadlines": 42,
- "WPoStProvingPeriod": 10101,
- "WPoStChallengeWindow": 10101,
- "WPoStChallengeLookback": 10101,
- "FaultDeclarationCutoff": 10101
+ "FaultCutoff": 0,
+ "WPoStPeriodDeadlines": 0,
+ "WPoStProvingPeriod": 0,
+ "WPoStChallengeWindow": 0,
+ "WPoStChallengeLookback": 0,
+ "FaultDeclarationCutoff": 0
}
```
@@ -6647,14 +6228,10 @@ Response:
```json
[
{
- "SectorNumber": 9,
- "SealProof": 8,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "DealIDs": [
- 5432
- ],
+ "SectorNumber": 0,
+ "SealProof": 0,
+ "SealedCID": null,
+ "DealIDs": null,
"Activation": 10101,
"Expiration": 10101,
"DealWeight": "0",
@@ -6662,9 +6239,10 @@ Response:
"InitialPledge": "0",
"ExpectedDayReward": "0",
"ExpectedStoragePledge": "0",
- "ReplacedSectorAge": 10101,
+ "ReplacedSectorAge": 0,
"ReplacedDayReward": "0",
- "SectorKeyCID": null
+ "SectorKeyCID": null,
+ "SimpleQAPower": false
}
]
```
@@ -6699,7 +6277,7 @@ Inputs:
]
```
-Response: `16`
+Response: `18`
### StateReadState
StateReadState returns the indicated actor's state.
@@ -6775,33 +6353,25 @@ Inputs:
Response:
```json
{
- "MsgCid": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "MsgCid": null,
"Msg": {
"Version": 42,
"To": "f01234",
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
+ "MsgRct": null,
"GasCost": {
- "Message": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "Message": null,
"GasUsed": "0",
"BaseFeeBurn": "0",
"OverEstimationBurn": "0",
@@ -6811,95 +6381,12 @@ Response:
"TotalCost": "0"
},
"ExecutionTrace": {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": [
- {
- "Msg": {
- "Version": 42,
- "To": "f01234",
- "From": "f01234",
- "Nonce": 42,
- "Value": "0",
- "GasLimit": 9,
- "GasFeeCap": "0",
- "GasPremium": "0",
- "Method": 1,
- "Params": "Ynl0ZSBhcnJheQ==",
- "CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
- }
- },
- "MsgRct": {
- "ExitCode": 0,
- "Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
- },
- "Error": "string value",
- "Duration": 60000000000,
- "GasCharges": [
- {
- "Name": "string value",
- "loc": [
- {
- "File": "string value",
- "Line": 123,
- "Function": "string value"
- }
- ],
- "tg": 9,
- "cg": 9,
- "sg": 9,
- "vtg": 9,
- "vcg": 9,
- "vsg": 9,
- "tt": 60000000000,
- "ex": {}
- }
- ],
- "Subcalls": null
- }
- ]
+ "Msg": null,
+ "MsgRct": null,
+ "Error": "",
+ "Duration": 0,
+ "GasCharges": null,
+ "Subcalls": null
},
"Error": "string value",
"Duration": 60000000000
@@ -6955,17 +6442,10 @@ Response:
"Receipt": {
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
},
- "ReturnDec": {},
- "TipSet": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- {
- "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
- }
- ],
+ "ReturnDec": null,
+ "TipSet": [],
"Height": 10101
}
```
@@ -6995,7 +6475,7 @@ Inputs:
Response:
```json
{
- "OnTime": 10101,
+ "OnTime": 0,
"Early": 10101
}
```
@@ -7027,14 +6507,10 @@ Inputs:
Response:
```json
{
- "SectorNumber": 9,
- "SealProof": 8,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "DealIDs": [
- 5432
- ],
+ "SectorNumber": 0,
+ "SealProof": 0,
+ "SealedCID": null,
+ "DealIDs": null,
"Activation": 10101,
"Expiration": 10101,
"DealWeight": "0",
@@ -7042,9 +6518,10 @@ Response:
"InitialPledge": "0",
"ExpectedDayReward": "0",
"ExpectedStoragePledge": "0",
- "ReplacedSectorAge": 10101,
+ "ReplacedSectorAge": 0,
"ReplacedDayReward": "0",
- "SectorKeyCID": null
+ "SectorKeyCID": null,
+ "SimpleQAPower": false
}
```
@@ -7109,25 +6586,16 @@ Response:
```json
{
"Info": {
- "SealProof": 8,
- "SectorNumber": 9,
- "SealedCID": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "SealRandEpoch": 10101,
- "DealIDs": [
- 5432
- ],
+ "SealProof": 0,
+ "SectorNumber": 0,
+ "SealedCID": null,
+ "SealRandEpoch": 0,
+ "DealIDs": null,
"Expiration": 10101,
- "ReplaceCapacity": true,
- "ReplaceSectorDeadline": 42,
- "ReplaceSectorPartition": 42,
- "ReplaceSectorNumber": 9
+ "UnsealedCid": null
},
"PreCommitDeposit": "0",
- "PreCommitEpoch": 10101,
- "DealWeight": "0",
- "VerifiedDealWeight": "0"
+ "PreCommitEpoch": 0
}
```
@@ -7155,12 +6623,12 @@ Inputs:
Response:
```json
{
- "FilVested": "0",
- "FilMined": "0",
- "FilBurnt": "0",
- "FilLocked": "0",
- "FilCirculating": "0",
- "FilReserveDisbursed": "0"
+ "FilVested": "\u003cnil\u003e",
+ "FilMined": "\u003cnil\u003e",
+ "FilBurnt": "\u003cnil\u003e",
+ "FilLocked": "\u003cnil\u003e",
+ "FilCirculating": "\u003cnil\u003e",
+ "FilReserveDisbursed": "\u003cnil\u003e"
}
```
@@ -7280,17 +6748,10 @@ Response:
"Receipt": {
"ExitCode": 0,
"Return": "Ynl0ZSBhcnJheQ==",
- "GasUsed": 9
+ "GasUsed": 0
},
- "ReturnDec": {},
- "TipSet": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- {
- "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve"
- }
- ],
+ "ReturnDec": null,
+ "TipSet": [],
"Height": 10101
}
```
@@ -7354,24 +6815,11 @@ Response:
{
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -7379,25 +6827,15 @@ Response:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
}
```
@@ -7431,27 +6869,8 @@ Inputs: `null`
Response:
```json
{
- "ActiveSyncs": [
- {
- "WorkerID": 42,
- "Base": {
- "Cids": null,
- "Blocks": null,
- "Height": 0
- },
- "Target": {
- "Cids": null,
- "Blocks": null,
- "Height": 0
- },
- "Stage": 1,
- "Height": 10101,
- "Start": "0001-01-01T00:00:00Z",
- "End": "0001-01-01T00:00:00Z",
- "Message": "string value"
- }
- ],
- "VMApplied": 42
+ "ActiveSyncs": null,
+ "VMApplied": 0
}
```
@@ -7469,24 +6888,11 @@ Inputs:
"Header": {
"Miner": "f01234",
"Ticket": {
- "VRFProof": "Ynl0ZSBhcnJheQ=="
+ "VRFProof": null
},
- "ElectionProof": {
- "WinCount": 9,
- "VRFProof": "Ynl0ZSBhcnJheQ=="
- },
- "BeaconEntries": [
- {
- "Round": 42,
- "Data": "Ynl0ZSBhcnJheQ=="
- }
- ],
- "WinPoStProof": [
- {
- "PoStProof": 8,
- "ProofBytes": "Ynl0ZSBhcnJheQ=="
- }
- ],
+ "ElectionProof": null,
+ "BeaconEntries": null,
+ "WinPoStProof": null,
"Parents": [
{
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
@@ -7494,37 +6900,19 @@ Inputs:
],
"ParentWeight": "0",
"Height": 10101,
- "ParentStateRoot": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
- "ParentMessageReceipts": {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- },
+ "ParentStateRoot": null,
+ "ParentMessageReceipts": null,
"Messages": {
"/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
},
- "BLSAggregate": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
+ "BLSAggregate": null,
"Timestamp": 42,
- "BlockSig": {
- "Type": 2,
- "Data": "Ynl0ZSBhcnJheQ=="
- },
- "ForkSignaling": 42,
+ "BlockSig": null,
+ "ForkSignaling": 0,
"ParentBaseFee": "0"
},
- "BlsMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ],
- "SecpkMessages": [
- {
- "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4"
- }
- ]
+ "BlsMessages": null,
+ "SecpkMessages": null
}
]
```
@@ -7640,7 +7028,7 @@ Response:
```json
{
"Type": "bls",
- "PrivateKey": "Ynl0ZSBhcnJheQ=="
+ "PrivateKey": null
}
```
@@ -7670,7 +7058,7 @@ Inputs:
[
{
"Type": "bls",
- "PrivateKey": "Ynl0ZSBhcnJheQ=="
+ "PrivateKey": null
}
]
```
@@ -7762,13 +7150,13 @@ Inputs:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
]
@@ -7783,13 +7171,13 @@ Response:
"From": "f01234",
"Nonce": 42,
"Value": "0",
- "GasLimit": 9,
+ "GasLimit": 0,
"GasFeeCap": "0",
"GasPremium": "0",
"Method": 1,
"Params": "Ynl0ZSBhcnJheQ==",
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
},
"Signature": {
@@ -7797,7 +7185,7 @@ Response:
"Data": "Ynl0ZSBhcnJheQ=="
},
"CID": {
- "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s"
+ "/": "bafy2bzacebnkgxcy5pyk763pyw5l2sbltrai3qga5k2rcvvpgpdx2stlegnz4"
}
}
```
diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md
index ec266311b..b666d8ca7 100644
--- a/documentation/en/cli-lotus-miner.md
+++ b/documentation/en/cli-lotus-miner.md
@@ -7,7 +7,7 @@ USAGE:
lotus-miner [global options] command [command options] [arguments...]
VERSION:
- 1.17.2-dev
+ 1.19.1-dev
COMMANDS:
init Initialize a lotus miner repo
@@ -62,24 +62,24 @@ USAGE:
lotus-miner init command [command options] [arguments...]
COMMANDS:
- restore Initialize a lotus miner repo from a backup
- service Initialize a lotus miner sub-service
- help, h Shows a list of commands or help for one command
+ restore Initialize a lotus miner repo from a backup
+ service Initialize a lotus miner sub-service
+ help, h Shows a list of commands or help for one command
OPTIONS:
- --actor value specify the address of an already created miner actor
- --create-worker-key create separate worker key (default: false)
- --worker value, -w value worker key to use (overrides --create-worker-key)
- --owner value, -o value owner key to use
- --sector-size value specify sector size to use (default: "32GiB")
- --pre-sealed-sectors value specify set of presealed sectors for starting as a genesis miner (accepts multiple inputs)
- --pre-sealed-metadata value specify the metadata file for the presealed sectors
- --nosync don't check full-node sync status (default: false)
- --symlink-imported-sectors attempt to symlink to presealed sectors instead of copying them into place (default: false)
- --no-local-storage don't use storageminer repo for sector storage (default: false)
- --gas-premium value set gas premium for initialization messages in AttoFIL (default: "0")
- --from value select which address to send actor creation message from
- --help, -h show help (default: false)
+ --actor value specify the address of an already created miner actor
+ --create-worker-key create separate worker key (default: false)
+ --worker value, -w value worker key to use (overrides --create-worker-key)
+ --owner value, -o value owner key to use
+ --sector-size value specify sector size to use
+ --pre-sealed-sectors value [ --pre-sealed-sectors value ] specify set of presealed sectors for starting as a genesis miner
+ --pre-sealed-metadata value specify the metadata file for the presealed sectors
+ --nosync don't check full-node sync status (default: false)
+ --symlink-imported-sectors attempt to symlink to presealed sectors instead of copying them into place (default: false)
+ --no-local-storage don't use storageminer repo for sector storage (default: false)
+ --gas-premium value set gas premium for initialization messages in AttoFIL (default: "0")
+ --from value select which address to send actor creation message from
+ --help, -h show help (default: false)
```
@@ -107,11 +107,11 @@ USAGE:
lotus-miner init service [command options] [backupFile]
OPTIONS:
- --api-sealer value sealer API info (lotus-miner auth api-info --perm=admin)
- --api-sector-index value sector Index API info (lotus-miner auth api-info --perm=admin)
- --config value config file (config.toml)
- --nosync don't check full-node sync status (default: false)
- --type value type of service to be enabled (accepts multiple inputs)
+ --api-sealer value sealer API info (lotus-miner auth api-info --perm=admin)
+ --api-sector-index value sector Index API info (lotus-miner auth api-info --perm=admin)
+ --config value config file (config.toml)
+ --nosync don't check full-node sync status (default: false)
+ --type value [ --type value ] type of service to be enabled
```
@@ -153,9 +153,9 @@ USAGE:
lotus-miner config command [command options] [arguments...]
COMMANDS:
- default Print default node config
- updated Print updated node config
- help, h Shows a list of commands or help for one command
+ default Print default node config
+ updated Print updated node config
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -231,16 +231,18 @@ USAGE:
lotus-miner actor command [command options] [arguments...]
COMMANDS:
- set-addresses, set-addrs set addresses that your miner can be publicly dialed on
- withdraw withdraw available balance
- repay-debt pay down a miner's debt
- set-peer-id set the peer id of your miner
- set-owner Set owner address (this command should be invoked twice, first with the old owner as the senderAddress, and then with the new owner)
- control Manage control addresses
- propose-change-worker Propose a worker address change
- confirm-change-worker Confirm a worker address change
- compact-allocated compact allocated sectors bitfield
- help, h Shows a list of commands or help for one command
+ set-addresses, set-addrs set addresses that your miner can be publicly dialed on
+ withdraw withdraw available balance to beneficiary
+ repay-debt pay down a miner's debt
+ set-peer-id set the peer id of your miner
+ set-owner Set owner address (this command should be invoked twice, first with the old owner as the senderAddress, and then with the new owner)
+ control Manage control addresses
+ propose-change-worker Propose a worker address change
+ confirm-change-worker Confirm a worker address change
+ compact-allocated compact allocated sectors bitfield
+ propose-change-beneficiary Propose a beneficiary address change
+ confirm-change-beneficiary Confirm a beneficiary address change
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -254,12 +256,13 @@ OPTIONS:
### lotus-miner actor withdraw
```
NAME:
- lotus-miner actor withdraw - withdraw available balance
+ lotus-miner actor withdraw - withdraw available balance to beneficiary
USAGE:
lotus-miner actor withdraw [command options] [amount (FIL)]
OPTIONS:
+ --beneficiary send withdraw message from the beneficiary address (default: false)
--confidence value number of block confirmations to wait for (default: 5)
```
@@ -312,9 +315,9 @@ USAGE:
lotus-miner actor control command [command options] [arguments...]
COMMANDS:
- list Get currently set control addresses
- set Set control address(-es)
- help, h Shows a list of commands or help for one command
+ list Get currently set control addresses
+ set Set control address(-es)
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -389,6 +392,36 @@ OPTIONS:
```
+### lotus-miner actor propose-change-beneficiary
+```
+NAME:
+ lotus-miner actor propose-change-beneficiary - Propose a beneficiary address change
+
+USAGE:
+ lotus-miner actor propose-change-beneficiary [command options] [beneficiaryAddress quota expiration]
+
+OPTIONS:
+ --actor value specify the address of miner actor
+ --overwrite-pending-change Overwrite the current beneficiary change proposal (default: false)
+ --really-do-it Actually send transaction performing the action (default: false)
+
+```
+
+### lotus-miner actor confirm-change-beneficiary
+```
+NAME:
+ lotus-miner actor confirm-change-beneficiary - Confirm a beneficiary address change
+
+USAGE:
+ lotus-miner actor confirm-change-beneficiary [command options] [minerAddress]
+
+OPTIONS:
+ --existing-beneficiary send confirmation from the existing beneficiary address (default: false)
+ --new-beneficiary send confirmation from the new beneficiary address (default: false)
+ --really-do-it Actually send transaction performing the action (default: false)
+
+```
+
## lotus-miner info
```
NAME:
@@ -398,8 +431,8 @@ USAGE:
lotus-miner info command [command options] [arguments...]
COMMANDS:
- all dump all related miner info
- help, h Shows a list of commands or help for one command
+ all dump all related miner info
+ help, h Shows a list of commands or help for one command
OPTIONS:
--hide-sectors-info hide sectors info (default: false)
@@ -430,9 +463,9 @@ USAGE:
lotus-miner auth command [command options] [arguments...]
COMMANDS:
- create-token Create token
- api-info Get token with API info required to connect to this node
- help, h Shows a list of commands or help for one command
+ create-token Create token
+ api-info Get token with API info required to connect to this node
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -474,10 +507,10 @@ USAGE:
lotus-miner log command [command options] [arguments...]
COMMANDS:
- list List log systems
- set-level Set log level
- alerts Get alert states
- help, h Shows a list of commands or help for one command
+ list List log systems
+ set-level Set log level
+ alerts Get alert states
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -523,9 +556,10 @@ DESCRIPTION:
GOLOG_LOG_FMT - Change output log format (json, nocolor)
GOLOG_FILE - Write logs to file
GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr
+
OPTIONS:
- --system value limit to log system (accepts multiple inputs)
+ --system value [ --system value ] limit to log system
```
@@ -583,18 +617,18 @@ USAGE:
lotus-miner storage-deals command [command options] [arguments...]
COMMANDS:
- import-data Manually import data for a deal
- list List all deals for this miner
- selection Configure acceptance criteria for storage deal proposals
- set-ask Configure the miner's ask
- get-ask Print the miner's ask
- set-blocklist Set the miner's list of blocklisted piece CIDs
- get-blocklist List the contents of the miner's piece CID blocklist
- reset-blocklist Remove all entries from the miner's piece CID blocklist
- set-seal-duration Set the expected time, in minutes, that you expect sealing sectors to take. Deals that start before this duration will be rejected.
- pending-publish list deals waiting in publish queue
- retry-publish retry publishing a deal
- help, h Shows a list of commands or help for one command
+ import-data Manually import data for a deal
+ list List all deals for this miner
+ selection Configure acceptance criteria for storage deal proposals
+ set-ask Configure the miner's ask
+ get-ask Print the miner's ask
+ set-blocklist Set the miner's list of blocklisted piece CIDs
+ get-blocklist List the contents of the miner's piece CID blocklist
+ reset-blocklist Remove all entries from the miner's piece CID blocklist
+ set-seal-duration Set the expected time, in minutes, that you expect sealing sectors to take. Deals that start before this duration will be rejected.
+ pending-publish list deals waiting in publish queue
+ retry-publish retry publishing a deal
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -638,10 +672,10 @@ USAGE:
lotus-miner storage-deals selection command [command options] [arguments...]
COMMANDS:
- list List storage deal proposal selection criteria
- reset Reset storage deal proposal selection criteria to default values
- reject Configure criteria which necessitate automatic rejection
- help, h Shows a list of commands or help for one command
+ list List storage deal proposal selection criteria
+ reset Reset storage deal proposal selection criteria to default values
+ reject Configure criteria which necessitate automatic rejection
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -805,11 +839,11 @@ USAGE:
lotus-miner retrieval-deals command [command options] [arguments...]
COMMANDS:
- selection Configure acceptance criteria for retrieval deal proposals
- list List all active retrieval deals for this miner
- set-ask Configure the provider's retrieval ask
- get-ask Get the provider's current retrieval ask configured by the provider in the ask-store using the set-ask CLI command
- help, h Shows a list of commands or help for one command
+ selection Configure acceptance criteria for retrieval deal proposals
+ list List all active retrieval deals for this miner
+ set-ask Configure the provider's retrieval ask
+ get-ask Get the provider's current retrieval ask configured by the provider in the ask-store using the set-ask CLI command
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -825,10 +859,10 @@ USAGE:
lotus-miner retrieval-deals selection command [command options] [arguments...]
COMMANDS:
- list List retrieval deal proposal selection criteria
- reset Reset retrieval deal proposal selection criteria to default values
- reject Configure criteria which necessitate automatic rejection
- help, h Shows a list of commands or help for one command
+ list List retrieval deal proposal selection criteria
+ reset Reset retrieval deal proposal selection criteria to default values
+ reject Configure criteria which necessitate automatic rejection
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -926,11 +960,11 @@ USAGE:
lotus-miner data-transfers command [command options] [arguments...]
COMMANDS:
- list List ongoing data transfers for this miner
- restart Force restart a stalled data transfer
- cancel Force cancel a data transfer
- diagnostics Get detailed diagnostics on active transfers with a specific peer
- help, h Shows a list of commands or help for one command
+ list List ongoing data transfers for this miner
+ restart Force restart a stalled data transfer
+ cancel Force cancel a data transfer
+ diagnostics Get detailed diagnostics on active transfers with a specific peer
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1005,14 +1039,14 @@ USAGE:
lotus-miner dagstore command [command options] [arguments...]
COMMANDS:
- list-shards List all shards known to the dagstore, with their current status
- register-shard Register a shard
- initialize-shard Initialize the specified shard
- recover-shard Attempt to recover a shard in errored state
- initialize-all Initialize all uninitialized shards, streaming results as they're produced; only shards for unsealed pieces are initialized by default
- gc Garbage collect the dagstore
- lookup-pieces Lookup pieces that a given CID belongs to
- help, h Shows a list of commands or help for one command
+ list-shards List all shards known to the dagstore, with their current status
+ register-shard Register a shard
+ initialize-shard Initialize the specified shard
+ recover-shard Attempt to recover a shard in errored state
+ initialize-all Initialize all uninitialized shards, streaming results as they're produced; only shards for unsealed pieces are initialized by default
+ gc Garbage collect the dagstore
+ lookup-pieces Lookup pieces that a given CID belongs to
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1121,9 +1155,9 @@ USAGE:
lotus-miner index command [command options] [arguments...]
COMMANDS:
- announce Announce a deal to indexers so they can download its index
- announce-all Announce all active deals to indexers so they can download the indices
- help, h Shows a list of commands or help for one command
+ announce Announce a deal to indexers so they can download its index
+ announce-all Announce all active deals to indexers so they can download the indices
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1165,23 +1199,23 @@ USAGE:
lotus-miner net command [command options] [arguments...]
COMMANDS:
- peers Print peers
- ping Ping peers
- connect Connect to a peer
- disconnect Disconnect from a peer
- listen List listen addresses
- id Get node identity
- find-peer, findpeer Find the addresses of a given peerID
- scores Print peers' pubsub scores
- reachability Print information about reachability from the internet
- bandwidth Print bandwidth usage information
- block Manage network connection gating rules
- stat Report resource usage for a scope
- limit Get or set resource limits for a scope
- protect Add one or more peer IDs to the list of protected peer connections
- unprotect Remove one or more peer IDs from the list of protected peer connections.
- list-protected List the peer IDs with protected connection.
- help, h Shows a list of commands or help for one command
+ peers Print peers
+ ping Ping peers
+ connect Connect to a peer
+ disconnect Disconnect from a peer
+ listen List listen addresses
+ id Get node identity
+ find-peer, findpeer Find the addresses of a given peerID
+ scores Print peers' pubsub scores
+ reachability Print information about reachability from the internet
+ bandwidth Print bandwidth usage information
+ block Manage network connection gating rules
+ stat Report resource usage for a scope
+ limit Get or set resource limits for a scope
+ protect Add one or more peer IDs to the list of protected peer connections
+ unprotect Remove one or more peer IDs from the list of protected peer connections.
+ list-protected List the peer IDs with protected connection.
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1208,7 +1242,7 @@ NAME:
lotus-miner net ping - Ping peers
USAGE:
- lotus-miner net ping [command options] [arguments...]
+ lotus-miner net ping [command options] [peerMultiaddr]
OPTIONS:
--count value, -c value specify the number of times it should ping (default: 10)
@@ -1321,10 +1355,10 @@ USAGE:
lotus-miner net block command [command options] [arguments...]
COMMANDS:
- add Add connection gating rules
- remove Remove connection gating rules
- list list connection gating rules
- help, h Shows a list of commands or help for one command
+ add Add connection gating rules
+ remove Remove connection gating rules
+ list list connection gating rules
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1340,10 +1374,10 @@ USAGE:
lotus-miner net block add command [command options] [arguments...]
COMMANDS:
- peer Block a peer
- ip Block an IP address
- subnet Block an IP subnet
- help, h Shows a list of commands or help for one command
+ peer Block a peer
+ ip Block an IP address
+ subnet Block an IP subnet
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1398,10 +1432,10 @@ USAGE:
lotus-miner net block remove command [command options] [arguments...]
COMMANDS:
- peer Unblock a peer
- ip Unblock an IP address
- subnet Unblock an IP subnet
- help, h Shows a list of commands or help for one command
+ peer Unblock a peer
+ ip Unblock an IP address
+ subnet Unblock an IP subnet
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1478,6 +1512,7 @@ DESCRIPTION:
- proto: -- reports the resource usage of a specific protocol.
- peer: -- reports the resource usage of a specific peer.
- all -- reports the resource usage for all currently active scopes.
+
OPTIONS:
--json (default: false)
@@ -1503,6 +1538,7 @@ DESCRIPTION:
- peer: -- reports the resource usage of a specific peer.
The limit is json-formatted, with the same structure as the limits file.
+
OPTIONS:
--set set the limit for a scope (default: false)
@@ -1560,11 +1596,11 @@ DESCRIPTION:
The piecestore is a database that tracks and manages data that is made available to the retrieval market
COMMANDS:
- list-pieces list registered pieces
- list-cids list registered payload CIDs
- piece-info get registered information for a given piece CID
- cid-info get registered information for a given payload CID
- help, h Shows a list of commands or help for one command
+ list-pieces list registered pieces
+ list-cids list registered payload CIDs
+ piece-info get registered information for a given piece CID
+ cid-info get registered information for a given payload CID
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1632,28 +1668,28 @@ USAGE:
lotus-miner sectors command [command options] [arguments...]
COMMANDS:
- status Get the seal status of a sector by its number
- list List sectors
- refs List References to sectors
- update-state ADVANCED: manually update the state of a sector, this may aid in error recovery
- pledge store random data in a sector
- numbers manage sector number assignments
- precommits Print on-chain precommit info
- check-expire Inspect expiring sectors
- expired Get or cleanup expired sectors
- renew Renew expiring sectors while not exceeding each sector's max life
- extend Extend sector expiration
- terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector)
- remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty))
- snap-up Mark a committed capacity sector to be filled with deals
- abort-upgrade Abort the attempted (SnapDeals) upgrade of a CC sector, reverting it to as before
- seal Manually start sealing a sector (filling any unused space with junk)
- set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts
- get-cc-collateral Get the collateral required to pledge a committed capacity sector
- batching manage batch sector operations
- match-pending-pieces force a refreshed match of pending pieces to open sectors without manually waiting for more deals
- compact-partitions removes dead sectors from partitions and reduces the number of partitions used if possible
- help, h Shows a list of commands or help for one command
+ status Get the seal status of a sector by its number
+ list List sectors
+ refs List References to sectors
+ update-state ADVANCED: manually update the state of a sector, this may aid in error recovery
+ pledge store random data in a sector
+ numbers manage sector number assignments
+ precommits Print on-chain precommit info
+ check-expire Inspect expiring sectors
+ expired Get or cleanup expired sectors
+ renew Renew expiring sectors while not exceeding each sector's max life
+ extend Extend sector expiration
+ terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector)
+ remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty))
+ snap-up Mark a committed capacity sector to be filled with deals
+ abort-upgrade Abort the attempted (SnapDeals) upgrade of a CC sector, reverting it to as before
+ seal Manually start sealing a sector (filling any unused space with junk)
+ set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts
+ get-cc-collateral Get the collateral required to pledge a committed capacity sector
+ batching manage batch sector operations
+ match-pending-pieces force a refreshed match of pending pieces to open sectors without manually waiting for more deals
+ compact-partitions removes dead sectors from partitions and reduces the number of partitions used if possible
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1744,11 +1780,11 @@ USAGE:
lotus-miner sectors numbers command [command options] [arguments...]
COMMANDS:
- info view sector assigner state
- reservations list sector number reservations
- reserve create sector number reservations
- free remove sector number reservations
- help, h Shows a list of commands or help for one command
+ info view sector assigner state
+ reservations list sector number reservations
+ reserve create sector number reservations
+ free remove sector number reservations
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1897,9 +1933,9 @@ USAGE:
lotus-miner sectors terminate command [command options]
COMMANDS:
- flush Send a terminate message if there are sectors queued for termination
- pending List sector numbers of sectors pending termination
- help, h Shows a list of commands or help for one command
+ flush Send a terminate message if there are sectors queued for termination
+ pending List sector numbers of sectors pending termination
+ help, h Shows a list of commands or help for one command
OPTIONS:
--really-do-it pass this flag if you know what you are doing (default: false)
@@ -2020,9 +2056,9 @@ USAGE:
lotus-miner sectors batching command [command options] [arguments...]
COMMANDS:
- commit list sectors waiting in commit batch queue
- precommit list sectors waiting in precommit batch queue
- help, h Shows a list of commands or help for one command
+ commit list sectors waiting in commit batch queue
+ precommit list sectors waiting in precommit batch queue
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2077,10 +2113,10 @@ USAGE:
lotus-miner sectors compact-partitions [command options] [arguments...]
OPTIONS:
- --actor value Specify the address of the miner to run this command
- --deadline value the deadline to compact the partitions in (default: 0)
- --partitions value list of partitions to compact sectors in (accepts multiple inputs)
- --really-do-it Actually send transaction performing the action (default: false)
+ --actor value Specify the address of the miner to run this command
+ --deadline value the deadline to compact the partitions in (default: 0)
+ --partitions value [ --partitions value ] list of partitions to compact sectors in
+ --really-do-it Actually send transaction performing the action (default: false)
```
@@ -2093,15 +2129,15 @@ USAGE:
lotus-miner proving command [command options] [arguments...]
COMMANDS:
- info View current state information
- deadlines View the current proving period deadlines information
- deadline View the current proving period deadline information by its index
- faults View the currently known proving faulty sectors information
- check Check sectors provable
- workers list workers
- compute Compute simulated proving tasks
- recover-faults Manually recovers faulty sectors on chain
- help, h Shows a list of commands or help for one command
+ info View current state information
+ deadlines View the current proving period deadlines information
+ deadline View the current proving period deadline information by its index
+ faults View the currently known proving faulty sectors information
+ check Check sectors provable
+ workers list workers
+ compute Compute simulated proving tasks
+ recover-faults Manually recovers faulty sectors on chain
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2199,8 +2235,8 @@ USAGE:
lotus-miner proving compute command [command options] [arguments...]
COMMANDS:
- windowed-post, window-post Compute WindowPoSt for a specific deadline
- help, h Shows a list of commands or help for one command
+ windowed-post, window-post Compute WindowPoSt for a specific deadline
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2239,14 +2275,14 @@ DESCRIPTION:
stored while moving through the sealing pipeline (references as 'seal').
COMMANDS:
- attach attach local storage path
- detach detach local storage path
- redeclare redeclare sectors in a local storage path
- list list local storage paths
- find find sector in the storage system
- cleanup trigger cleanup actions
- locks show active sector locks
- help, h Shows a list of commands or help for one command
+ attach attach local storage path
+ detach detach local storage path
+ redeclare redeclare sectors in a local storage path
+ list list local storage paths
+ find find sector in the storage system
+ cleanup trigger cleanup actions
+ locks show active sector locks
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2280,15 +2316,16 @@ DESCRIPTION:
Store
Finalized sectors that will be moved here for long term storage and be proven
over time
+
OPTIONS:
- --allow-to value path groups allowed to pull data from this path (allow all if not specified) (accepts multiple inputs)
- --groups value path group names (accepts multiple inputs)
- --init initialize the path first (default: false)
- --max-storage value (for init) limit storage space for sectors (expensive for very large paths!)
- --seal (for init) use path for sealing (default: false)
- --store (for init) use path for long-term storage (default: false)
- --weight value (for init) path weight (default: 10)
+ --allow-to value [ --allow-to value ] path groups allowed to pull data from this path (allow all if not specified)
+ --groups value [ --groups value ] path group names
+ --init initialize the path first (default: false)
+ --max-storage value (for init) limit storage space for sectors (expensive for very large paths!)
+ --seal (for init) use path for sealing (default: false)
+ --store (for init) use path for long-term storage (default: false)
+ --weight value (for init) path weight (default: 10)
```
@@ -2329,8 +2366,8 @@ USAGE:
lotus-miner storage list command [command options] [arguments...]
COMMANDS:
- sectors get list of all sector files
- help, h Shows a list of commands or help for one command
+ sectors get list of all sector files
+ help, h Shows a list of commands or help for one command
OPTIONS:
--color use color in display output (default: depends on output being a TTY)
@@ -2399,12 +2436,12 @@ USAGE:
lotus-miner sealing command [command options] [arguments...]
COMMANDS:
- jobs list running jobs
- workers list workers
- sched-diag Dump internal scheduler state
- abort Abort a running job
- data-cid Compute data CID using workers
- help, h Shows a list of commands or help for one command
+ jobs list running jobs
+ workers list workers
+ sched-diag Dump internal scheduler state
+ abort Abort a running job
+ data-cid Compute data CID using workers
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md
index ec81d28d7..74b7a19b8 100644
--- a/documentation/en/cli-lotus-worker.md
+++ b/documentation/en/cli-lotus-worker.md
@@ -7,7 +7,7 @@ USAGE:
lotus-worker [global options] command [command options] [arguments...]
VERSION:
- 1.17.2-dev
+ 1.19.1-dev
COMMANDS:
run Start lotus worker
@@ -40,6 +40,7 @@ USAGE:
OPTIONS:
--addpiece enable addpiece (default: true) [$LOTUS_WORKER_ADDPIECE]
--commit enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap) (default: true) [$LOTUS_WORKER_COMMIT]
+ --http-server-timeout value (default: "30s")
--listen value host address and port the worker api will listen on (default: "0.0.0.0:3456") [$LOTUS_WORKER_LISTEN]
--name value custom worker name (default: hostname) [$LOTUS_WORKER_NAME]
--no-default disable all default compute tasks, use the worker for storage/fetching only (default: false) [$LOTUS_WORKER_NO_DEFAULT]
@@ -53,6 +54,7 @@ OPTIONS:
--prove-replica-update2 enable prove replica update 2 (default: true) [$LOTUS_WORKER_PROVE_REPLICA_UPDATE2]
--regen-sector-key enable regen sector key (default: true) [$LOTUS_WORKER_REGEN_SECTOR_KEY]
--replica-update enable replica update (default: true) [$LOTUS_WORKER_REPLICA_UPDATE]
+ --sector-download enable external sector data download (default: false) [$LOTUS_WORKER_SECTOR_DOWNLOAD]
--timeout value used when 'listen' is unspecified. must be a valid duration recognized by golang's time.ParseDuration function (default: "30m") [$LOTUS_WORKER_TIMEOUT]
--unseal enable unsealing (32G sectors: 1 core, 128GiB Memory) (default: true) [$LOTUS_WORKER_UNSEAL]
--windowpost enable window post (default: false) [$LOTUS_WORKER_WINDOWPOST]
@@ -95,10 +97,10 @@ USAGE:
lotus-worker storage command [command options] [arguments...]
COMMANDS:
- attach attach local storage path
- detach detach local storage path
- redeclare redeclare sectors in a local storage path
- help, h Shows a list of commands or help for one command
+ attach attach local storage path
+ detach detach local storage path
+ redeclare redeclare sectors in a local storage path
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -114,13 +116,13 @@ USAGE:
lotus-worker storage attach [command options] [arguments...]
OPTIONS:
- --allow-to value path groups allowed to pull data from this path (allow all if not specified) (accepts multiple inputs)
- --groups value path group names (accepts multiple inputs)
- --init initialize the path first (default: false)
- --max-storage value (for init) limit storage space for sectors (expensive for very large paths!)
- --seal (for init) use path for sealing (default: false)
- --store (for init) use path for long-term storage (default: false)
- --weight value (for init) path weight (default: 10)
+ --allow-to value [ --allow-to value ] path groups allowed to pull data from this path (allow all if not specified)
+ --groups value [ --groups value ] path group names
+ --init initialize the path first (default: false)
+ --max-storage value (for init) limit storage space for sectors (expensive for very large paths!)
+ --seal (for init) use path for sealing (default: false)
+ --store (for init) use path for long-term storage (default: false)
+ --weight value (for init) path weight (default: 10)
```
@@ -201,9 +203,9 @@ USAGE:
lotus-worker tasks command [command options] [arguments...]
COMMANDS:
- enable Enable a task type
- disable Disable a task type
- help, h Shows a list of commands or help for one command
+ enable Enable a task type
+ disable Disable a task type
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md
index 15178d8e0..2f662f017 100644
--- a/documentation/en/cli-lotus.md
+++ b/documentation/en/cli-lotus.md
@@ -7,7 +7,7 @@ USAGE:
lotus [global options] command [command options] [arguments...]
VERSION:
- 1.17.2-dev
+ 1.19.1-dev
COMMANDS:
daemon Start a lotus daemon process
@@ -55,8 +55,8 @@ USAGE:
lotus daemon command [command options] [arguments...]
COMMANDS:
- stop Stop a running lotus daemon
- help, h Shows a list of commands or help for one command
+ stop Stop a running lotus daemon
+ help, h Shows a list of commands or help for one command
OPTIONS:
--api value (default: "1234")
@@ -120,9 +120,9 @@ USAGE:
lotus config command [command options] [arguments...]
COMMANDS:
- default Print default node config
- updated Print updated node config
- help, h Shows a list of commands or help for one command
+ default Print default node config
+ updated Print updated node config
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -201,18 +201,18 @@ USAGE:
lotus wallet command [command options] [arguments...]
COMMANDS:
- new Generate a new key of the given type
- list List wallet address
- balance Get account balance
- export export keys
- import import keys
- default Get default wallet address
- set-default Set default wallet address
- sign sign a message
- verify verify the signature of a message
- delete Soft delete an address from the wallet - hard deletion needed for permanent removal
- market Interact with market balances
- help, h Shows a list of commands or help for one command
+ new Generate a new key of the given type
+ list List wallet address
+ balance Get account balance
+ export export keys
+ import import keys
+ default Get default wallet address
+ set-default Set default wallet address
+ sign sign a message
+ verify verify the signature of a message
+ delete Soft delete an address from the wallet - hard deletion needed for permanent removal
+ market Interact with market balances
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -361,9 +361,9 @@ USAGE:
lotus wallet market command [command options] [arguments...]
COMMANDS:
- withdraw Withdraw funds from the Storage Market Actor
- add Add funds to the Storage Market Actor
- help, h Shows a list of commands or help for one command
+ withdraw Withdraw funds from the Storage Market Actor
+ add Add funds to the Storage Market Actor
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -424,7 +424,7 @@ USAGE:
lotus client command [command options] [arguments...]
COMMANDS:
- help, h Shows a list of commands or help for one command
+ help, h Shows a list of commands or help for one command
DATA:
import Import data
drop Remove import
@@ -598,6 +598,7 @@ DESCRIPTION:
- Retrieve a first file from a specified directory
$ lotus client retrieve --data-selector /Links/0/Hash Qm... my-file.txt
+
OPTIONS:
--allow-local (default: false)
@@ -940,24 +941,24 @@ USAGE:
lotus msig command [command options] [arguments...]
COMMANDS:
- create Create a new multisig wallet
- inspect Inspect a multisig wallet
- propose Propose a multisig transaction
- propose-remove Propose to remove a signer
- approve Approve a multisig message
- cancel Cancel a multisig message
- add-propose Propose to add a signer
- add-approve Approve a message to add a signer
- add-cancel Cancel a message to add a signer
- swap-propose Propose to swap signers
- swap-approve Approve a message to swap signers
- swap-cancel Cancel a message to swap signers
- lock-propose Propose to lock up some balance
- lock-approve Approve a message to lock up some balance
- lock-cancel Cancel a message to lock up some balance
- vested Gets the amount vested in an msig between two epochs
- propose-threshold Propose setting a different signing threshold on the account
- help, h Shows a list of commands or help for one command
+ create Create a new multisig wallet
+ inspect Inspect a multisig wallet
+ propose Propose a multisig transaction
+ propose-remove Propose to remove a signer
+ approve Approve a multisig message
+ cancel Cancel a multisig message
+ add-propose Propose to add a signer
+ add-approve Approve a message to add a signer
+ add-cancel Cancel a message to add a signer
+ swap-propose Propose to swap signers
+ swap-approve Approve a message to swap signers
+ swap-cancel Cancel a message to swap signers
+ lock-propose Propose to lock up some balance
+ lock-approve Approve a message to lock up some balance
+ lock-cancel Cancel a message to lock up some balance
+ vested Gets the amount vested in an msig between two epochs
+ propose-threshold Propose setting a different signing threshold on the account
+ help, h Shows a list of commands or help for one command
OPTIONS:
--confidence value number of block confirmations to wait for (default: 5)
@@ -1202,13 +1203,15 @@ USAGE:
lotus filplus command [command options] [arguments...]
COMMANDS:
- grant-datacap give allowance to the specified verified client address
- list-notaries list all notaries
- list-clients list all verified clients
- check-client-datacap check verified client remaining bytes
- check-notary-datacap check a notary's remaining bytes
- sign-remove-data-cap-proposal allows a notary to sign a Remove Data Cap Proposal
- help, h Shows a list of commands or help for one command
+ grant-datacap give allowance to the specified verified client address
+ list-notaries list all notaries
+ list-clients list all verified clients
+ check-client-datacap check verified client remaining bytes
+ check-notary-datacap check a notary's remaining bytes
+ sign-remove-data-cap-proposal allows a notary to sign a Remove Data Cap Proposal
+ list-allocations List allocations made by client
+ remove-expired-allocations remove expired allocations (if no allocations are specified all eligible allocations are removed)
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1221,7 +1224,7 @@ NAME:
lotus filplus grant-datacap - give allowance to the specified verified client address
USAGE:
- lotus filplus grant-datacap [command options] [arguments...]
+ lotus filplus grant-datacap [command options] [clientAddress datacap]
OPTIONS:
--from value specify your notary address to send the message from
@@ -1260,7 +1263,7 @@ NAME:
lotus filplus check-client-datacap - check verified client remaining bytes
USAGE:
- lotus filplus check-client-datacap [command options] [arguments...]
+ lotus filplus check-client-datacap [command options] clientAddress
OPTIONS:
--help, -h show help (default: false)
@@ -1273,7 +1276,7 @@ NAME:
lotus filplus check-notary-datacap - check a notary's remaining bytes
USAGE:
- lotus filplus check-notary-datacap [command options] [arguments...]
+ lotus filplus check-notary-datacap [command options] notaryAddress
OPTIONS:
--help, -h show help (default: false)
@@ -1286,13 +1289,39 @@ NAME:
lotus filplus sign-remove-data-cap-proposal - allows a notary to sign a Remove Data Cap Proposal
USAGE:
- lotus filplus sign-remove-data-cap-proposal [command options] [arguments...]
+ lotus filplus sign-remove-data-cap-proposal [command options] [verifierAddress clientAddress allowanceToRemove]
OPTIONS:
--id value specify the RemoveDataCapProposal ID (will look up on chain if unspecified) (default: 0)
```
+### lotus filplus list-allocations
+```
+NAME:
+ lotus filplus list-allocations - List allocations made by client
+
+USAGE:
+ lotus filplus list-allocations [command options] clientAddress
+
+OPTIONS:
+ --expired list only expired allocations (default: false)
+
+```
+
+### lotus filplus remove-expired-allocations
+```
+NAME:
+ lotus filplus remove-expired-allocations - remove expired allocations (if no allocations are specified all eligible allocations are removed)
+
+USAGE:
+ lotus filplus remove-expired-allocations [command options] clientAddress Optional[...allocationId]
+
+OPTIONS:
+ --from value optionally specify the account to send the message from
+
+```
+
## lotus paych
```
NAME:
@@ -1302,14 +1331,14 @@ USAGE:
lotus paych command [command options] [arguments...]
COMMANDS:
- add-funds Add funds to the payment channel between fromAddress and toAddress. Creates the payment channel if it doesn't already exist.
- list List all locally registered payment channels
- voucher Interact with payment channel vouchers
- settle Settle a payment channel
- status Show the status of an outbound payment channel
- status-by-from-to Show the status of an active outbound payment channel by from/to addresses
- collect Collect funds for a payment channel
- help, h Shows a list of commands or help for one command
+ add-funds Add funds to the payment channel between fromAddress and toAddress. Creates the payment channel if it doesn't already exist.
+ list List all locally registered payment channels
+ voucher Interact with payment channel vouchers
+ settle Settle a payment channel
+ status Show the status of an outbound payment channel
+ status-by-from-to Show the status of an active outbound payment channel by from/to addresses
+ collect Collect funds for a payment channel
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1352,13 +1381,13 @@ USAGE:
lotus paych voucher command [command options] [arguments...]
COMMANDS:
- create Create a signed payment channel voucher
- check Check validity of payment channel voucher
- add Add payment channel voucher to local datastore
- list List stored vouchers for a given payment channel
- best-spendable Print vouchers with highest value that is currently spendable for each lane
- submit Submit voucher to chain to update payment channel state
- help, h Shows a list of commands or help for one command
+ create Create a signed payment channel voucher
+ check Check validity of payment channel voucher
+ add Add payment channel voucher to local datastore
+ list List stored vouchers for a given payment channel
+ best-spendable Print vouchers with highest value that is currently spendable for each lane
+ submit Submit voucher to chain to update payment channel state
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1504,9 +1533,9 @@ USAGE:
lotus auth command [command options] [arguments...]
COMMANDS:
- create-token Create token
- api-info Get token with API info required to connect to this node
- help, h Shows a list of commands or help for one command
+ create-token Create token
+ api-info Get token with API info required to connect to this node
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1548,15 +1577,15 @@ USAGE:
lotus mpool command [command options] [arguments...]
COMMANDS:
- pending Get pending messages
- sub Subscribe to mpool changes
- stat print mempool stats
- replace replace a message in the mempool
- find find a message in the mempool
- config get or set current mpool configuration
- gas-perf Check gas performance of messages in mempool
- manage
- help, h Shows a list of commands or help for one command
+ pending Get pending messages
+ sub Subscribe to mpool changes
+ stat print mempool stats
+ replace replace a message in the mempool
+ find find a message in the mempool
+ config get or set current mpool configuration
+ gas-perf Check gas performance of messages in mempool
+ manage
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -1667,7 +1696,7 @@ OPTIONS:
### lotus mpool manage
```
NAME:
- lotus mpool manage -
+ lotus mpool manage
USAGE:
lotus mpool manage [command options] [arguments...]
@@ -1686,31 +1715,31 @@ USAGE:
lotus state command [command options] [arguments...]
COMMANDS:
- power Query network or miner power
- sectors Query the sector set of a miner
- active-sectors Query the active sector set of a miner
- list-actors list all actors in the network
- list-miners list all miners in the network
- circulating-supply Get the exact current circulating supply of Filecoin
- sector, sector-info Get miner sector info
- get-actor Print actor information
- lookup Find corresponding ID address
- replay Replay a particular message
- sector-size Look up miners sector size
- read-state View a json representation of an actors state
- list-messages list messages on chain matching given criteria
- compute-state Perform state computations
- call Invoke a method on an actor locally
- get-deal View on-chain deal info
- wait-msg, wait-message Wait for a message to appear on chain
- search-msg, search-message Search to see whether a message has appeared on chain
- miner-info Retrieve miner information
- market Inspect the storage market actor
- exec-trace Get the execution trace of a given message
- network-version Returns the network version
- miner-proving-deadline Retrieve information about a given miner's proving deadline
- actor-cids Returns the built-in actor bundle manifest ID & system actor cids
- help, h Shows a list of commands or help for one command
+ power Query network or miner power
+ sectors Query the sector set of a miner
+ active-sectors Query the active sector set of a miner
+ list-actors list all actors in the network
+ list-miners list all miners in the network
+ circulating-supply Get the exact current circulating supply of Filecoin
+ sector, sector-info Get miner sector info
+ get-actor Print actor information
+ lookup Find corresponding ID address
+ replay Replay a particular message
+ sector-size Look up miners sector size
+ read-state View a json representation of an actors state
+ list-messages list messages on chain matching given criteria
+ compute-state Perform state computations
+ call Invoke a method on an actor locally
+ get-deal View on-chain deal info
+ wait-msg, wait-message Wait for a message to appear on chain
+ search-msg, search-message Search to see whether a message has appeared on chain
+ miner-info Retrieve miner information
+ market Inspect the storage market actor
+ exec-trace Get the execution trace of a given message
+ network-version Returns the network version
+ miner-proving-deadline Retrieve information about a given miner's proving deadline
+ actor-cids Returns the built-in actor bundle manifest ID & system actor cids
+ help, h Shows a list of commands or help for one command
OPTIONS:
--tipset value specify tipset to call method on (pass comma separated array of cids)
@@ -1960,8 +1989,8 @@ USAGE:
lotus state market command [command options] [arguments...]
COMMANDS:
- balance Get the market balance (locked and escrowed) for a given account
- help, h Shows a list of commands or help for one command
+ balance Get the market balance (locked and escrowed) for a given account
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2029,7 +2058,7 @@ USAGE:
lotus state actor-cids [command options] [arguments...]
OPTIONS:
- --network-version value specify network version (default: 16)
+ --network-version value specify network version (default: 0)
```
@@ -2042,24 +2071,25 @@ USAGE:
lotus chain command [command options] [arguments...]
COMMANDS:
- head Print chain head
- get-block, getblock Get a block and print its details
- read-obj Read the raw bytes of an object
- delete-obj Delete an object from the chain blockstore
- stat-obj Collect size and ipld link counts for objs
- getmessage, get-message, get-msg Get and print a message by its cid
- sethead, set-head manually set the local nodes head tipset (Caution: normally only used for recovery)
- list, love View a segment of the chain
- get Get chain DAG node by path
- bisect bisect chain for an event
- export export chain to a car file
- slash-consensus Report consensus fault
- gas-price Estimate gas prices
- inspect-usage Inspect block space usage of a given tipset
- decode decode various types
- encode encode various types
- disputer interact with the window post disputer
- help, h Shows a list of commands or help for one command
+ head Print chain head
+ get-block, getblock Get a block and print its details
+ read-obj Read the raw bytes of an object
+ delete-obj Delete an object from the chain blockstore
+ stat-obj Collect size and ipld link counts for objs
+ getmessage, get-message, get-msg Get and print a message by its cid
+ sethead, set-head manually set the local nodes head tipset (Caution: normally only used for recovery)
+ list, love View a segment of the chain
+ get Get chain DAG node by path
+ bisect bisect chain for an event
+ export export chain to a car file
+ slash-consensus Report consensus fault
+ gas-price Estimate gas prices
+ inspect-usage Inspect block space usage of a given tipset
+ decode decode various types
+ encode encode various types
+ disputer interact with the window post disputer
+ prune prune the stored chain state and perform garbage collection
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2125,6 +2155,7 @@ DESCRIPTION:
When a base is provided it will be walked first, and all links visisted
will be ignored when the passed in object is walked.
+
OPTIONS:
--base value ignore links found in this obj
@@ -2180,6 +2211,7 @@ DESCRIPTION:
- hamt-address
- cronevent
- account-state
+
OPTIONS:
--as-type value specify type to interpret output as
@@ -2209,6 +2241,7 @@ DESCRIPTION:
- lotus chain bisect 1 32000 '@Ha:t03/1' jq -e '.[2] > 100000'
For special path elements see 'chain get' help
+
OPTIONS:
--help, -h show help (default: false)
@@ -2281,8 +2314,8 @@ USAGE:
lotus chain decode command [command options] [arguments...]
COMMANDS:
- params Decode message params
- help, h Shows a list of commands or help for one command
+ params Decode message params
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2312,8 +2345,8 @@ USAGE:
lotus chain encode command [command options] [arguments...]
COMMANDS:
- params Encodes the given JSON params
- help, h Shows a list of commands or help for one command
+ params Encodes the given JSON params
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2344,9 +2377,9 @@ USAGE:
lotus chain disputer command [command options] [arguments...]
COMMANDS:
- start Start the window post disputer
- dispute Send a specific DisputeWindowedPoSt message
- help, h Shows a list of commands or help for one command
+ start Start the window post disputer
+ dispute Send a specific DisputeWindowedPoSt message
+ help, h Shows a list of commands or help for one command
OPTIONS:
--max-fee value Spend up to X FIL per DisputeWindowedPoSt message
@@ -2381,6 +2414,21 @@ OPTIONS:
```
+### lotus chain prune
+```
+NAME:
+ lotus chain prune - prune the stored chain state and perform garbage collection
+
+USAGE:
+ lotus chain prune [command options] [arguments...]
+
+OPTIONS:
+ --moving-gc use moving gc for garbage collecting the coldstore (default: false)
+ --online-gc use online gc for garbage collecting the coldstore (default: false)
+ --retention value specify state retention policy (default: -1)
+
+```
+
## lotus log
```
NAME:
@@ -2390,10 +2438,10 @@ USAGE:
lotus log command [command options] [arguments...]
COMMANDS:
- list List log systems
- set-level Set log level
- alerts Get alert states
- help, h Shows a list of commands or help for one command
+ list List log systems
+ set-level Set log level
+ alerts Get alert states
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2439,9 +2487,10 @@ DESCRIPTION:
GOLOG_LOG_FMT - Change output log format (json, nocolor)
GOLOG_FILE - Write logs to file
GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr
+
OPTIONS:
- --system value limit to log system (accepts multiple inputs)
+ --system value [ --system value ] limit to log system
```
@@ -2499,23 +2548,23 @@ USAGE:
lotus net command [command options] [arguments...]
COMMANDS:
- peers Print peers
- ping Ping peers
- connect Connect to a peer
- disconnect Disconnect from a peer
- listen List listen addresses
- id Get node identity
- find-peer, findpeer Find the addresses of a given peerID
- scores Print peers' pubsub scores
- reachability Print information about reachability from the internet
- bandwidth Print bandwidth usage information
- block Manage network connection gating rules
- stat Report resource usage for a scope
- limit Get or set resource limits for a scope
- protect Add one or more peer IDs to the list of protected peer connections
- unprotect Remove one or more peer IDs from the list of protected peer connections.
- list-protected List the peer IDs with protected connection.
- help, h Shows a list of commands or help for one command
+ peers Print peers
+ ping Ping peers
+ connect Connect to a peer
+ disconnect Disconnect from a peer
+ listen List listen addresses
+ id Get node identity
+ find-peer, findpeer Find the addresses of a given peerID
+ scores Print peers' pubsub scores
+ reachability Print information about reachability from the internet
+ bandwidth Print bandwidth usage information
+ block Manage network connection gating rules
+ stat Report resource usage for a scope
+ limit Get or set resource limits for a scope
+ protect Add one or more peer IDs to the list of protected peer connections
+ unprotect Remove one or more peer IDs from the list of protected peer connections.
+ list-protected List the peer IDs with protected connection.
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2542,7 +2591,7 @@ NAME:
lotus net ping - Ping peers
USAGE:
- lotus net ping [command options] [arguments...]
+ lotus net ping [command options] [peerMultiaddr]
OPTIONS:
--count value, -c value specify the number of times it should ping (default: 10)
@@ -2655,10 +2704,10 @@ USAGE:
lotus net block command [command options] [arguments...]
COMMANDS:
- add Add connection gating rules
- remove Remove connection gating rules
- list list connection gating rules
- help, h Shows a list of commands or help for one command
+ add Add connection gating rules
+ remove Remove connection gating rules
+ list list connection gating rules
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2674,10 +2723,10 @@ USAGE:
lotus net block add command [command options] [arguments...]
COMMANDS:
- peer Block a peer
- ip Block an IP address
- subnet Block an IP subnet
- help, h Shows a list of commands or help for one command
+ peer Block a peer
+ ip Block an IP address
+ subnet Block an IP subnet
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2732,10 +2781,10 @@ USAGE:
lotus net block remove command [command options] [arguments...]
COMMANDS:
- peer Unblock a peer
- ip Unblock an IP address
- subnet Unblock an IP subnet
- help, h Shows a list of commands or help for one command
+ peer Unblock a peer
+ ip Unblock an IP address
+ subnet Unblock an IP subnet
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
@@ -2812,6 +2861,7 @@ DESCRIPTION:
- proto: -- reports the resource usage of a specific protocol.
- peer: -- reports the resource usage of a specific peer.
- all -- reports the resource usage for all currently active scopes.
+
OPTIONS:
--json (default: false)
@@ -2837,6 +2887,7 @@ DESCRIPTION:
- peer: -- reports the resource usage of a specific peer.
The limit is json-formatted, with the same structure as the limits file.
+
OPTIONS:
--set set the limit for a scope (default: false)
@@ -2891,13 +2942,13 @@ USAGE:
lotus sync command [command options] [arguments...]
COMMANDS:
- status check sync status
- wait Wait for sync to be complete
- mark-bad Mark the given block as bad, will prevent syncing to a chain that contains it
- unmark-bad Unmark the given block as bad, makes it possible to sync to a chain containing it
- check-bad check if the given block was marked bad, and for what reason
- checkpoint mark a certain tipset as checkpointed; the node will never fork away from this tipset
- help, h Shows a list of commands or help for one command
+ status check sync status
+ wait Wait for sync to be complete
+ mark-bad Mark the given block as bad, will prevent syncing to a chain that contains it
+ unmark-bad Unmark the given block as bad, makes it possible to sync to a chain containing it
+ check-bad check if the given block was marked bad, and for what reason
+ checkpoint mark a certain tipset as checkpointed; the node will never fork away from this tipset
+ help, h Shows a list of commands or help for one command
OPTIONS:
--help, -h show help (default: false)
diff --git a/documentation/en/default-lotus-config.toml b/documentation/en/default-lotus-config.toml
index 27162a6ae..7f4ff591b 100644
--- a/documentation/en/default-lotus-config.toml
+++ b/documentation/en/default-lotus-config.toml
@@ -98,6 +98,35 @@
# env var: LOTUS_PUBSUB_REMOTETRACER
#RemoteTracer = ""
+ # Path to file that will be used to output tracer content in JSON format.
+ # If present tracer will save data to defined file.
+ # Format: file path
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_JSONTRACER
+ #JsonTracer = ""
+
+ # Connection string for elasticsearch instance.
+ # If present tracer will save data to elasticsearch.
+ # Format: https://:@:/
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_ELASTICSEARCHTRACER
+ #ElasticSearchTracer = ""
+
+ # Name of elasticsearch index that will be used to save tracer data.
+ # This property is used only if ElasticSearchTracer propery is set.
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_ELASTICSEARCHINDEX
+ #ElasticSearchIndex = ""
+
+ # Auth token that will be passed with logs to elasticsearch - used for weighted peers score.
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_TRACERSOURCEAUTH
+ #TracerSourceAuth = ""
+
[Client]
# type: bool
@@ -166,11 +195,11 @@
[Chainstore.Splitstore]
# ColdStoreType specifies the type of the coldstore.
- # It can be "universal" (default) or "discard" for discarding cold blocks.
+ # It can be "messages" (default) to store only messages, "universal" to store all chain state or "discard" for discarding cold blocks.
#
# type: string
# env var: LOTUS_CHAINSTORE_SPLITSTORE_COLDSTORETYPE
- #ColdStoreType = "universal"
+ #ColdStoreType = "messages"
# HotStoreType specifies the type of the hotstore.
# Only currently supported value is "badger".
@@ -201,28 +230,66 @@
# env var: LOTUS_CHAINSTORE_SPLITSTORE_HOTSTOREFULLGCFREQUENCY
#HotStoreFullGCFrequency = 20
- # EnableColdStoreAutoPrune turns on compaction of the cold store i.e. pruning
- # where hotstore compaction occurs every finality epochs pruning happens every 3 finalities
- # Default is false
- #
- # type: bool
- # env var: LOTUS_CHAINSTORE_SPLITSTORE_ENABLECOLDSTOREAUTOPRUNE
- #EnableColdStoreAutoPrune = false
- # ColdStoreFullGCFrequency specifies how often to performa a full (moving) GC on the coldstore.
- # Only applies if auto prune is enabled. A value of 0 disables while a value of 1 will do
- # full GC in every prune.
- # Default is 7 (about once every a week)
- #
- # type: uint64
- # env var: LOTUS_CHAINSTORE_SPLITSTORE_COLDSTOREFULLGCFREQUENCY
- #ColdStoreFullGCFrequency = 7
+[Cluster]
+ # EXPERIMENTAL. config to enabled node cluster with raft consensus
+ #
+ # type: bool
+ # env var: LOTUS_CLUSTER_CLUSTERMODEENABLED
+ #ClusterModeEnabled = false
- # ColdStoreRetention specifies the retention policy for data reachable from the chain, in
- # finalities beyond the compaction boundary, default is 0, -1 retains everything
- #
- # type: int64
- # env var: LOTUS_CHAINSTORE_SPLITSTORE_COLDSTORERETENTION
- #ColdStoreRetention = 0
+ # A folder to store Raft's data.
+ #
+ # type: string
+ # env var: LOTUS_CLUSTER_DATAFOLDER
+ #DataFolder = ""
+
+ # InitPeersetMultiAddr provides the list of initial cluster peers for new Raft
+ # peers (with no prior state). It is ignored when Raft was already
+ # initialized or when starting in staging mode.
+ #
+ # type: []string
+ # env var: LOTUS_CLUSTER_INITPEERSETMULTIADDR
+ #InitPeersetMultiAddr = []
+
+ # LeaderTimeout specifies how long to wait for a leader before
+ # failing an operation.
+ #
+ # type: Duration
+ # env var: LOTUS_CLUSTER_WAITFORLEADERTIMEOUT
+ #WaitForLeaderTimeout = "15s"
+
+ # NetworkTimeout specifies how long before a Raft network
+ # operation is timed out
+ #
+ # type: Duration
+ # env var: LOTUS_CLUSTER_NETWORKTIMEOUT
+ #NetworkTimeout = "1m40s"
+
+ # CommitRetries specifies how many times we retry a failed commit until
+ # we give up.
+ #
+ # type: int
+ # env var: LOTUS_CLUSTER_COMMITRETRIES
+ #CommitRetries = 1
+
+ # How long to wait between retries
+ #
+ # type: Duration
+ # env var: LOTUS_CLUSTER_COMMITRETRYDELAY
+ #CommitRetryDelay = "200ms"
+
+ # BackupsRotate specifies the maximum number of Raft's DataFolder
+ # copies that we keep as backups (renaming) after cleanup.
+ #
+ # type: int
+ # env var: LOTUS_CLUSTER_BACKUPSROTATE
+ #BackupsRotate = 6
+
+ # Tracing enables propagation of contexts across binary boundaries.
+ #
+ # type: bool
+ # env var: LOTUS_CLUSTER_TRACING
+ #Tracing = false
diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml
index 786924904..416531f98 100644
--- a/documentation/en/default-lotus-miner-config.toml
+++ b/documentation/en/default-lotus-miner-config.toml
@@ -98,6 +98,35 @@
# env var: LOTUS_PUBSUB_REMOTETRACER
#RemoteTracer = ""
+ # Path to file that will be used to output tracer content in JSON format.
+ # If present tracer will save data to defined file.
+ # Format: file path
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_JSONTRACER
+ #JsonTracer = ""
+
+ # Connection string for elasticsearch instance.
+ # If present tracer will save data to elasticsearch.
+ # Format: https://:@:/
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_ELASTICSEARCHTRACER
+ #ElasticSearchTracer = ""
+
+ # Name of elasticsearch index that will be used to save tracer data.
+ # This property is used only if ElasticSearchTracer propery is set.
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_ELASTICSEARCHINDEX
+ #ElasticSearchIndex = ""
+
+ # Auth token that will be passed with logs to elasticsearch - used for weighted peers score.
+ #
+ # type: string
+ # env var: LOTUS_PUBSUB_TRACERSOURCEAUTH
+ #TracerSourceAuth = ""
+
[Subsystems]
# type: bool
@@ -240,14 +269,14 @@
#StartEpochSealingBuffer = 480
# A command used for fine-grained evaluation of storage deals
- # see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
+ # see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
#
# type: string
# env var: LOTUS_DEALMAKING_FILTER
#Filter = ""
# A command used for fine-grained evaluation of retrieval deals
- # see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
+ # see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
#
# type: string
# env var: LOTUS_DEALMAKING_RETRIEVALFILTER
@@ -325,6 +354,29 @@
# env var: LOTUS_PROVING_PARALLELCHECKLIMIT
#ParallelCheckLimit = 128
+ # Maximum amount of time a proving pre-check can take for a sector. If the check times out the sector will be skipped
+ #
+ # WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the
+ # test challenge took longer than this timeout
+ # WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this sector are
+ # blocked (e.g. in case of disconnected NFS mount)
+ #
+ # type: Duration
+ # env var: LOTUS_PROVING_SINGLECHECKTIMEOUT
+ #SingleCheckTimeout = "10m0s"
+
+ # Maximum amount of time a proving pre-check can take for an entire partition. If the check times out, sectors in
+ # the partition which didn't get checked on time will be skipped
+ #
+ # WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the
+ # test challenge took longer than this timeout
+ # WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this partition are
+ # blocked or slow
+ #
+ # type: Duration
+ # env var: LOTUS_PROVING_PARTITIONCHECKTIMEOUT
+ #PartitionCheckTimeout = "20m0s"
+
# Disable Window PoSt computation on the lotus-miner process even if no window PoSt workers are present.
#
# WARNING: If no windowPoSt workers are connected, window PoSt WILL FAIL resulting in faulty sectors which will need
@@ -380,11 +432,9 @@
# A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors.
#
# The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which
- # means that a single message can prove at most 10 partinions
+ # means that a single message can prove at most 10 partitions
#
- # In some cases when submitting PoSt messages which are recovering sectors, the default network limit may still be
- # too high to fit in the block gas limit; In those cases it may be necessary to set this value to something lower
- # than 10; Note that setting this value lower may result in less efficient gas use - more messages will be sent,
+ # Note that setting this value lower may result in less efficient gas use - more messages will be sent,
# to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)
#
# Setting this value above the network limit has no effect
@@ -403,6 +453,19 @@
# env var: LOTUS_PROVING_MAXPARTITIONSPERRECOVERYMESSAGE
#MaxPartitionsPerRecoveryMessage = 0
+ # Enable single partition per PoSt Message for partitions containing recovery sectors
+ #
+ # In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be
+ # too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition
+ # with recovering sectors in the post message
+ #
+ # Note that setting this value lower may result in less efficient gas use - more messages will be sent,
+ # to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)
+ #
+ # type: bool
+ # env var: LOTUS_PROVING_SINGLERECOVERINGPARTITIONPERPOSTMESSAGE
+ #SingleRecoveringPartitionPerPostMessage = false
+
[Sealing]
# Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time.
@@ -442,6 +505,30 @@
# env var: LOTUS_SEALING_MAXUPGRADINGSECTORS
#MaxUpgradingSectors = 0
+ # When set to a non-zero value, minimum number of epochs until sector expiration required for sectors to be considered
+ # for upgrades (0 = DealMinDuration = 180 days = 518400 epochs)
+ #
+ # Note that if all deals waiting in the input queue have lifetimes longer than this value, upgrade sectors will be
+ # required to have expiration of at least the soonest-ending deal
+ #
+ # type: uint64
+ # env var: LOTUS_SEALING_MINUPGRADESECTOREXPIRATION
+ #MinUpgradeSectorExpiration = 0
+
+ # When set to a non-zero value, minimum number of epochs until sector expiration above which upgrade candidates will
+ # be selected based on lowest initial pledge.
+ #
+ # Target sector expiration is calculated by looking at the input deal queue, sorting it by deal expiration, and
+ # selecting N deals from the queue up to sector size. The target expiration will be Nth deal end epoch, or in case
+ # where there weren't enough deals to fill a sector, DealMaxDuration (540 days = 1555200 epochs)
+ #
+ # Setting this to a high value (for example to maximum deal duration - 1555200) will disable selection based on
+ # initial pledge - upgrade sectors will always be chosen based on longest expiration
+ #
+ # type: uint64
+ # env var: LOTUS_SEALING_MINTARGETUPGRADESECTOREXPIRATION
+ #MinTargetUpgradeSectorExpiration = 0
+
# CommittedCapacitySectorLifetime is the duration a Committed Capacity (CC) sector will
# live before it must be extended or converted into sector containing deals before it is
# terminated. Value must be between 180-540 days inclusive
@@ -588,8 +675,10 @@
# env var: LOTUS_STORAGE_PARALLELFETCHLIMIT
#ParallelFetchLimit = 10
- # Local worker config
- #
+ # type: bool
+ # env var: LOTUS_STORAGE_ALLOWSECTORDOWNLOAD
+ #AllowSectorDownload = true
+
# type: bool
# env var: LOTUS_STORAGE_ALLOWADDPIECE
#AllowAddPiece = true
@@ -657,7 +746,7 @@
# to use when evaluating tasks against this worker. An empty value defaults
# to "hardware".
#
- # type: sealer.ResourceFilteringStrategy
+ # type: ResourceFilteringStrategy
# env var: LOTUS_STORAGE_RESOURCEFILTERING
#ResourceFiltering = "hardware"
diff --git a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md
index 5a4884669..9ae46fe57 100644
--- a/documentation/misc/RELEASE_ISSUE_TEMPLATE.md
+++ b/documentation/misc/RELEASE_ISSUE_TEMPLATE.md
@@ -21,11 +21,14 @@
First steps:
- [ ] Fork a new branch (`release/vX.Y.Z`) from `master` and make any further release related changes to this branch. If any "non-trivial" changes get added to the release, uncheck all the checkboxes and return to this stage.
- - [ ] Bump the version in `version.go` in the `master` branch to `vX.Y.(Z+1)-dev` (bump from feature release) or `vX.(Y+1).0-dev` (bump from mandatory release)
+ - [ ] Bump the version in `build/version.go` in the `master` branch to `vX.Y.(Z+1)-dev` (bump from feature release) or `vX.(Y+1).0-dev` (bump from mandatory release). Run make gen and make docsgen-cli before committing changes
Prepping an RC:
-- [ ] version string in `build/version.go` has been updated (in the `release/vX.Y.Z` branch).
+- [ ] version string in `build/version.go` has been updated (in the `release/vX.Y.Z` branch)
+- [ ] run `make gen && make docsgen-cli`
+- [ ] Generate changelog using the script at scripts/mkreleaselog
+- [ ] Add contents of generated text to lotus/CHANGELOG.md in addition to other details
- [ ] tag commit with `vX.Y.Z-rcN`
- [ ] cut a pre-release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=true)
@@ -66,14 +69,14 @@ Testing an RC:
- [ ] Update the [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) to the state that can be used as release note.
- [ ] Invite the wider community through (link to the release issue)
-- [ ] **Stage 4 - Release**
+- [ ] **Stage 4 - Stable Release**
- [ ] Final preparation
- - [ ] Verify that version string in [`version.go`](https://github.com/ipfs/go-ipfs/tree/master/version.go) has been updated.
- - [ ] Prep the changelog using `scripts/mkreleaselog`, and add it to `CHANGELOG.md`. Ensure that [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) is up to date
+ - [ ] Verify that version string in [`version.go`](https://github.com/filecoin-project/lotus/blob/master/build/version.go) has been updated.
+ - [ ] Verify that codegen is up to date (`make gen && make docsgen-cli`)
+ - [ ] Ensure that [CHANGELOG.md](https://github.com/filecoin-project/lotus/blob/master/CHANGELOG.md) is up to date
- [ ] Merge `release-vX.Y.Z` into the `releases` branch.
- [ ] Tag this merge commit (on the `releases` branch) with `vX.Y.Z`
- - [ ] Cut the release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=true&target=releases).
- - [ ] Check `Create a discussion for this release`
+ - [ ] Cut the release [here](https://github.com/filecoin-project/lotus/releases/new?prerelease=false&target=releases).
- [ ] **Post-Release**
diff --git a/documentation/misc/actors_version_checklist.md b/documentation/misc/actors_version_checklist.md
index 5e6038c2b..13af238b1 100644
--- a/documentation/misc/actors_version_checklist.md
+++ b/documentation/misc/actors_version_checklist.md
@@ -11,3 +11,4 @@
- [ ] Schedule
- [ ] Migration
- [ ] Update upgrade schedule in `chain/sync_test.go`
+- [ ] Add upgrade field to `api/types.go/ForkUpgradeParams` and update the implementation of StateGetNetworkParams
diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi
index f997fe6c7..02ebb2d61 160000
--- a/extern/filecoin-ffi
+++ b/extern/filecoin-ffi
@@ -1 +1 @@
-Subproject commit f997fe6c77632c0bc58d0b1fdf53ee7a93f6027c
+Subproject commit 02ebb2d6169131cfe489e1063e896f14982c463d
diff --git a/gateway/handler.go b/gateway/handler.go
index 648065a44..be824b430 100644
--- a/gateway/handler.go
+++ b/gateway/handler.go
@@ -30,7 +30,7 @@ func Handler(gwapi lapi.Gateway, api lapi.FullNode, rateLimit int64, connPerMinu
m := mux.NewRouter()
serveRpc := func(path string, hnd interface{}) {
- rpcServer := jsonrpc.NewServer(opts...)
+ rpcServer := jsonrpc.NewServer(append(opts, jsonrpc.WithServerErrors(lapi.RPCErrors))...)
rpcServer.Register("Filecoin", hnd)
rpcServer.AliasMethod("rpc.discover", "Filecoin.Discover")
diff --git a/gen/api/proxygen.go b/gen/api/proxygen.go
index df39132ff..f756c0d0c 100644
--- a/gen/api/proxygen.go
+++ b/gen/api/proxygen.go
@@ -140,14 +140,14 @@ func generate(path, pkg, outpkg, outfile string) error {
ast.Walk(v, ap)
type methodInfo struct {
- Name string
+ Num string
node ast.Node
Tags map[string][]string
NamedParams, ParamNames, Results, DefRes string
}
type strinfo struct {
- Name string
+ Num string
Methods map[string]*methodInfo
Include []string
}
@@ -182,7 +182,7 @@ func generate(path, pkg, outpkg, outfile string) error {
for ifname, methods := range v.Methods {
if _, ok := m.Infos[ifname]; !ok {
m.Infos[ifname] = &strinfo{
- Name: ifname,
+ Num: ifname,
Methods: map[string]*methodInfo{},
Include: v.Include[ifname],
}
@@ -239,7 +239,7 @@ func generate(path, pkg, outpkg, outfile string) error {
}
info.Methods[mname] = &methodInfo{
- Name: mname,
+ Num: mname,
node: node.node,
Tags: map[string][]string{},
NamedParams: strings.Join(params, ", "),
@@ -298,18 +298,18 @@ import (
var ErrNotSupported = xerrors.New("method not supported")
{{range .Infos}}
-type {{.Name}}Struct struct {
+type {{.Num}}Struct struct {
{{range .Include}}
{{.}}Struct
{{end}}
Internal struct {
{{range .Methods}}
- {{.Name}} func({{.NamedParams}}) ({{.Results}}) `+"`"+`{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}`+"`"+`
+ {{.Num}} func({{.NamedParams}}) ({{.Results}}) `+"`"+`{{range .Tags}}{{index . 0}}:"{{index . 1}}"{{end}}`+"`"+`
{{end}}
}
}
-type {{.Name}}Stub struct {
+type {{.Num}}Stub struct {
{{range .Include}}
{{.}}Stub
{{end}}
@@ -317,22 +317,22 @@ type {{.Name}}Stub struct {
{{end}}
{{range .Infos}}
-{{$name := .Name}}
+{{$name := .Num}}
{{range .Methods}}
-func (s *{{$name}}Struct) {{.Name}}({{.NamedParams}}) ({{.Results}}) {
- if s.Internal.{{.Name}} == nil {
+func (s *{{$name}}Struct) {{.Num}}({{.NamedParams}}) ({{.Results}}) {
+ if s.Internal.{{.Num}} == nil {
return {{.DefRes}}ErrNotSupported
}
- return s.Internal.{{.Name}}({{.ParamNames}})
+ return s.Internal.{{.Num}}({{.ParamNames}})
}
-func (s *{{$name}}Stub) {{.Name}}({{.NamedParams}}) ({{.Results}}) {
+func (s *{{$name}}Stub) {{.Num}}({{.NamedParams}}) ({{.Results}}) {
return {{.DefRes}}ErrNotSupported
}
{{end}}
{{end}}
-{{range .Infos}}var _ {{.Name}} = new({{.Name}}Struct)
+{{range .Infos}}var _ {{.Num}} = new({{.Num}}Struct)
{{end}}
`)
diff --git a/gen/inlinegen-data.json b/gen/inlinegen-data.json
index 8b8081ac4..8384e749d 100644
--- a/gen/inlinegen-data.json
+++ b/gen/inlinegen-data.json
@@ -1,7 +1,7 @@
{
- "actorVersions": [0, 2, 3, 4, 5, 6, 7, 8],
- "latestActorsVersion": 8,
+ "actorVersions": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10],
+ "latestActorsVersion": 10,
- "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
- "latestNetworkVersion": 16
+ "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
+ "latestNetworkVersion": 18
}
diff --git a/gen/main.go b/gen/main.go
index fcb1d6dfa..38ec5935d 100644
--- a/gen/main.go
+++ b/gen/main.go
@@ -7,6 +7,7 @@ import (
gen "github.com/whyrusleeping/cbor-gen"
"github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/chain/exchange"
"github.com/filecoin-project/lotus/chain/market"
"github.com/filecoin-project/lotus/chain/types"
@@ -26,7 +27,8 @@ func main() {
types.Message{},
types.SignedMessage{},
types.MsgMeta{},
- types.Actor{},
+ types.ActorV4{},
+ types.ActorV5{},
types.MessageReceipt{},
types.BlockMsg{},
types.ExpTipSet{},
@@ -41,6 +43,7 @@ func main() {
err = gen.WriteTupleEncodersToFile("./chain/vm/cbor_gen.go", "vm",
vm.FvmExecutionTrace{},
+ vm.FvmGasCharge{},
)
if err != nil {
fmt.Println(err)
@@ -64,6 +67,7 @@ func main() {
api.SealTicket{},
api.SealSeed{},
api.PieceDealInfo{},
+ api.SectorPiece{},
api.DealSchedule{},
)
if err != nil {
@@ -101,6 +105,8 @@ func main() {
err = gen.WriteMapEncodersToFile("./storage/sealer/storiface/cbor_gen.go", "storiface",
storiface.CallID{},
+ storiface.SecDataHttpHeader{},
+ storiface.SectorLocation{},
)
if err != nil {
fmt.Println(err)
@@ -123,4 +129,13 @@ func main() {
fmt.Println(err)
os.Exit(1)
}
+ err = gen.WriteTupleEncodersToFile("./blockstore/cbor_gen.go", "blockstore",
+ blockstore.NetRpcReq{},
+ blockstore.NetRpcResp{},
+ blockstore.NetRpcErr{},
+ )
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
}
diff --git a/genesis/types.go b/genesis/types.go
index 822357dd1..815a2f008 100644
--- a/genesis/types.go
+++ b/genesis/types.go
@@ -8,10 +8,10 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/network"
- "github.com/filecoin-project/lotus/chain/wallet/key"
+ "github.com/filecoin-project/lotus/chain/types"
)
type ActorType string
@@ -25,8 +25,8 @@ type PreSeal struct {
CommR cid.Cid
CommD cid.Cid
SectorID abi.SectorNumber
- Deal market8.DealProposal
- DealClientKey *key.Key
+ Deal markettypes.DealProposal
+ DealClientKey types.KeyInfo
ProofType abi.RegisteredSealProof
}
diff --git a/go.mod b/go.mod
index 9b89fba0f..21b18674e 100644
--- a/go.mod
+++ b/go.mod
@@ -7,8 +7,8 @@ retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead.
require (
contrib.go.opencensus.io/exporter/prometheus v0.4.0
github.com/BurntSushi/toml v1.1.0
- github.com/DataDog/zstd v1.4.1
- github.com/GeertJohan/go.rice v1.0.2
+ github.com/DataDog/zstd v1.4.5
+ github.com/GeertJohan/go.rice v1.0.3
github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee
github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d
@@ -16,20 +16,21 @@ require (
github.com/buger/goterm v1.0.3
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e
github.com/containerd/cgroups v1.0.4
- github.com/coreos/go-systemd/v22 v22.3.2
+ github.com/coreos/go-systemd/v22 v22.4.0
github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e
github.com/dgraph-io/badger/v2 v2.2007.3
- github.com/docker/go-units v0.4.0
+ github.com/docker/go-units v0.5.0
github.com/drand/drand v1.3.0
github.com/drand/kyber v1.1.7
github.com/dustin/go-humanize v1.0.0
+ github.com/elastic/go-elasticsearch/v7 v7.14.0
github.com/elastic/go-sysinfo v1.7.0
github.com/elastic/gosigar v0.14.2
github.com/etclabscore/go-openrpc-reflect v0.0.36
github.com/fatih/color v1.13.0
github.com/filecoin-project/dagstore v0.5.2
github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f
- github.com/filecoin-project/go-address v1.0.0
+ github.com/filecoin-project/go-address v1.1.0
github.com/filecoin-project/go-bitfield v0.2.4
github.com/filecoin-project/go-cbor-util v0.0.1
github.com/filecoin-project/go-commp-utils v0.1.3
@@ -37,16 +38,16 @@ require (
github.com/filecoin-project/go-data-transfer v1.15.2
github.com/filecoin-project/go-fil-commcid v0.1.0
github.com/filecoin-project/go-fil-commp-hashhash v0.1.0
- github.com/filecoin-project/go-fil-markets v1.24.0
- github.com/filecoin-project/go-jsonrpc v0.1.7
+ github.com/filecoin-project/go-fil-markets v1.25.2
+ github.com/filecoin-project/go-jsonrpc v0.1.8
github.com/filecoin-project/go-legs v0.4.4
github.com/filecoin-project/go-padreader v0.0.1
github.com/filecoin-project/go-paramfetch v0.0.4
- github.com/filecoin-project/go-state-types v0.1.11
+ github.com/filecoin-project/go-state-types v0.10.0-alpha-3
github.com/filecoin-project/go-statemachine v1.0.2
github.com/filecoin-project/go-statestore v0.2.0
github.com/filecoin-project/go-storedcounter v0.1.0
- github.com/filecoin-project/index-provider v0.8.1
+ github.com/filecoin-project/index-provider v0.9.1
github.com/filecoin-project/pubsub v1.0.0
github.com/filecoin-project/specs-actors v0.9.15
github.com/filecoin-project/specs-actors/v2 v2.3.6
@@ -62,26 +63,28 @@ require (
github.com/go-kit/kit v0.12.0
github.com/golang/mock v1.6.0
github.com/google/uuid v1.3.0
- github.com/gorilla/mux v1.7.4
+ github.com/gorilla/mux v1.8.0
github.com/gorilla/websocket v1.5.0
github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026
github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e
github.com/hashicorp/go-multierror v1.1.1
github.com/hashicorp/golang-lru v0.5.4
+ github.com/hashicorp/raft v1.1.1
+ github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea
github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94
github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab
github.com/ipfs/bbloom v0.0.4
- github.com/ipfs/go-bitswap v0.8.0
+ github.com/ipfs/go-bitswap v0.10.2
github.com/ipfs/go-block-format v0.0.3
github.com/ipfs/go-blockservice v0.4.0
- github.com/ipfs/go-cid v0.2.0
+ github.com/ipfs/go-cid v0.3.2
github.com/ipfs/go-cidutil v0.1.0
- github.com/ipfs/go-datastore v0.5.1
+ github.com/ipfs/go-datastore v0.6.0
github.com/ipfs/go-ds-badger2 v0.1.2
github.com/ipfs/go-ds-leveldb v0.5.0
github.com/ipfs/go-ds-measure v0.2.0
github.com/ipfs/go-fs-lock v0.0.7
- github.com/ipfs/go-graphsync v0.13.1
+ github.com/ipfs/go-graphsync v0.13.2
github.com/ipfs/go-ipfs-blockstore v1.2.0
github.com/ipfs/go-ipfs-blocksutil v0.0.1
github.com/ipfs/go-ipfs-chunker v0.0.5
@@ -95,64 +98,68 @@ require (
github.com/ipfs/go-ipld-cbor v0.0.6
github.com/ipfs/go-ipld-format v0.4.0
github.com/ipfs/go-log/v2 v2.5.1
- github.com/ipfs/go-merkledag v0.6.0
+ github.com/ipfs/go-merkledag v0.8.1
github.com/ipfs/go-metrics-interface v0.0.1
github.com/ipfs/go-metrics-prometheus v0.0.2
- github.com/ipfs/go-unixfs v0.3.1
+ github.com/ipfs/go-unixfs v0.4.0
github.com/ipfs/go-unixfsnode v1.4.0
github.com/ipfs/interface-go-ipfs-core v0.7.0
github.com/ipld/go-car v0.4.0
- github.com/ipld/go-car/v2 v2.4.1
- github.com/ipld/go-codec-dagpb v1.3.2
- github.com/ipld/go-ipld-prime v0.17.0
+ github.com/ipld/go-car/v2 v2.5.0
+ github.com/ipld/go-codec-dagpb v1.5.0
+ github.com/ipld/go-ipld-prime v0.18.0
github.com/ipld/go-ipld-selector-text-lite v0.0.1
github.com/kelseyhightower/envconfig v1.4.0
github.com/koalacxr/quantile v0.0.1
github.com/libp2p/go-buffer-pool v0.1.0
- github.com/libp2p/go-libp2p v0.22.0
- github.com/libp2p/go-libp2p-kad-dht v0.17.0
- github.com/libp2p/go-libp2p-peerstore v0.7.1
- github.com/libp2p/go-libp2p-pubsub v0.8.0
- github.com/libp2p/go-libp2p-record v0.1.3
+ github.com/libp2p/go-libp2p v0.23.2
+ github.com/libp2p/go-libp2p-consensus v0.0.1
+ github.com/libp2p/go-libp2p-gorpc v0.4.0
+ github.com/libp2p/go-libp2p-kad-dht v0.18.0
+ github.com/libp2p/go-libp2p-pubsub v0.8.2
+ github.com/libp2p/go-libp2p-raft v0.1.8
+ github.com/libp2p/go-libp2p-record v0.2.0
github.com/libp2p/go-libp2p-routing-helpers v0.2.3
github.com/libp2p/go-maddr-filter v0.1.0
+ github.com/libp2p/go-msgio v0.2.0
github.com/mattn/go-isatty v0.0.16
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1
github.com/mitchellh/go-homedir v1.1.0
- github.com/multiformats/go-base32 v0.0.4
- github.com/multiformats/go-multiaddr v0.6.0
+ github.com/multiformats/go-base32 v0.1.0
+ github.com/multiformats/go-multiaddr v0.7.0
github.com/multiformats/go-multiaddr-dns v0.3.1
github.com/multiformats/go-multibase v0.1.1
github.com/multiformats/go-multihash v0.2.1
github.com/multiformats/go-varint v0.0.6
github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333
- github.com/opentracing/opentracing-go v1.2.0
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e
- github.com/prometheus/client_golang v1.12.1
+ github.com/prometheus/client_golang v1.13.0
github.com/raulk/clock v1.1.0
github.com/raulk/go-watchdog v1.3.0
github.com/stretchr/testify v1.8.0
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
- github.com/urfave/cli/v2 v2.8.1
+ github.com/urfave/cli/v2 v2.16.3
github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba
- github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799
+ github.com/whyrusleeping/cbor-gen v0.0.0-20220514204315-f29c37e9c44c
github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7
github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542
go.opencensus.io v0.23.0
- go.opentelemetry.io/otel v1.7.0
- go.opentelemetry.io/otel/bridge/opencensus v0.25.0
+ go.opentelemetry.io/otel v1.11.1
+ go.opentelemetry.io/otel/bridge/opencensus v0.33.0
go.opentelemetry.io/otel/exporters/jaeger v1.2.0
- go.opentelemetry.io/otel/sdk v1.2.0
+ go.opentelemetry.io/otel/sdk v1.11.1
go.uber.org/fx v1.15.0
go.uber.org/multierr v1.8.0
- go.uber.org/zap v1.22.0
- golang.org/x/net v0.0.0-20220812174116-3211cb980234
- golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
- golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab
- golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac
+ go.uber.org/zap v1.23.0
+ golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b
+ golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5
+ golang.org/x/sync v0.0.0-20220907140024-f12130a52804
+ golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8
+ golang.org/x/text v0.3.7
+ golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9
golang.org/x/tools v0.1.12
- golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f
+ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2
gopkg.in/cheggaaa/pb.v1 v1.0.28
gotest.tools v2.2.0+incompatible
)
@@ -165,17 +172,18 @@ require (
github.com/Stebalien/go-bitfield v0.0.1 // indirect
github.com/akavel/rsrc v0.8.0 // indirect
github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect
+ github.com/armon/go-metrics v0.3.9 // indirect
github.com/benbjohnson/clock v1.3.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/bep/debounce v1.2.0 // indirect
+ github.com/bep/debounce v1.2.1 // indirect
+ github.com/boltdb/bolt v1.3.1 // indirect
github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
- github.com/cheekybits/genny v1.0.0 // indirect
github.com/cilium/ebpf v0.4.0 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect
github.com/cskr/pubsub v1.0.2 // indirect
- github.com/daaku/go.zipexe v1.0.0 // indirect
+ github.com/daaku/go.zipexe v1.0.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
@@ -187,11 +195,12 @@ require (
github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect
github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect
github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 // indirect
- github.com/filecoin-project/go-ds-versioning v0.1.1 // indirect
+ github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 // indirect
+ github.com/filecoin-project/go-ds-versioning v0.1.2 // indirect
github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect
github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect
github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect
- github.com/filecoin-project/storetheindex v0.4.17 // indirect
+ github.com/filecoin-project/storetheindex v0.4.30-0.20221114113647-683091f8e893 // indirect
github.com/flynn/noise v1.0.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
@@ -212,10 +221,13 @@ require (
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
- github.com/google/go-cmp v0.5.8 // indirect
+ github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gopacket v1.1.19 // indirect
github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-hclog v0.16.2 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
+ github.com/hashicorp/go-msgpack v0.5.5 // indirect
github.com/huin/goupnp v1.0.3 // indirect
github.com/iancoleman/orderedmap v0.1.0 // indirect
github.com/ipfs/go-bitfield v1.0.0 // indirect
@@ -226,11 +238,12 @@ require (
github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect
github.com/ipfs/go-ipfs-pq v0.0.2 // indirect
github.com/ipfs/go-ipld-legacy v0.1.1 // indirect
- github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a // indirect
+ github.com/ipfs/go-ipns v0.3.0 // indirect
github.com/ipfs/go-log v1.0.5 // indirect
github.com/ipfs/go-path v0.3.0 // indirect
- github.com/ipfs/go-peertaskqueue v0.7.1 // indirect
- github.com/ipfs/go-verifcid v0.0.1 // indirect
+ github.com/ipfs/go-peertaskqueue v0.8.0 // indirect
+ github.com/ipfs/go-verifcid v0.0.2 // indirect
+ github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 // indirect
github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c // indirect
@@ -242,33 +255,28 @@ require (
github.com/josharian/intern v1.0.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect
- github.com/klauspost/compress v1.15.1 // indirect
- github.com/klauspost/cpuid/v2 v2.1.0 // indirect
+ github.com/klauspost/compress v1.15.10 // indirect
+ github.com/klauspost/cpuid/v2 v2.1.1 // indirect
github.com/koron/go-ssdp v0.0.3 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-eventbus v0.3.0 // indirect
github.com/libp2p/go-flow-metrics v0.1.0 // indirect
github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect
github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect
- github.com/libp2p/go-libp2p-core v0.20.0 // indirect
- github.com/libp2p/go-libp2p-gostream v0.4.0 // indirect
- github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect
- github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect
- github.com/libp2p/go-libp2p-netutil v0.2.0 // indirect
+ github.com/libp2p/go-libp2p-core v0.20.1 // indirect
+ github.com/libp2p/go-libp2p-gostream v0.5.0 // indirect
+ github.com/libp2p/go-libp2p-kbucket v0.5.0 // indirect
github.com/libp2p/go-libp2p-noise v0.5.0 // indirect
+ github.com/libp2p/go-libp2p-peerstore v0.8.0 // indirect
github.com/libp2p/go-libp2p-tls v0.5.0 // indirect
- github.com/libp2p/go-msgio v0.2.0 // indirect
github.com/libp2p/go-nat v0.1.0 // indirect
github.com/libp2p/go-netroute v0.2.0 // indirect
github.com/libp2p/go-openssl v0.1.0 // indirect
github.com/libp2p/go-reuseport v0.2.0 // indirect
- github.com/libp2p/go-yamux/v3 v3.1.2 // indirect
- github.com/lucas-clemente/quic-go v0.28.1 // indirect
+ github.com/libp2p/go-yamux/v4 v4.0.0 // indirect
+ github.com/lucas-clemente/quic-go v0.29.1 // indirect
github.com/lucasb-eyer/go-colorful v1.0.3 // indirect
github.com/magefile/mage v1.9.0 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
- github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect
- github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect
github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect
github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
@@ -283,13 +291,14 @@ require (
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base36 v0.1.0 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
- github.com/multiformats/go-multicodec v0.5.0 // indirect
+ github.com/multiformats/go-multicodec v0.6.0 // indirect
github.com/multiformats/go-multistream v0.3.3 // indirect
github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c // indirect
github.com/nkovacs/streamquote v1.0.0 // indirect
github.com/nxadm/tail v1.4.8 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect
github.com/opencontainers/runtime-spec v1.0.2 // indirect
+ github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
github.com/pkg/errors v0.9.1 // indirect
@@ -305,7 +314,9 @@ require (
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
+ github.com/twmb/murmur3 v1.1.6 // indirect
github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect
+ github.com/ugorji/go/codec v1.2.6 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.0.1 // indirect
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
@@ -313,19 +324,17 @@ require (
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
- github.com/zondax/hid v0.9.0 // indirect
+ github.com/zondax/hid v0.9.1 // indirect
github.com/zondax/ledger-go v0.12.1 // indirect
- go.opentelemetry.io/otel/metric v0.25.0 // indirect
- go.opentelemetry.io/otel/sdk/export/metric v0.25.0 // indirect
- go.opentelemetry.io/otel/trace v1.7.0 // indirect
+ go.opentelemetry.io/otel/metric v0.33.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v0.33.0 // indirect
+ go.opentelemetry.io/otel/trace v1.11.1 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/dig v1.12.0 // indirect
go4.org v0.0.0-20200411211856-f5505b9728dd // indirect
- golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
- golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 // indirect
+ golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
- golang.org/x/text v0.3.7 // indirect
google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect
google.golang.org/grpc v1.45.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
diff --git a/go.sum b/go.sum
index 79f7c7319..3e1b1fe77 100644
--- a/go.sum
+++ b/go.sum
@@ -49,12 +49,15 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM=
+github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
+github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
+github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg=
github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0=
-github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk=
-github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4=
+github.com/GeertJohan/go.rice v1.0.3 h1:k5viR+xGtIhF61125vCE1cmJ5957RQGXG6dmbaWZSmI=
+github.com/GeertJohan/go.rice v1.0.3/go.mod h1:XVdrU4pW00M4ikZed5q56tPf1v2KwnIKeIdc9CBYNt4=
github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ=
github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
@@ -99,6 +102,9 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
+github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18=
+github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
@@ -110,16 +116,17 @@ github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NR
github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo=
-github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
+github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
+github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
+github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ=
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
@@ -153,7 +160,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -164,6 +170,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
github.com/cilium/ebpf v0.4.0 h1:QlHdikaxALkqWasW8hAC1mfR0jdmvbfaBdBPFmRSglA=
github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
+github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
+github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@@ -177,6 +185,7 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA=
github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
+github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -189,23 +198,24 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
-github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/go-systemd/v22 v22.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU=
+github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
-github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
+github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg=
github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
-github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
-github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
+github.com/daaku/go.zipexe v1.0.2 h1:Zg55YLYTr7M9wjKn8SY/WcpuuEi+kR2u4E8RhvpyXmk=
+github.com/daaku/go.zipexe v1.0.2/go.mod h1:5xWogtqlYnfBXkSB1o9xysukNP9GTvaNkqzUZbt3Bw8=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -235,8 +245,9 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
+github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y=
github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM=
github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo=
@@ -255,6 +266,8 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elastic/go-elasticsearch/v7 v7.14.0 h1:extp3jos/rwJn3J+lgbaGlwAgs0TVsIHme00GyNAyX4=
+github.com/elastic/go-elasticsearch/v7 v7.14.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4=
github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg=
github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0=
github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY=
@@ -286,8 +299,8 @@ github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37o
github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8=
github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8=
github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE=
-github.com/filecoin-project/go-address v1.0.0 h1:IrexI0kpADLaPP+CdmU3CVAUqnW/FQC0KTmz4lVKiFU=
-github.com/filecoin-project/go-address v1.0.0/go.mod h1:5t3z6qPmIADZBtuE9EIzi0EwzcRy2nVhpo0I/c1r0OA=
+github.com/filecoin-project/go-address v1.1.0 h1:ofdtUtEsNxkIxkDw67ecSmvtzaVSdcea4boAmLbnHfE=
+github.com/filecoin-project/go-address v1.1.0/go.mod h1:5t3z6qPmIADZBtuE9EIzi0EwzcRy2nVhpo0I/c1r0OA=
github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM=
github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs=
github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o=
@@ -304,20 +317,22 @@ github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CY
github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg=
github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw=
github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30=
+github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837 h1:4cITW0pwgvqLs86Q9bWQa34+jBfR1V687bDkmv2DgnA=
+github.com/filecoin-project/go-commp-utils/nonffi v0.0.0-20220905160352-62059082a837/go.mod h1:e2YBjSblNVoBckkbv3PPqsq71q98oFkFqL7s1etViGo=
github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ=
github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o=
github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ=
github.com/filecoin-project/go-data-transfer v1.15.2 h1:PzqsFr2Q/onMGKrGh7TtRT0dKsJcVJrioJJnjnKmxlk=
github.com/filecoin-project/go-data-transfer v1.15.2/go.mod h1:qXOJ3IF5dEJQHykXXTwcaRxu17bXAxr+LglXzkL6bZQ=
-github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o=
-github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4=
+github.com/filecoin-project/go-ds-versioning v0.1.2 h1:to4pTadv3IeV1wvgbCbN6Vqd+fu+7tveXgv/rCEZy6w=
+github.com/filecoin-project/go-ds-versioning v0.1.2/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4=
github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ=
github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8=
github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ=
github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo=
github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8=
-github.com/filecoin-project/go-fil-markets v1.24.0 h1:SgZ9JU3vp7YubyTitEQK8hwEMm1l2Pko01jejviOKMA=
-github.com/filecoin-project/go-fil-markets v1.24.0/go.mod h1:ZOPAjEUia7H60F7p0kEupi0FR7Hy4Zfz90BpR1TMBwI=
+github.com/filecoin-project/go-fil-markets v1.25.2 h1:kVfgaamTC7dkn8KwS5zRJBNEBSNvVqdG3BCoDaUYuCI=
+github.com/filecoin-project/go-fil-markets v1.25.2/go.mod h1:dc2oTPU6GH3Qk1nA+Er+hSX64rg+NVykkPIWFBYxcZU=
github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM=
github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24=
github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM=
@@ -325,8 +340,8 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+
github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI=
github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI=
github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g=
-github.com/filecoin-project/go-jsonrpc v0.1.7 h1:Ti/QkQLI31v+6hvidA+i9Wv/NrS4CfHk0yXLntHX3Uk=
-github.com/filecoin-project/go-jsonrpc v0.1.7/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4=
+github.com/filecoin-project/go-jsonrpc v0.1.8 h1:uXX/ikAk3Q4f/k8DRd9Zw+fWnfiYb5I+UI1tzlQgHog=
+github.com/filecoin-project/go-jsonrpc v0.1.8/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4=
github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo=
github.com/filecoin-project/go-legs v0.4.4/go.mod h1:JQ3hA6xpJdbR8euZ2rO0jkxaMxeidXf0LDnVuqPAe9s=
github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak=
@@ -340,8 +355,9 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go
github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g=
github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
-github.com/filecoin-project/go-state-types v0.1.11 h1:QzKUILRGa9gjJKPCiFlvCfcDGK2IqtJ6CpRQULvZZpA=
-github.com/filecoin-project/go-state-types v0.1.11/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
+github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
+github.com/filecoin-project/go-state-types v0.10.0-alpha-3 h1:8iM9uz+rWRbrg1Zet+YlTJN4XEPNqRkqa3zay2pwV7w=
+github.com/filecoin-project/go-state-types v0.10.0-alpha-3/go.mod h1:FPgQE05BFwZxKw/vCuIaIrzfJKo4RPQQMMPGd43dAFI=
github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig=
github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc=
github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54=
@@ -350,8 +366,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd
github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo=
github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus=
github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8=
-github.com/filecoin-project/index-provider v0.8.1 h1:ggoBWvMSWR91HZQCWfv8SZjoTGNyJBwNMLuN9bJZrbU=
-github.com/filecoin-project/index-provider v0.8.1/go.mod h1:c/Ym5HtWPp9NQgNc9dgSBMpSNsZ/DE9FEi9qVubl5RM=
+github.com/filecoin-project/index-provider v0.9.1 h1:Jnh9dviIHvQxZ2baNoYu3n8z6F9O62ksnVlyREgPyyM=
+github.com/filecoin-project/index-provider v0.9.1/go.mod h1:NlHxQcy2iMGfUoUGUzrRxntcpiC50QSnvp68u2VTT40=
github.com/filecoin-project/pubsub v1.0.0 h1:ZTmT27U07e54qV1mMiQo4HDr0buo8I1LDHBYLXlsNXM=
github.com/filecoin-project/pubsub v1.0.0/go.mod h1:GkpB33CcUtUNrLPhJgfdy4FDx4OMNR9k+46DHx/Lqrg=
github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao=
@@ -372,11 +388,12 @@ github.com/filecoin-project/specs-actors/v7 v7.0.1 h1:w72xCxijK7xs1qzmJiw+WYJaVt
github.com/filecoin-project/specs-actors/v7 v7.0.1/go.mod h1:tPLEYXoXhcpyLh69Ccq91SOuLXsPWjHiY27CzawjUEk=
github.com/filecoin-project/specs-actors/v8 v8.0.1 h1:4u0tIRJeT5G7F05lwLRIsDnsrN+bJ5Ixj6h49Q7uE2Y=
github.com/filecoin-project/specs-actors/v8 v8.0.1/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA=
-github.com/filecoin-project/storetheindex v0.4.17 h1:w0dVc954TGPukoVbidlYvn9Xt+wVhk5vBvrqeJiRo8I=
-github.com/filecoin-project/storetheindex v0.4.17/go.mod h1:y2dL8C5D3PXi183hdxgGtM8vVYOZ1lg515tpl/D3tN8=
+github.com/filecoin-project/storetheindex v0.4.30-0.20221114113647-683091f8e893 h1:6GCuzxLVHBzlz7y+FkbHh6n0UyoEGWqDwJKQPJoz7bE=
+github.com/filecoin-project/storetheindex v0.4.30-0.20221114113647-683091f8e893/go.mod h1:S7590oDimBvXMUtzWsBXoshu9HtYKwtXl47zAK9rcP8=
github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg=
github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
+github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ=
github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
@@ -387,8 +404,10 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM
github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
+github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4=
@@ -521,8 +540,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
-github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -551,14 +571,15 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk=
github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
@@ -590,17 +611,27 @@ github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
+github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs=
+github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
+github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI=
+github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
@@ -612,6 +643,10 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/raft v1.1.1 h1:HJr7UE1x/JrJSc9Oy6aDBHtNHUUBHjcQjTgvUVihoZs=
+github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8=
+github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4=
+github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
@@ -644,8 +679,8 @@ github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSA
github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs=
github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo=
github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA=
-github.com/ipfs/go-bitswap v0.8.0 h1:UEV7kogQu2iGggkE9GhLykDrRCUpsNnpu2NODww/srw=
-github.com/ipfs/go-bitswap v0.8.0/go.mod h1:/h8sBij8UVEaNWl8ABzpLRA5Y1cttdNUnpeGo2AA/LQ=
+github.com/ipfs/go-bitswap v0.10.2 h1:B81RIwkTnIvSYT1ZCzxjYTeF0Ek88xa9r1AMpTfk+9Q=
+github.com/ipfs/go-bitswap v0.10.2/go.mod h1:+fZEvycxviZ7c+5KlKwTzLm0M28g2ukCPqiuLfJk4KA=
github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc=
github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc=
@@ -666,8 +701,9 @@ github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnO
github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o=
-github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0=
github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro=
+github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc=
+github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw=
github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
@@ -680,8 +716,9 @@ github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X
github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs=
github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
-github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ=
github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
+github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk=
+github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8=
@@ -705,8 +742,8 @@ github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHL
github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM=
github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U=
github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc=
-github.com/ipfs/go-graphsync v0.13.1 h1:lWiP/WLycoPUYyj3IDEi1GJNP30kFuYOvimcfeuZyQs=
-github.com/ipfs/go-graphsync v0.13.1/go.mod h1:y8e8G6CmZeL9Srvx1l15CtGiRdf3h5JdQuqPz/iYL0A=
+github.com/ipfs/go-graphsync v0.13.2 h1:+7IjTrdg3+3iwtPXSkLoxvhaByS3+3b9NStMAowFqkw=
+github.com/ipfs/go-graphsync v0.13.2/go.mod h1:TO1Y65spARny/t37hkid5xCpQJ6vR7A7VFTEUb0Z6eA=
github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08=
github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw=
github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE=
@@ -773,8 +810,8 @@ github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxn
github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI=
github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc=
github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg=
-github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a h1:5UPw4plVUYhbZjY9ZWSLVEWUyYWQIM3WYumZQfBlPXI=
-github.com/ipfs/go-ipns v0.1.3-0.20220819140646-0d8e99ba180a/go.mod h1:VHLj6/KLxdj+a5BTwpKRoHhtw+TP+hcb0ZUpQSqW4fI=
+github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A=
+github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24=
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA=
github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I=
@@ -794,6 +831,7 @@ github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g=
github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo=
+github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto=
@@ -801,8 +839,9 @@ github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB
github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk=
github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M=
github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4=
-github.com/ipfs/go-merkledag v0.6.0 h1:oV5WT2321tS4YQVOPgIrWHvJ0lJobRTerU+i9nmUCuA=
github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0=
+github.com/ipfs/go-merkledag v0.8.1 h1:N3yrqSre/ffvdwtHL4MXy0n7XH+VzN8DlzDrJySPa94=
+github.com/ipfs/go-merkledag v0.8.1/go.mod h1:uYUlWE34GhbcTjGuUDEcdPzsEtOdnOupL64NgSRjmWI=
github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s=
@@ -813,17 +852,20 @@ github.com/ipfs/go-path v0.3.0/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1X
github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ=
github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U=
github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU=
-github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE=
github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU=
+github.com/ipfs/go-peertaskqueue v0.8.0 h1:JyNO144tfu9bx6Hpo119zvbEL9iQ760FHOiJYsUjqaU=
+github.com/ipfs/go-peertaskqueue v0.8.0/go.mod h1:cz8hEnnARq4Du5TGqiWKgMr/BOSQ5XOgMOh1K5YYKKM=
github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k=
github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw=
-github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8=
github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o=
+github.com/ipfs/go-unixfs v0.4.0 h1:qSyyxfB/OiDdWHYiSbyaqKC7zfSE/TFL0QdwkRjBm20=
+github.com/ipfs/go-unixfs v0.4.0/go.mod h1:I7Nqtm06HgOOd+setAoCU6rf/HgVFHE+peeNuOv/5+g=
github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s=
github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA=
github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo=
-github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E=
github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0=
+github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs=
+github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU=
github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o=
github.com/ipfs/interface-go-ipfs-core v0.7.0 h1:7tb+2upz8oCcjIyjo1atdMk+P+u7wPmI+GksBlLE8js=
github.com/ipfs/interface-go-ipfs-core v0.7.0/go.mod h1:lF27E/nnSPbylPqKVXGZghal2hzifs3MmjyiEjnc9FY=
@@ -833,13 +875,15 @@ github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBH
github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ=
github.com/ipld/go-car v0.4.0/go.mod h1:Uslcn4O9cBKK9wqHm/cLTFacg6RAPv6LZx2mxd2Ypl4=
github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI=
-github.com/ipld/go-car/v2 v2.4.1 h1:9S+FYbQzQJ/XzsdiOV13W5Iu/i+gUnr6csbSD9laFEg=
-github.com/ipld/go-car/v2 v2.4.1/go.mod h1:zjpRf0Jew9gHqSvjsKVyoq9OY9SWoEKdYCQUKVaaPT0=
+github.com/ipld/go-car/v2 v2.5.0 h1:S9h7A6qBAJ+B1M1jIKtau+HPDe30UbM71vsyBzwvRIE=
+github.com/ipld/go-car/v2 v2.5.0/go.mod h1:jKjGOqoCj5zn6KjnabD6JbnCsMntqU2hLiU6baZVO3E=
github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s=
github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA=
github.com/ipld/go-codec-dagpb v1.3.1/go.mod h1:ErNNglIi5KMur/MfFE/svtgQthzVvf+43MrzLbpcIZY=
-github.com/ipld/go-codec-dagpb v1.3.2 h1:MZQUIjanHXXfDuYmtWYT8nFbqfFsZuyHClj6VDmSXr4=
-github.com/ipld/go-codec-dagpb v1.3.2/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA=
+github.com/ipld/go-codec-dagpb v1.5.0 h1:RspDRdsJpLfgCI0ONhTAnbHdySGD4t+LHSPK4X1+R0k=
+github.com/ipld/go-codec-dagpb v1.5.0/go.mod h1:0yRIutEFD8o1DGVqw4RSHh+BUTlJA9XWldxaaWR/o4g=
+github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 h1:QAI/Ridj0+foHD6epbxmB4ugxz9B4vmNdYSmQLGa05E=
+github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0/go.mod h1:odxGcpiQZLzP5+yGu84Ljo8y3EzCvNAQKEodHNsHLXA=
github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w=
github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
@@ -847,8 +891,9 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/
github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM=
github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA=
-github.com/ipld/go-ipld-prime v0.17.0 h1:+U2peiA3aQsE7mrXjD2nYZaZrCcakoz2Wge8K42Ld8g=
github.com/ipld/go-ipld-prime v0.17.0/go.mod h1:aYcKm5TIvGfY8P3QBKz/2gKcLxzJ1zDaD+o0bOowhgs=
+github.com/ipld/go-ipld-prime v0.18.0 h1:xUk7NUBSWHEXdjiOu2sLXouFJOMs0yoYzeI5RAqhYQo=
+github.com/ipld/go-ipld-prime v0.18.0/go.mod h1:735yXW548CKrLwVCYXzqx90p5deRJMVVxM9eJ4Qe+qE=
github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ=
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY=
@@ -919,13 +964,16 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo=
+github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0=
-github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
+github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0=
+github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/koalacxr/quantile v0.0.1 h1:wAW+SQ286Erny9wOjVww96t8ws+x5Zj6AKHDULUK+o0=
github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -963,8 +1011,6 @@ github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6N
github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM=
github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8=
-github.com/libp2p/go-eventbus v0.3.0 h1:FCHfSpM469NSXipOoX3npAP7bJHSAmUIxj1qe8AtT5k=
-github.com/libp2p/go-eventbus v0.3.0/go.mod h1:d+p2Q4lgRHTBLwOXdzX0hOl8D4hiHHNgcoy1MuomBHU=
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
@@ -977,12 +1023,13 @@ github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZk
github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k=
github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw=
github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o=
+github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo=
github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0=
-github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4=
+github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM=
github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw=
-github.com/libp2p/go-libp2p v0.22.0 h1:2Tce0kHOp5zASFKJbNzRElvh0iZwdtG5uZheNW8chIw=
-github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4=
-github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo=
+github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY=
+github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE=
+github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI=
github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I=
github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw=
github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI=
@@ -992,8 +1039,8 @@ github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/
github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI=
github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI=
github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A=
+github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk=
github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk=
-github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o=
github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg=
github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc=
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
@@ -1005,10 +1052,13 @@ github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk
github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU=
github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo=
github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA=
+github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M=
github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0=
github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik=
github.com/libp2p/go-libp2p-connmgr v0.4.0 h1:q/KZUS1iMDIQckMZarMYwhQisJqiFPHAVC1c4DR3hDE=
github.com/libp2p/go-libp2p-connmgr v0.4.0/go.mod h1:exFQQm19PFAx+QuJmBPw4MM58QejzPJRFFFYnNmgi2w=
+github.com/libp2p/go-libp2p-consensus v0.0.1 h1:jcVbHRZLwTXU9iT/mPi+Lx4/OrIzq3bU1TbZNhYFCV8=
+github.com/libp2p/go-libp2p-consensus v0.0.1/go.mod h1:+9Wrfhc5QOqWB0gXI0m6ARlkHfdJpcFXmRU0WoHz4Mo=
github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco=
github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco=
github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE=
@@ -1040,8 +1090,10 @@ github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQR
github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
-github.com/libp2p/go-libp2p-core v0.20.0 h1:PGKM74+T+O/FaZNARNW32i90RMBHCcgd/hkum2UQ5eY=
-github.com/libp2p/go-libp2p-core v0.20.0/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY=
+github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8=
+github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs=
+github.com/libp2p/go-libp2p-core v0.20.1 h1:fQz4BJyIFmSZAiTbKV8qoYhEH5Dtv/cVhZbG3Ib/+Cw=
+github.com/libp2p/go-libp2p-core v0.20.1/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY=
github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE=
github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I=
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
@@ -1051,20 +1103,22 @@ github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfx
github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw=
github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug=
github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8=
-github.com/libp2p/go-libp2p-gostream v0.4.0 h1:heduMMEB78yBqeEQv+P7Fn5X926MHC2jDIC7/7yLpYA=
-github.com/libp2p/go-libp2p-gostream v0.4.0/go.mod h1:21DVGBcCQwRfEXZpCnZ2kG24QiEkBpEQvG53gYXE4u0=
+github.com/libp2p/go-libp2p-gorpc v0.4.0 h1:kxHg5C3IuXeOq5FHPGbMHwQzKDlTVeB/NDr0ndc8J/g=
+github.com/libp2p/go-libp2p-gorpc v0.4.0/go.mod h1:jux2Mb6BfUE1n58KbVCmWtqvpiZo0DDaKobKInf4s5o=
+github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI=
+github.com/libp2p/go-libp2p-gostream v0.5.0 h1:niNGTUrFoUDP/8jxMgu97zngMO+UGYBpVpbCKwIJBls=
+github.com/libp2p/go-libp2p-gostream v0.5.0/go.mod h1:rXrb0CqfcRRxa7m3RSKORQiKiWgk3IPeXWda66ZXKsA=
github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go=
github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8=
github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
-github.com/libp2p/go-libp2p-kad-dht v0.17.0 h1:HWEjqjNVDuf8yuccuswGy1vYGzB0v4Z+yQ4DMDMSIqk=
-github.com/libp2p/go-libp2p-kad-dht v0.17.0/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk=
-github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70=
-github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk=
+github.com/libp2p/go-libp2p-kad-dht v0.18.0 h1:akqO3gPMwixR7qFSFq70ezRun97g5hrA/lBW9jrjUYM=
+github.com/libp2p/go-libp2p-kad-dht v0.18.0/go.mod h1:Gb92MYIPm3K2pJLGn8wl0m8wiKDvHrYpg+rOd0GzzPA=
+github.com/libp2p/go-libp2p-kbucket v0.5.0 h1:g/7tVm8ACHDxH29BGrpsQlnNeu+6OF1A9bno/4/U1oA=
+github.com/libp2p/go-libp2p-kbucket v0.5.0/go.mod h1:zGzGCpQd78b5BNTDGHNDLaTt9aDK/A02xeZp9QeFC4U=
github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg=
-github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8=
github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90=
github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08=
github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I=
@@ -1074,6 +1128,7 @@ github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw
github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek=
github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw=
github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g=
+github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M=
github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE=
github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw=
@@ -1082,10 +1137,10 @@ github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8
github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c=
github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q=
github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU=
-github.com/libp2p/go-libp2p-netutil v0.2.0 h1:DecSQ5nRnE5RfOmlNx+qubPL+rX8NSC6vyPRCiJXzg4=
-github.com/libp2p/go-libp2p-netutil v0.2.0/go.mod h1:5ny0YEgWwWLxPwRJn5gGYr5bh9msiDI1CStSesvqYRM=
+github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM=
github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q=
github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ=
+github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU=
github.com/libp2p/go-libp2p-noise v0.5.0 h1:gwJZ/3iH3MRnBrLIyr/YLdCOnmqfJMptlsFFUIc3j0Y=
github.com/libp2p/go-libp2p-noise v0.5.0/go.mod h1:CYYpJ+T4pox1d1J/hhUVxuMf6b2s3c41hFUgS8/yFQw=
github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo=
@@ -1102,23 +1157,27 @@ github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD
github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0=
github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc=
-github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw=
-github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0=
+github.com/libp2p/go-libp2p-peerstore v0.8.0 h1:bzTG693TA1Ju/zKmUCQzDLSqiJnyRFVwPpuloZ/OZtI=
+github.com/libp2p/go-libp2p-peerstore v0.8.0/go.mod h1:9geHWmNA3YDlQBjL/uPEJD6vpDK12aDNlUNHJ6kio/s=
github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA=
github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s=
github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk=
github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg=
-github.com/libp2p/go-libp2p-pubsub v0.8.0 h1:KygfDpaa9AeUPGCVcpVenpXNFauDn+5kBYu3EjcL3Tg=
-github.com/libp2p/go-libp2p-pubsub v0.8.0/go.mod h1:e4kT+DYjzPUYGZeWk4I+oxCSYTXizzXii5LDRRhjKSw=
+github.com/libp2p/go-libp2p-pubsub v0.8.2 h1:QLGUmkgKmwEVxVDYGsqc5t9CykOMY2Y21cXQHjR462I=
+github.com/libp2p/go-libp2p-pubsub v0.8.2/go.mod h1:e4kT+DYjzPUYGZeWk4I+oxCSYTXizzXii5LDRRhjKSw=
github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA=
github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc=
-github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ=
github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ=
+github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ=
+github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM=
+github.com/libp2p/go-libp2p-raft v0.1.8 h1:Fq0aWHbbhi6WJXf+yaOQeMzV+9UgkbHIIGyaJbH3vpo=
+github.com/libp2p/go-libp2p-raft v0.1.8/go.mod h1:+YDisn3uszb7vxshLgKoDdRGs79WSbHRgrOdrYqDPk4=
github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q=
github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q=
github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk=
-github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0=
-github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4=
+github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0=
+github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk=
+github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ=
github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys=
github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY=
github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw=
@@ -1133,9 +1192,12 @@ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaT
github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM=
github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM=
github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk=
+github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw=
github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4=
github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc=
github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8=
+github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA=
+github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs=
github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
@@ -1148,11 +1210,14 @@ github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotl
github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0=
github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A=
github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A=
-github.com/libp2p/go-libp2p-testing v0.6.1-0.20211213091545-6aa944478bd3/go.mod h1:KB5rnDAM6eNBajC8qYV6hUvBaqIH0w0plTDA5yV9QlA=
+github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E=
+github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU=
+github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU=
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M=
github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY=
github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY=
+github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw=
github.com/libp2p/go-libp2p-tls v0.5.0 h1:aRNTeOI8Ljm1r4L2uMGxkMsVnyZoPwaqQqMw23qAsQs=
github.com/libp2p/go-libp2p-tls v0.5.0/go.mod h1:1a4tq0xQSZ0kAkDkZVAppuP3SAIUHcnzi2djJ/2EN4I=
github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk=
@@ -1161,10 +1226,13 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2
github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA=
github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns=
github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o=
+github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s=
github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk=
github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw=
github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo=
github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo=
+github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg=
+github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg=
github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8=
github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4=
github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
@@ -1175,9 +1243,12 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL
github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4=
github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30=
github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po=
+github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4=
github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE=
-github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k=
github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08=
+github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8=
+github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE=
+github.com/libp2p/go-libp2p-yamux v0.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA=
github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
@@ -1190,6 +1261,7 @@ github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3
github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk=
github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ=
github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ=
+github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E=
github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
@@ -1232,12 +1304,17 @@ github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqX
github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw=
github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA=
+github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw=
github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o=
github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0=
+github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M=
github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU=
+github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU=
github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI=
+github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y=
+github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y=
github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I=
github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc=
github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU=
@@ -1246,6 +1323,7 @@ github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzl
github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk=
github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA=
github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg=
+github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU=
github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
@@ -1255,18 +1333,26 @@ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ
github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
+github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U=
github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ=
github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs=
-github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q=
+github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo=
+github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo=
+github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4=
github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4=
+github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ=
+github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4=
github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8=
github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
-github.com/lucas-clemente/quic-go v0.28.1 h1:Uo0lvVxWg5la9gflIF9lwa39ONq85Xq2D91YNEIslzU=
-github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0=
+github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg=
+github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI=
+github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI=
+github.com/lucas-clemente/quic-go v0.29.1 h1:Z+WMJ++qMLhvpFkRZA+jl3BTxUjm415YBmWanXB8zP0=
+github.com/lucas-clemente/quic-go v0.29.1/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE=
github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg=
@@ -1282,23 +1368,24 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs=
github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs=
github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
-github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ=
github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8=
-github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ=
-github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s=
+github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s=
+github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI=
+github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM=
github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
-github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU=
github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
+github.com/marten-seemann/webtransport-go v0.1.1 h1:TnyKp3pEXcDooTaNn4s9dYpMJ7kMnTp7k5h+SgYP/mc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -1309,6 +1396,7 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
@@ -1334,8 +1422,10 @@ github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00v
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
+github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
+github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
@@ -1374,8 +1464,9 @@ github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
-github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE=
github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM=
+github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
+github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
@@ -1390,8 +1481,10 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4
github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc=
github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0=
github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc=
-github.com/multiformats/go-multiaddr v0.6.0 h1:qMnoOPj2s8xxPU5kZ57Cqdr0hHhARz7mFsPMIiYNqzg=
-github.com/multiformats/go-multiaddr v0.6.0/go.mod h1:F4IpaKZuPP360tOMn2Tpyu0At8w23aRyVqeK0DbFeGM=
+github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM=
+github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug=
+github.com/multiformats/go-multiaddr v0.7.0 h1:gskHcdaCyPtp9XskVwtvEeQOG465sCohbQIirSyqxrc=
+github.com/multiformats/go-multiaddr v0.7.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs=
github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0=
@@ -1415,8 +1508,10 @@ github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1
github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ=
github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
-github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs=
+github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues=
+github.com/multiformats/go-multicodec v0.6.0 h1:KhH2kSuCARyuJraYMFxrNO3DqIaYhOdS039kbhgVwpE=
+github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw=
github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
@@ -1432,8 +1527,10 @@ github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wS
github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38=
+github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k=
github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k=
github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs=
+github.com/multiformats/go-multistream v0.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg=
github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o=
github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg=
github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
@@ -1479,8 +1576,8 @@ github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
+github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 h1:CznVS40zms0Dj5he4ERo+fRPtO0qxUk8lA8Xu3ddet0=
github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI=
@@ -1505,6 +1602,8 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
+github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
@@ -1534,13 +1633,15 @@ github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU=
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU=
+github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -1561,6 +1662,7 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9
github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc=
@@ -1643,8 +1745,8 @@ github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
-github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w=
github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
+github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN23diwyr69Qs=
github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
@@ -1700,6 +1802,9 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
+github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg=
+github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U=
@@ -1707,14 +1812,19 @@ github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW
github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw=
github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
+github.com/ugorji/go v1.1.13/go.mod h1:jxau1n+/wyTGLQoCkjok9r5zFa/FxT6eI5HiHKQszjc=
+github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU=
+github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
+github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
-github.com/urfave/cli/v2 v2.8.1 h1:CGuYNZF9IKZY/rfBe3lJpccSoIY1ytfvmgQT90cNOl4=
-github.com/urfave/cli/v2 v2.8.1/go.mod h1:Z41J9TPoffeoqP0Iza0YbAhGvymRdZAd2uPmZ5JxRdY=
+github.com/urfave/cli/v2 v2.16.3 h1:gHoFIwpPjoyIMbJp/VFd+/vuD0dAgFK4B6DpEMFJfQk=
+github.com/urfave/cli/v2 v2.16.3/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8=
@@ -1723,6 +1833,7 @@ github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49u
github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0=
github.com/warpfork/go-testmark v0.10.0 h1:E86YlUMYfwIacEsQGlnTvjk1IgYkyTGjPhF0RnwTCmw=
+github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0=
github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w=
@@ -1748,8 +1859,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f
github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 h1:DOOT2B85S0tHoLGTzV+FakaSSihgRCVwZkjqKQP5L/w=
github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
+github.com/whyrusleeping/cbor-gen v0.0.0-20220514204315-f29c37e9c44c h1:6VPKXBDRt7mDUyiHx9X8ROnPYFDf3L7OfEuKCI5dZDI=
+github.com/whyrusleeping/cbor-gen v0.0.0-20220514204315-f29c37e9c44c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
@@ -1779,8 +1891,10 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
+github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo=
+github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU=
github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo=
go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs=
@@ -1804,34 +1918,30 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I=
-go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
-go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
-go.opentelemetry.io/otel/bridge/opencensus v0.25.0 h1:18Ww8TpCEGes12HZJzB2nEbUglvMLzPxqgZypsrKiNc=
-go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs=
+go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4=
+go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE=
+go.opentelemetry.io/otel/bridge/opencensus v0.33.0 h1:DnSFYr/VxUVwkHL0UoaMcxx74Jugb1HO0B08cYBmi0c=
+go.opentelemetry.io/otel/bridge/opencensus v0.33.0/go.mod h1:gylOY4P2e7kPYc6T9M8XfQ5+RK4+evGorTOOy+gO4Nc=
go.opentelemetry.io/otel/exporters/jaeger v1.2.0 h1:C/5Egj3MJBXRJi22cSl07suqPqtZLnLFmH//OxETUEc=
go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E=
-go.opentelemetry.io/otel/internal/metric v0.25.0 h1:w/7RXe16WdPylaIXDgcYM6t/q0K5lXgSdZOEbIEyliE=
-go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc=
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
-go.opentelemetry.io/otel/metric v0.25.0 h1:7cXOnCADUsR3+EOqxPaSKwhEuNu0gz/56dRN1hpIdKw=
-go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8=
+go.opentelemetry.io/otel/metric v0.33.0 h1:xQAyl7uGEYvrLAiV/09iTJlp1pZnQ9Wl793qbVvED1E=
+go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI=
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
-go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo=
go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U=
-go.opentelemetry.io/otel/sdk/export/metric v0.25.0 h1:6UjAFmVB5Fza3K5qUJpYWGrk8QMPIqlSnya5FI46VBY=
-go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk=
-go.opentelemetry.io/otel/sdk/metric v0.25.0 h1:J+Ta+4IAA5W9AdWhGQLfciEpavBqqSkBzTDeYvJLFNU=
-go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg=
+go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs=
+go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys=
+go.opentelemetry.io/otel/sdk/metric v0.33.0 h1:oTqyWfksgKoJmbrs2q7O7ahkJzt+Ipekihf8vhpa9qo=
+go.opentelemetry.io/otel/sdk/metric v0.33.0/go.mod h1:xdypMeA21JBOvjjzDUtD0kzIcHO/SPez+a8HOzJPGp0=
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0=
-go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
-go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ=
+go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -1851,6 +1961,7 @@ go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
+go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
@@ -1867,8 +1978,9 @@ go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
-go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0=
-go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
+go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
+go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU=
go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg=
@@ -1898,6 +2010,7 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -1910,9 +2023,11 @@ golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
-golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
+golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1926,8 +2041,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc=
golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc=
-golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E=
-golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
+golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b h1:SCE/18RnFsLrjydh/R/s5EVvHoZprqEQUuoxK8q2Pc4=
+golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1954,6 +2069,7 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -2017,12 +2133,13 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E=
-golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 h1:KafLifaRFIuSJ5C+7CyFJOF9haxKNC1CEIDk8GX6X0k=
+golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -2044,8 +2161,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220907140024-f12130a52804 h1:0SH2R3f1b1VmIMG7BXbEZCBUu2dKmHschSmjqGUrW8A=
+golang.org/x/sync v0.0.0-20220907140024-f12130a52804/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2072,6 +2190,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -2143,14 +2262,15 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
+golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -2169,8 +2289,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ=
+golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -2233,14 +2353,16 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
@@ -2348,6 +2470,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
diff --git a/itests/api_test.go b/itests/api_test.go
index 7eac4e8a3..2afbc0bd0 100644
--- a/itests/api_test.go
+++ b/itests/api_test.go
@@ -10,6 +10,7 @@ import (
logging "github.com/ipfs/go-log/v2"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/stretchr/testify/require"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/big"
@@ -51,6 +52,8 @@ func runAPITest(t *testing.T, opts ...interface{}) {
t.Run("testMiningReal", ts.testMiningReal)
t.Run("testSlowNotify", ts.testSlowNotify)
t.Run("testSearchMsg", ts.testSearchMsg)
+ t.Run("testOutOfGasError", ts.testOutOfGasError)
+ t.Run("testLookupNotFoundError", ts.testLookupNotFoundError)
t.Run("testNonGenesisMiner", ts.testNonGenesisMiner)
}
@@ -149,6 +152,46 @@ func (ts *apiSuite) testSearchMsg(t *testing.T) {
require.Equalf(t, res.TipSet, searchRes.TipSet, "search ts: %s, different from wait ts: %s", searchRes.TipSet, res.TipSet)
}
+func (ts *apiSuite) testOutOfGasError(t *testing.T) {
+ ctx := context.Background()
+
+ full, _, _ := kit.EnsembleMinimal(t, ts.opts...)
+
+ senderAddr, err := full.WalletDefaultAddress(ctx)
+ require.NoError(t, err)
+
+ // the gas estimator API executes the message with gasLimit = BlockGasLimit
+ // Lowering it to 2 will cause it to run out of gas, testing the failure case we want
+ originalLimit := build.BlockGasLimit
+ build.BlockGasLimit = 2
+ defer func() {
+ build.BlockGasLimit = originalLimit
+ }()
+
+ msg := &types.Message{
+ From: senderAddr,
+ To: senderAddr,
+ Value: big.Zero(),
+ }
+
+ _, err = full.GasEstimateMessageGas(ctx, msg, nil, types.EmptyTSK)
+ require.Error(t, err, "should have failed")
+ require.True(t, xerrors.Is(err, &lapi.ErrOutOfGas{}))
+}
+
+func (ts *apiSuite) testLookupNotFoundError(t *testing.T) {
+ ctx := context.Background()
+
+ full, _, _ := kit.EnsembleMinimal(t, ts.opts...)
+
+ addr, err := full.WalletNew(ctx, types.KTSecp256k1)
+ require.NoError(t, err)
+
+ _, err = full.StateLookupID(ctx, addr, types.EmptyTSK)
+ require.Error(t, err)
+ require.True(t, xerrors.Is(err, &lapi.ErrActorNotFound{}))
+}
+
func (ts *apiSuite) testMining(t *testing.T) {
ctx := context.Background()
diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go
index 909b5691e..819340ea1 100644
--- a/itests/ccupgrade_test.go
+++ b/itests/ccupgrade_test.go
@@ -71,6 +71,7 @@ func runTestCCUpgrade(t *testing.T) *kit.TestFullNode {
{
si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK)
require.NoError(t, err)
+ require.NotNil(t, si)
require.Less(t, 50000, int(si.Expiration))
}
client.WaitForSectorActive(ctx, t, CCUpgrade, maddr)
diff --git a/itests/deadlines_test.go b/itests/deadlines_test.go
index a2b0bde88..472e66abc 100644
--- a/itests/deadlines_test.go
+++ b/itests/deadlines_test.go
@@ -160,7 +160,7 @@ func TestDeadlineToggling(t *testing.T) {
build.Clock.Sleep(blocktime)
}
- checkMiner := func(ma address.Address, power abi.StoragePower, active, activeIfCron bool, tsk types.TipSetKey) {
+ checkMiner := func(ma address.Address, power abi.StoragePower, active bool, tsk types.TipSetKey) {
//stm: @CHAIN_STATE_MINER_POWER_001
p, err := client.StateMinerPower(ctx, ma, tsk)
require.NoError(t, err)
@@ -178,21 +178,6 @@ func TestDeadlineToggling(t *testing.T) {
act, err := mst.DeadlineCronActive()
require.NoError(t, err)
- if tsk != types.EmptyTSK {
- ts, err := client.ChainGetTipSet(ctx, tsk)
- require.NoError(t, err)
- di, err := mst.DeadlineInfo(ts.Height())
- require.NoError(t, err)
-
- // cron happened on the same epoch some other condition would have happened
- if di.Open == ts.Height() {
- act, err := mst.DeadlineCronActive()
- require.NoError(t, err)
- require.Equal(t, activeIfCron, act)
- return
- }
- }
-
require.Equal(t, active, act)
}
@@ -200,7 +185,7 @@ func TestDeadlineToggling(t *testing.T) {
{
uts, err := client.ChainGetTipSetByHeight(ctx, upgradeH+2, types.EmptyTSK)
require.NoError(t, err)
- checkMiner(maddrB, types.NewInt(0), true, true, uts.Key())
+ checkMiner(maddrB, types.NewInt(0), true, uts.Key())
}
//stm: @CHAIN_STATE_NETWORK_VERSION_001
@@ -218,19 +203,19 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err)
// first round of miner checks
- checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.DefaultPresealsPerBootstrapMiner), true, true, types.EmptyTSK)
- checkMiner(maddrC, types.NewInt(uint64(ssz)*sectorsC), true, true, types.EmptyTSK)
+ checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.DefaultPresealsPerBootstrapMiner), true, types.EmptyTSK)
+ checkMiner(maddrC, types.NewInt(uint64(ssz)*sectorsC), true, types.EmptyTSK)
- checkMiner(maddrB, types.NewInt(0), false, false, types.EmptyTSK)
- checkMiner(maddrD, types.NewInt(0), false, false, types.EmptyTSK)
- checkMiner(maddrE, types.NewInt(0), false, false, types.EmptyTSK)
+ checkMiner(maddrB, types.NewInt(0), false, types.EmptyTSK)
+ checkMiner(maddrD, types.NewInt(0), false, types.EmptyTSK)
+ checkMiner(maddrE, types.NewInt(0), false, types.EmptyTSK)
// pledge sectors on minerB/minerD, stop post on minerC
minerB.PledgeSectors(ctx, sectorsB, 0, nil)
- checkMiner(maddrB, types.NewInt(0), true, true, types.EmptyTSK)
+ checkMiner(maddrB, types.NewInt(0), true, types.EmptyTSK)
minerD.PledgeSectors(ctx, sectorsD, 0, nil)
- checkMiner(maddrD, types.NewInt(0), true, true, types.EmptyTSK)
+ checkMiner(maddrD, types.NewInt(0), true, types.EmptyTSK)
minerC.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).Fail()
@@ -281,7 +266,7 @@ func TestDeadlineToggling(t *testing.T) {
build.Clock.Sleep(blocktime)
}
- checkMiner(maddrE, types.NewInt(0), true, true, types.EmptyTSK)
+ checkMiner(maddrE, types.NewInt(0), true, types.EmptyTSK)
// go through rest of the PP
for {
@@ -296,11 +281,11 @@ func TestDeadlineToggling(t *testing.T) {
}
// second round of miner checks
- checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.DefaultPresealsPerBootstrapMiner), true, true, types.EmptyTSK)
- checkMiner(maddrC, types.NewInt(0), true, true, types.EmptyTSK)
- checkMiner(maddrB, types.NewInt(uint64(ssz)*sectorsB), true, true, types.EmptyTSK)
- checkMiner(maddrD, types.NewInt(uint64(ssz)*sectorsD), true, true, types.EmptyTSK)
- checkMiner(maddrE, types.NewInt(0), false, false, types.EmptyTSK)
+ checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.DefaultPresealsPerBootstrapMiner), true, types.EmptyTSK)
+ checkMiner(maddrC, types.NewInt(0), true, types.EmptyTSK)
+ checkMiner(maddrB, types.NewInt(uint64(ssz)*sectorsB), true, types.EmptyTSK)
+ checkMiner(maddrD, types.NewInt(uint64(ssz)*sectorsD), true, types.EmptyTSK)
+ checkMiner(maddrE, types.NewInt(0), false, types.EmptyTSK)
// disable post on minerB
minerB.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).Fail()
@@ -353,8 +338,10 @@ func TestDeadlineToggling(t *testing.T) {
require.NoError(t, err)
require.Equal(t, exitcode.Ok, r.Receipt.ExitCode)
- // assert inactive if the message landed in the tipset we run cron in
- checkMiner(maddrD, types.NewInt(0), true, false, r.TipSet)
+ // assert miner has no power
+ p, err := client.StateMinerPower(ctx, maddrD, r.TipSet)
+ require.NoError(t, err)
+ require.True(t, p.MinerPower.RawBytePower.IsZero())
}
// go through another PP
@@ -369,8 +356,8 @@ func TestDeadlineToggling(t *testing.T) {
build.Clock.Sleep(blocktime)
}
- checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.DefaultPresealsPerBootstrapMiner), true, true, types.EmptyTSK)
- checkMiner(maddrC, types.NewInt(0), true, true, types.EmptyTSK)
- checkMiner(maddrB, types.NewInt(0), true, true, types.EmptyTSK)
- checkMiner(maddrD, types.NewInt(0), false, false, types.EmptyTSK)
+ checkMiner(maddrA, types.NewInt(uint64(ssz)*kit.DefaultPresealsPerBootstrapMiner), true, types.EmptyTSK)
+ checkMiner(maddrC, types.NewInt(0), true, types.EmptyTSK)
+ checkMiner(maddrB, types.NewInt(0), true, types.EmptyTSK)
+ checkMiner(maddrD, types.NewInt(0), false, types.EmptyTSK)
}
diff --git a/itests/deals_offline_test.go b/itests/deals_offline_test.go
index 9b8354d36..997d7723a 100644
--- a/itests/deals_offline_test.go
+++ b/itests/deals_offline_test.go
@@ -14,7 +14,7 @@ import (
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/lotus/api"
+ lapi "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/itests/kit"
)
@@ -81,7 +81,7 @@ func TestOfflineDealFlow(t *testing.T) {
// Create a CAR file from the raw file
carFileDir := t.TempDir()
carFilePath := filepath.Join(carFileDir, "out.car")
- err = client.ClientGenCar(ctx, api.FileRef{Path: inFile}, carFilePath)
+ err = client.ClientGenCar(ctx, lapi.FileRef{Path: inFile}, carFilePath)
require.NoError(t, err)
// Import the CAR file on the miner - this is the equivalent to
diff --git a/itests/deals_remote_retrieval_test.go b/itests/deals_remote_retrieval_test.go
new file mode 100644
index 000000000..c0a37e69e
--- /dev/null
+++ b/itests/deals_remote_retrieval_test.go
@@ -0,0 +1,104 @@
+package itests
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "io"
+ "net/url"
+ "os"
+ "path"
+ "testing"
+ "time"
+
+ "github.com/google/uuid"
+ "github.com/gorilla/websocket"
+ "github.com/ipld/go-car"
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+
+ "github.com/filecoin-project/lotus/api"
+ bstore "github.com/filecoin-project/lotus/blockstore"
+ "github.com/filecoin-project/lotus/itests/kit"
+)
+
+func TestNetStoreRetrieval(t *testing.T) {
+ kit.QuietMiningLogs()
+
+ blocktime := 5 * time.Millisecond
+ ctx := context.Background()
+
+ full, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC())
+ ens.InterconnectAll().BeginMining(blocktime)
+
+ time.Sleep(5 * time.Second)
+
+ // For these tests where the block time is artificially short, just use
+ // a deal start epoch that is guaranteed to be far enough in the future
+ // so that the deal starts sealing in time
+ dealStartEpoch := abi.ChainEpoch(2 << 12)
+
+ rseed := 7
+
+ dh := kit.NewDealHarness(t, full, miner, miner)
+ dealCid, res, _ := dh.MakeOnlineDeal(context.Background(), kit.MakeFullDealParams{
+ Rseed: rseed,
+ StartEpoch: dealStartEpoch,
+ UseCARFileForStorageDeal: true,
+ })
+
+ // create deal store
+ id := uuid.New()
+ rstore := bstore.NewMemorySync()
+
+ au, err := url.Parse(full.ListenURL)
+ require.NoError(t, err)
+
+ switch au.Scheme {
+ case "http":
+ au.Scheme = "ws"
+ case "https":
+ au.Scheme = "wss"
+ }
+
+ au.Path = path.Join(au.Path, "/rest/v0/store/"+id.String())
+
+ conn, _, err := websocket.DefaultDialer.Dial(au.String(), nil)
+ require.NoError(t, err)
+
+ _ = bstore.HandleNetBstoreWS(ctx, rstore, conn)
+
+ dh.PerformRetrievalWithOrder(ctx, dealCid, res.Root, false, func(offer api.QueryOffer, address address.Address) api.RetrievalOrder {
+ order := offer.Order(address)
+
+ order.RemoteStore = &id
+
+ return order
+ })
+
+ // check blockstore blocks
+ carv1FilePath, _ := kit.CreateRandomCARv1(t, rseed, 200)
+ cb, err := os.ReadFile(carv1FilePath)
+ require.NoError(t, err)
+
+ cr, err := car.NewCarReader(bytes.NewReader(cb))
+ require.NoError(t, err)
+
+ var blocks int
+ for {
+ cb, err := cr.Next()
+ if err == io.EOF {
+ fmt.Println("blocks: ", blocks)
+ return
+ }
+ require.NoError(t, err)
+
+ sb, err := rstore.Get(ctx, cb.Cid())
+ require.NoError(t, err)
+ require.EqualValues(t, cb.RawData(), sb.RawData())
+
+ blocks++
+ }
+}
diff --git a/itests/deals_retry_deal_no_funds_test.go b/itests/deals_retry_deal_no_funds_test.go
index 8d5a02172..650b2436e 100644
--- a/itests/deals_retry_deal_no_funds_test.go
+++ b/itests/deals_retry_deal_no_funds_test.go
@@ -101,7 +101,7 @@ func testDealsRetryLackOfFunds(t *testing.T, publishStorageAccountFunds abi.Toke
propcid := *deal
go func() {
- time.Sleep(3 * time.Second)
+ time.Sleep(30 * time.Second)
kit.SendFunds(ctx, t, minerFullNode, publishStorageDealKey.Address, types.FromFil(1))
diff --git a/itests/gateway_test.go b/itests/gateway_test.go
index a7d9d353b..b9c861bf3 100644
--- a/itests/gateway_test.go
+++ b/itests/gateway_test.go
@@ -297,7 +297,7 @@ func startNodes(
l, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(t, err)
- srv, _ := kit.CreateRPCServer(t, handler, l)
+ srv, _, _ := kit.CreateRPCServer(t, handler, l)
// Create a gateway client API that connects to the gateway server
var gapi api.Gateway
diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go
index 48cebe993..9dd83ee47 100644
--- a/itests/kit/blockminer.go
+++ b/itests/kit/blockminer.go
@@ -13,6 +13,7 @@ import (
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-bitfield"
+ "github.com/filecoin-project/go-jsonrpc"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
@@ -191,7 +192,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur
reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) {
// if api shuts down before mining, we may get an error which we should probably just ignore
// (fixing it will require rewriting most of the mining loop)
- if err != nil && !strings.Contains(err.Error(), "websocket connection closed") {
+ if err != nil && !strings.Contains(err.Error(), "websocket connection closed") && !api.ErrorIsIn(err, []error{new(jsonrpc.RPCConnectionError)}) {
require.NoError(bm.t, err)
}
diff --git a/itests/kit/deals.go b/itests/kit/deals.go
index 794a63803..1f3a7dfb5 100644
--- a/itests/kit/deals.go
+++ b/itests/kit/deals.go
@@ -19,6 +19,7 @@ import (
"github.com/stretchr/testify/require"
"golang.org/x/sync/errgroup"
+ "github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
"github.com/filecoin-project/go-fil-markets/shared_testutil"
"github.com/filecoin-project/go-fil-markets/storagemarket"
@@ -308,6 +309,12 @@ func (dh *DealHarness) StartSealingWaiting(ctx context.Context) {
}
func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool, offers ...api.QueryOffer) (path string) {
+ return dh.PerformRetrievalWithOrder(ctx, deal, root, carExport, func(offer api.QueryOffer, a address.Address) api.RetrievalOrder {
+ return offer.Order(a)
+ }, offers...)
+}
+
+func (dh *DealHarness) PerformRetrievalWithOrder(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool, makeOrder func(api.QueryOffer, address.Address) api.RetrievalOrder, offers ...api.QueryOffer) (path string) {
var offer api.QueryOffer
if len(offers) == 0 {
// perform retrieval.
@@ -331,7 +338,9 @@ func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root
updates, err := dh.client.ClientGetRetrievalUpdates(updatesCtx)
require.NoError(dh.t, err)
- retrievalRes, err := dh.client.ClientRetrieve(ctx, offer.Order(caddr))
+ order := makeOrder(offer, caddr)
+
+ retrievalRes, err := dh.client.ClientRetrieve(ctx, order)
require.NoError(dh.t, err)
consumeEvents:
for {
@@ -357,6 +366,11 @@ consumeEvents:
}
cancel()
+ if order.RemoteStore != nil {
+ // if we're retrieving into a remote store, skip export
+ return ""
+ }
+
require.NoError(dh.t, dh.client.ClientExport(ctx,
api.ExportRef{
Root: root,
diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go
index 98d7b178f..8b92202dc 100644
--- a/itests/kit/ensemble.go
+++ b/itests/kit/ensemble.go
@@ -13,6 +13,7 @@ import (
"testing"
"time"
+ "github.com/google/uuid"
"github.com/ipfs/go-datastore"
"github.com/ipfs/go-datastore/namespace"
libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto"
@@ -175,6 +176,16 @@ func (n *Ensemble) Mocknet() mocknet.Mocknet {
return n.mn
}
+func (n *Ensemble) NewPrivKey() (libp2pcrypto.PrivKey, peer.ID) {
+ privkey, _, err := libp2pcrypto.GenerateEd25519Key(rand.Reader)
+ require.NoError(n.t, err)
+
+ peerId, err := peer.IDFromPrivateKey(privkey)
+ require.NoError(n.t, err)
+
+ return privkey, peerId
+}
+
// FullNode enrolls a new full node.
func (n *Ensemble) FullNode(full *TestFullNode, opts ...NodeOpt) *Ensemble {
options := DefaultNodeOpts
@@ -200,13 +211,14 @@ func (n *Ensemble) FullNode(full *TestFullNode, opts ...NodeOpt) *Ensemble {
}
*full = TestFullNode{t: n.t, options: options, DefaultKey: key}
+
n.inactive.fullnodes = append(n.inactive.fullnodes, full)
return n
}
// Miner enrolls a new miner, using the provided full node for chain
// interactions.
-func (n *Ensemble) Miner(minerNode *TestMiner, full *TestFullNode, opts ...NodeOpt) *Ensemble {
+func (n *Ensemble) MinerEnroll(minerNode *TestMiner, full *TestFullNode, opts ...NodeOpt) *Ensemble {
require.NotNil(n.t, full, "full node required when instantiating miner")
options := DefaultNodeOpts
@@ -291,8 +303,16 @@ func (n *Ensemble) Miner(minerNode *TestMiner, full *TestFullNode, opts ...NodeO
minerNode.Libp2p.PeerID = peerId
minerNode.Libp2p.PrivKey = privkey
- n.inactive.miners = append(n.inactive.miners, minerNode)
+ return n
+}
+func (n *Ensemble) AddInactiveMiner(m *TestMiner) {
+ n.inactive.miners = append(n.inactive.miners, m)
+}
+
+func (n *Ensemble) Miner(minerNode *TestMiner, full *TestFullNode, opts ...NodeOpt) *Ensemble {
+ n.MinerEnroll(minerNode, full, opts...)
+ n.AddInactiveMiner(minerNode)
return n
}
@@ -358,6 +378,21 @@ func (n *Ensemble) Start() *Ensemble {
lr, err := r.Lock(repo.FullNode)
require.NoError(n.t, err)
+ ks, err := lr.KeyStore()
+ require.NoError(n.t, err)
+
+ if full.Pkey != nil {
+ pk, err := libp2pcrypto.MarshalPrivateKey(full.Pkey.PrivKey)
+ require.NoError(n.t, err)
+
+ err = ks.Put("libp2p-host", types.KeyInfo{
+ Type: "libp2p-host",
+ PrivateKey: pk,
+ })
+ require.NoError(n.t, err)
+
+ }
+
c, err := lr.Config()
require.NoError(n.t, err)
@@ -416,6 +451,7 @@ func (n *Ensemble) Start() *Ensemble {
// Construct the full node.
stop, err := node.New(ctx, opts...)
+ full.Stop = stop
require.NoError(n.t, err)
@@ -425,15 +461,31 @@ func (n *Ensemble) Start() *Ensemble {
err = full.WalletSetDefault(context.Background(), addr)
require.NoError(n.t, err)
+ var rpcShutdownOnce sync.Once
+ var stopOnce sync.Once
+ var stopErr error
+
+ stopFunc := stop
+ stop = func(ctx context.Context) error {
+ stopOnce.Do(func() {
+ stopErr = stopFunc(ctx)
+ })
+ return stopErr
+ }
+
// Are we hitting this node through its RPC?
if full.options.rpc {
- withRPC := fullRpc(n.t, full)
+ withRPC, rpcCloser := fullRpc(n.t, full)
n.inactive.fullnodes[i] = withRPC
+ full.Stop = func(ctx2 context.Context) error {
+ rpcShutdownOnce.Do(rpcCloser)
+ return stop(ctx)
+ }
+ n.t.Cleanup(func() { rpcShutdownOnce.Do(rpcCloser) })
}
n.t.Cleanup(func() {
_ = stop(context.Background())
-
})
n.active.fullnodes = append(n.active.fullnodes, full)
@@ -477,7 +529,9 @@ func (n *Ensemble) Start() *Ensemble {
Method: power.Methods.CreateMiner,
Params: params,
}
- signed, err := m.FullNode.FullNode.MpoolPushMessage(ctx, createStorageMinerMsg, nil)
+ signed, err := m.FullNode.FullNode.MpoolPushMessage(ctx, createStorageMinerMsg, &api.MessageSendSpec{
+ MsgUuid: uuid.New(),
+ })
require.NoError(n.t, err)
mw, err := m.FullNode.FullNode.StateWaitMsg(ctx, signed.Cid(), build.MessageConfidence, api.LookbackNoLimit, true)
@@ -501,7 +555,9 @@ func (n *Ensemble) Start() *Ensemble {
Value: types.NewInt(0),
}
- signed, err2 := m.FullNode.FullNode.MpoolPushMessage(ctx, msg, nil)
+ signed, err2 := m.FullNode.FullNode.MpoolPushMessage(ctx, msg, &api.MessageSendSpec{
+ MsgUuid: uuid.New(),
+ })
require.NoError(n.t, err2)
mw, err2 := m.FullNode.FullNode.StateWaitMsg(ctx, signed.Cid(), build.MessageConfidence, api.LookbackNoLimit, true)
@@ -586,11 +642,11 @@ func (n *Ensemble) Start() *Ensemble {
psd := m.PresealDir
noPaths := m.options.noStorage
- err := lr.SetStorage(func(sc *paths.StorageConfig) {
+ err := lr.SetStorage(func(sc *storiface.StorageConfig) {
if noPaths {
- sc.StoragePaths = []paths.LocalPath{}
+ sc.StoragePaths = []storiface.LocalPath{}
}
- sc.StoragePaths = append(sc.StoragePaths, paths.LocalPath{Path: psd})
+ sc.StoragePaths = append(sc.StoragePaths, storiface.LocalPath{Path: psd})
})
require.NoError(n.t, err)
@@ -611,7 +667,9 @@ func (n *Ensemble) Start() *Ensemble {
Value: types.NewInt(0),
}
- _, err2 := m.FullNode.MpoolPushMessage(ctx, msg, nil)
+ _, err2 := m.FullNode.MpoolPushMessage(ctx, msg, &api.MessageSendSpec{
+ MsgUuid: uuid.New(),
+ })
require.NoError(n.t, err2)
}
@@ -620,6 +678,13 @@ func (n *Ensemble) Start() *Ensemble {
disallowRemoteFinalize := m.options.disallowRemoteFinalize
var mineBlock = make(chan lotusminer.MineReq)
+
+ copy := *m.FullNode
+ copy.FullNode = modules.MakeUuidWrapper(copy.FullNode)
+ m.FullNode = ©
+
+ //m.FullNode.FullNode = modules.MakeUuidWrapper(fn.FullNode)
+
opts := []node.Option{
node.StorageMiner(&m.StorageMiner, cfg.Subsystems),
node.Base(),
@@ -627,25 +692,29 @@ func (n *Ensemble) Start() *Ensemble {
node.Test(),
node.If(m.options.disableLibp2p, node.MockHost(n.mn)),
- node.Override(new(v1api.RawFullNodeAPI), m.FullNode.FullNode),
+ //node.Override(new(v1api.RawFullNodeAPI), func() api.FullNode { return modules.MakeUuidWrapper(m.FullNode) }),
+ //node.Override(new(v1api.RawFullNodeAPI), modules.MakeUuidWrapper),
+ node.Override(new(v1api.RawFullNodeAPI), m.FullNode),
node.Override(new(*lotusminer.Miner), lotusminer.NewTestMiner(mineBlock, m.ActorAddr)),
// disable resource filtering so that local worker gets assigned tasks
// regardless of system pressure.
- node.Override(new(sectorstorage.Config), func() sectorstorage.Config {
+ node.Override(new(config.SealerConfig), func() config.SealerConfig {
scfg := config.DefaultStorageMiner()
if noLocal {
+ scfg.Storage.AllowSectorDownload = false
scfg.Storage.AllowAddPiece = false
scfg.Storage.AllowPreCommit1 = false
scfg.Storage.AllowPreCommit2 = false
scfg.Storage.AllowCommit = false
+ scfg.Storage.AllowUnseal = false
}
scfg.Storage.Assigner = assigner
scfg.Storage.DisallowRemoteFinalize = disallowRemoteFinalize
- scfg.Storage.ResourceFiltering = sectorstorage.ResourceFilteringDisabled
- return scfg.StorageManager()
+ scfg.Storage.ResourceFiltering = config.ResourceFilteringDisabled
+ return scfg.Storage
}),
// upgrades
@@ -736,8 +805,8 @@ func (n *Ensemble) Start() *Ensemble {
require.NoError(n.t, err)
if m.options.noStorage {
- err := lr.SetStorage(func(sc *paths.StorageConfig) {
- sc.StoragePaths = []paths.LocalPath{}
+ err := lr.SetStorage(func(sc *storiface.StorageConfig) {
+ sc.StoragePaths = []storiface.LocalPath{}
})
require.NoError(n.t, err)
}
@@ -813,9 +882,9 @@ func (n *Ensemble) Start() *Ensemble {
wait.Unlock()
})
wait.Lock()
+ n.bootstrapped = true
}
- n.bootstrapped = true
return n
}
@@ -962,7 +1031,7 @@ func importPreSealMeta(ctx context.Context, meta genesis.Miner, mds dtypes.Metad
info := &pipeline.SectorInfo{
State: pipeline.Proving,
SectorNumber: sector.SectorID,
- Pieces: []pipeline.Piece{
+ Pieces: []api.SectorPiece{
{
Piece: abi.PieceInfo{
Size: abi.PaddedPieceSize(meta.SectorSize),
diff --git a/itests/kit/ensemble_opts.go b/itests/kit/ensemble_opts.go
index 61a54550e..d264da2bb 100644
--- a/itests/kit/ensemble_opts.go
+++ b/itests/kit/ensemble_opts.go
@@ -30,7 +30,7 @@ var DefaultEnsembleOpts = ensembleOpts{
pastOffset: 10000000 * time.Second, // time sufficiently in the past to trigger catch-up mining.
upgradeSchedule: stmgr.UpgradeSchedule{{
Height: -1,
- Network: build.NewestNetworkVersion,
+ Network: build.TestNetworkVersion,
}},
}
diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go
index b51b82bd5..67dcbfd2e 100644
--- a/itests/kit/ensemble_opts_nv.go
+++ b/itests/kit/ensemble_opts_nv.go
@@ -49,12 +49,12 @@ func LatestActorsAt(upgradeHeight abi.ChainEpoch) EnsembleOpt {
})
/* inline-gen start */
return UpgradeSchedule(stmgr.Upgrade{
- Network: network.Version15,
+ Network: network.Version17,
Height: -1,
}, stmgr.Upgrade{
- Network: network.Version16,
+ Network: network.Version18,
Height: upgradeHeight,
- Migration: filcns.UpgradeActorsV8,
+ Migration: filcns.UpgradeActorsV10,
})
/* inline-gen end */
}
diff --git a/itests/kit/node_full.go b/itests/kit/node_full.go
index 710962e6a..12db91c68 100644
--- a/itests/kit/node_full.go
+++ b/itests/kit/node_full.go
@@ -6,6 +6,8 @@ import (
"testing"
"time"
+ libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto"
+ "github.com/libp2p/go-libp2p/core/peer"
"github.com/multiformats/go-multiaddr"
"github.com/stretchr/testify/require"
@@ -16,8 +18,15 @@ import (
"github.com/filecoin-project/lotus/api/v1api"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet/key"
+ cliutil "github.com/filecoin-project/lotus/cli/util"
+ "github.com/filecoin-project/lotus/node"
)
+type Libp2p struct {
+ PeerID peer.ID
+ PrivKey libp2pcrypto.PrivKey
+}
+
// TestFullNode represents a full node enrolled in an Ensemble.
type TestFullNode struct {
v1api.FullNode
@@ -27,11 +36,36 @@ type TestFullNode struct {
// ListenAddr is the address on which an API server is listening, if an
// API server is created for this Node.
ListenAddr multiaddr.Multiaddr
+ ListenURL string
DefaultKey *key.Key
+ Pkey *Libp2p
+
+ Stop node.StopFunc
+
options nodeOpts
}
+func MergeFullNodes(fullNodes []*TestFullNode) *TestFullNode {
+ var wrappedFullNode TestFullNode
+ var fns api.FullNodeStruct
+ wrappedFullNode.FullNode = &fns
+
+ cliutil.FullNodeProxy(fullNodes, &fns)
+
+ wrappedFullNode.t = fullNodes[0].t
+ wrappedFullNode.ListenAddr = fullNodes[0].ListenAddr
+ wrappedFullNode.DefaultKey = fullNodes[0].DefaultKey
+ wrappedFullNode.Stop = fullNodes[0].Stop
+ wrappedFullNode.options = fullNodes[0].options
+
+ return &wrappedFullNode
+}
+
+func (f TestFullNode) Shutdown(ctx context.Context) error {
+ return f.Stop(ctx)
+}
+
func (f *TestFullNode) ClientImportCARFile(ctx context.Context, rseed int, size int) (res *api.ImportRes, carv1FilePath string, origFilePath string) {
carv1FilePath, origFilePath = CreateRandomCARv1(f.t, rseed, size)
res, err := f.ClientImport(ctx, api.FileRef{Path: carv1FilePath, IsCAR: true})
@@ -86,6 +120,10 @@ func (f *TestFullNode) WaitForSectorActive(ctx context.Context, t *testing.T, sn
}
}
+func (f *TestFullNode) AssignPrivKey(pkey *Libp2p) {
+ f.Pkey = pkey
+}
+
// ChainPredicate encapsulates a chain condition.
type ChainPredicate func(set *types.TipSet) bool
diff --git a/itests/kit/node_miner.go b/itests/kit/node_miner.go
index 8805ac36c..dd6f3088c 100644
--- a/itests/kit/node_miner.go
+++ b/itests/kit/node_miner.go
@@ -26,7 +26,6 @@ import (
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/wallet/key"
"github.com/filecoin-project/lotus/miner"
- "github.com/filecoin-project/lotus/storage/paths"
sealing "github.com/filecoin-project/lotus/storage/pipeline"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -97,6 +96,10 @@ func (tm *TestMiner) PledgeSectors(ctx context.Context, n, existing int, blockNo
}
func (tm *TestMiner) WaitSectorsProving(ctx context.Context, toCheck map[abi.SectorNumber]struct{}) {
+ tm.WaitSectorsProvingAllowFails(ctx, toCheck, map[api.SectorState]struct{}{})
+}
+
+func (tm *TestMiner) WaitSectorsProvingAllowFails(ctx context.Context, toCheck map[abi.SectorNumber]struct{}, okFails map[api.SectorState]struct{}) {
for len(toCheck) > 0 {
tm.FlushSealingBatches(ctx)
@@ -105,11 +108,13 @@ func (tm *TestMiner) WaitSectorsProving(ctx context.Context, toCheck map[abi.Sec
st, err := tm.StorageMiner.SectorsStatus(ctx, n, false)
require.NoError(tm.t, err)
states[st.State]++
- if st.State == api.SectorState(sealing.Proving) || st.State == api.SectorState(sealing.Available) {
+ if st.State == api.SectorState(sealing.Proving) || st.State == api.SectorState(sealing.Available) || st.State == api.SectorState(sealing.Removed) {
delete(toCheck, n)
}
if strings.Contains(string(st.State), "Fail") {
- tm.t.Fatal("sector in a failed state", st.State)
+ if _, ok := okFails[st.State]; !ok {
+ tm.t.Fatal("sector in a failed state", st.State)
+ }
}
}
@@ -169,7 +174,7 @@ func (tm *TestMiner) FlushSealingBatches(ctx context.Context) {
const metaFile = "sectorstore.json"
-func (tm *TestMiner) AddStorage(ctx context.Context, t *testing.T, conf func(*paths.LocalStorageMeta)) storiface.ID {
+func (tm *TestMiner) AddStorage(ctx context.Context, t *testing.T, conf func(*storiface.LocalStorageMeta)) storiface.ID {
p := t.TempDir()
if err := os.MkdirAll(p, 0755); err != nil {
@@ -183,7 +188,7 @@ func (tm *TestMiner) AddStorage(ctx context.Context, t *testing.T, conf func(*pa
require.NoError(t, err)
}
- cfg := &paths.LocalStorageMeta{
+ cfg := &storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 10,
CanSeal: false,
@@ -219,3 +224,38 @@ func (tm *TestMiner) SectorsListNonGenesis(ctx context.Context) ([]abi.SectorNum
return l[tm.PresealSectors:], nil
}
+
+// comes from https://github.com/filecoin-project/lotus/blob/8ba4355cabd25e5f65261aaa561ff676321ffbd8/storage/sealer/manager.go#L1226
+// todo: have this defined in one place
+type SchedInfo struct {
+ CallToWork struct{}
+ EarlyRet interface{}
+ ReturnedWork interface{}
+ SchedInfo struct {
+ OpenWindows []string
+ Requests []struct {
+ Priority int
+ SchedId uuid.UUID
+ Sector struct {
+ Miner int
+ Number int
+ }
+ TaskType string
+ }
+ }
+ Waiting interface{}
+}
+
+func (tm *TestMiner) SchedInfo(ctx context.Context) SchedInfo {
+ schedb, err := tm.SealingSchedDiag(ctx, false)
+ require.NoError(tm.t, err)
+
+ j, err := json.MarshalIndent(&schedb, "", " ")
+ require.NoError(tm.t, err)
+
+ var b SchedInfo
+ err = json.Unmarshal(j, &b)
+ require.NoError(tm.t, err)
+
+ return b
+}
diff --git a/itests/kit/node_opts.go b/itests/kit/node_opts.go
index 2849485a9..14b0bccc8 100644
--- a/itests/kit/node_opts.go
+++ b/itests/kit/node_opts.go
@@ -58,7 +58,7 @@ var DefaultNodeOpts = nodeOpts{
sectors: DefaultPresealsPerBootstrapMiner,
sectorSize: abi.SectorSize(2 << 10), // 2KiB.
- workerTasks: []sealtasks.TaskType{sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize},
+ workerTasks: []sealtasks.TaskType{sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed},
workerStorageOpt: func(store paths.Store) paths.Store { return store },
}
@@ -229,7 +229,7 @@ func WithWorkerName(n string) NodeOpt {
}
}
-var WithSealWorkerTasks = WithTaskTypes([]sealtasks.TaskType{sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit2, sealtasks.TTUnseal})
+var WithSealWorkerTasks = WithTaskTypes(append([]sealtasks.TaskType{sealtasks.TTAddPiece, sealtasks.TTDataCid, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit2, sealtasks.TTUnseal}, DefaultNodeOpts.workerTasks...))
func WithWorkerStorage(transform func(paths.Store) paths.Store) NodeOpt {
return func(opts *nodeOpts) error {
@@ -256,9 +256,6 @@ type CfgOption func(cfg *config.FullNode) error
func SplitstoreDiscard() NodeOpt {
return WithCfgOpt(func(cfg *config.FullNode) error {
- //cfg.Chainstore.Splitstore.HotStoreType = "badger" // default
- //cfg.Chainstore.Splitstore.MarkSetType = "badger" // default
- //cfg.Chainstore.Splitstore.HotStoreMessageRetention = 0 // default
cfg.Chainstore.EnableSplitstore = true
cfg.Chainstore.Splitstore.HotStoreFullGCFrequency = 0 // turn off full gc
cfg.Chainstore.Splitstore.ColdStoreType = "discard" // no cold store
@@ -268,9 +265,6 @@ func SplitstoreDiscard() NodeOpt {
func SplitstoreUniversal() NodeOpt {
return WithCfgOpt(func(cfg *config.FullNode) error {
- //cfg.Chainstore.Splitstore.HotStoreType = "badger" // default
- //cfg.Chainstore.Splitstore.MarkSetType = "badger" // default
- //cfg.Chainstore.Splitstore.HotStoreMessageRetention = 0 // default
cfg.Chainstore.EnableSplitstore = true
cfg.Chainstore.Splitstore.HotStoreFullGCFrequency = 0 // turn off full gc
cfg.Chainstore.Splitstore.ColdStoreType = "universal" // universal bs is coldstore
@@ -278,10 +272,11 @@ func SplitstoreUniversal() NodeOpt {
})
}
-func SplitstoreAutoPrune() NodeOpt {
+func SplitstoreMessges() NodeOpt {
return WithCfgOpt(func(cfg *config.FullNode) error {
- cfg.Chainstore.Splitstore.EnableColdStoreAutoPrune = true // turn on
- cfg.Chainstore.Splitstore.ColdStoreFullGCFrequency = 0 // turn off full gc
+ cfg.Chainstore.EnableSplitstore = true
+ cfg.Chainstore.Splitstore.HotStoreFullGCFrequency = 0 // turn off full gc
+ cfg.Chainstore.Splitstore.ColdStoreType = "messages" // universal bs is coldstore, and it accepts messages
return nil
})
}
diff --git a/itests/kit/node_worker.go b/itests/kit/node_worker.go
index 3a6a55c55..ac200fb0f 100644
--- a/itests/kit/node_worker.go
+++ b/itests/kit/node_worker.go
@@ -15,7 +15,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -38,7 +37,7 @@ type TestWorker struct {
options nodeOpts
}
-func (tm *TestWorker) AddStorage(ctx context.Context, t *testing.T, conf func(*paths.LocalStorageMeta)) storiface.ID {
+func (tm *TestWorker) AddStorage(ctx context.Context, t *testing.T, conf func(*storiface.LocalStorageMeta)) storiface.ID {
p := t.TempDir()
if err := os.MkdirAll(p, 0755); err != nil {
@@ -52,7 +51,7 @@ func (tm *TestWorker) AddStorage(ctx context.Context, t *testing.T, conf func(*p
require.NoError(t, err)
}
- cfg := &paths.LocalStorageMeta{
+ cfg := &storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 10,
CanSeal: false,
diff --git a/itests/kit/rpc.go b/itests/kit/rpc.go
index 45fb095d5..f8c2c6e53 100644
--- a/itests/kit/rpc.go
+++ b/itests/kit/rpc.go
@@ -18,63 +18,52 @@ import (
"github.com/filecoin-project/lotus/node"
)
-func CreateRPCServer(t *testing.T, handler http.Handler, listener net.Listener) (*httptest.Server, multiaddr.Multiaddr) {
+type Closer func()
+
+func CreateRPCServer(t *testing.T, handler http.Handler, listener net.Listener) (*httptest.Server, multiaddr.Multiaddr, Closer) {
testServ := &httptest.Server{
Listener: listener,
- Config: &http.Server{Handler: handler},
+ Config: &http.Server{
+ Handler: handler,
+ ReadHeaderTimeout: 30 * time.Second,
+ },
}
testServ.Start()
- t.Cleanup(func() {
- waitUpTo(testServ.Close, time.Second, "Gave up waiting for RPC server to close after 1s")
- })
- t.Cleanup(testServ.CloseClientConnections)
-
addr := testServ.Listener.Addr()
maddr, err := manet.FromNetAddr(addr)
require.NoError(t, err)
- return testServ, maddr
-}
-
-func waitUpTo(fn func(), waitTime time.Duration, errMsg string) {
- ch := make(chan struct{})
- go func() {
- fn()
- close(ch)
- }()
-
- select {
- case <-ch:
- case <-time.After(waitTime):
- fmt.Println(errMsg)
- return
+ closer := func() {
+ testServ.CloseClientConnections()
+ testServ.Close()
}
+
+ return testServ, maddr, closer
}
-func fullRpc(t *testing.T, f *TestFullNode) *TestFullNode {
+func fullRpc(t *testing.T, f *TestFullNode) (*TestFullNode, Closer) {
handler, err := node.FullNodeHandler(f.FullNode, false)
require.NoError(t, err)
l, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(t, err)
- srv, maddr := CreateRPCServer(t, handler, l)
+ srv, maddr, rpcCloser := CreateRPCServer(t, handler, l)
fmt.Printf("FULLNODE RPC ENV FOR CLI DEBUGGING `export FULLNODE_API_INFO=%s`\n", "ws://"+srv.Listener.Addr().String())
sendItestdNotif("FULLNODE_API_INFO", t.Name(), "ws://"+srv.Listener.Addr().String())
cl, stop, err := client.NewFullNodeRPCV1(context.Background(), "ws://"+srv.Listener.Addr().String()+"/rpc/v1", nil)
require.NoError(t, err)
- t.Cleanup(stop)
- f.ListenAddr, f.FullNode = maddr, cl
+ f.ListenAddr, f.ListenURL, f.FullNode = maddr, srv.URL, cl
- return f
+ return f, func() { stop(); rpcCloser() }
}
func minerRpc(t *testing.T, m *TestMiner) *TestMiner {
handler, err := node.MinerHandler(m.StorageMiner, false)
require.NoError(t, err)
- srv, maddr := CreateRPCServer(t, handler, m.RemoteListener)
+ srv, maddr, _ := CreateRPCServer(t, handler, m.RemoteListener)
fmt.Printf("creating RPC server for %s at %s\n", m.ActorAddr, srv.Listener.Addr().String())
fmt.Printf("SP RPC ENV FOR CLI DEBUGGING `export MINER_API_INFO=%s`\n", "ws://"+srv.Listener.Addr().String())
@@ -92,7 +81,7 @@ func minerRpc(t *testing.T, m *TestMiner) *TestMiner {
func workerRpc(t *testing.T, m *TestWorker) *TestWorker {
handler := sealworker.WorkerHandler(m.MinerNode.AuthVerify, m.FetchHandler, m.Worker, false)
- srv, maddr := CreateRPCServer(t, handler, m.RemoteListener)
+ srv, maddr, _ := CreateRPCServer(t, handler, m.RemoteListener)
fmt.Println("creating RPC server for a worker at: ", srv.Listener.Addr().String())
url := "ws://" + srv.Listener.Addr().String() + "/rpc/v0"
diff --git a/itests/lite_migration_test.go b/itests/lite_migration_test.go
index 972f2df70..541a56b21 100644
--- a/itests/lite_migration_test.go
+++ b/itests/lite_migration_test.go
@@ -11,6 +11,7 @@ import (
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-address"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
system8 "github.com/filecoin-project/go-state-types/builtin/v8/system"
"github.com/filecoin-project/go-state-types/manifest"
"github.com/filecoin-project/go-state-types/network"
@@ -51,7 +52,7 @@ func TestLiteMigration(t *testing.T) {
oldManifestData, err := stmgr.GetManifestData(ctx, oldStateTree)
require.NoError(t, err)
- newManifestCid := makeTestManifest(t, ctxStore)
+ newManifestCid := makeTestManifest(t, ctxStore, actorstypes.Version9)
// Use the Cid we generated to get the new manifest instead of loading it from the store, so as to confirm it's in the store
var newManifest manifest.Manifest
require.NoError(t, ctxStore.Get(ctx, newManifestCid, &newManifest), "error getting new manifest")
@@ -59,7 +60,7 @@ func TestLiteMigration(t *testing.T) {
// populate the entries field of the manifest
require.NoError(t, newManifest.Load(ctx, ctxStore), "error loading new manifest")
- newStateRoot, err := filcns.LiteMigration(ctx, bs, newManifestCid, stateRoot, actors.Version8, types.StateTreeVersion4, types.StateTreeVersion4)
+ newStateRoot, err := filcns.LiteMigration(ctx, bs, newManifestCid, stateRoot, actorstypes.Version8, actorstypes.Version9, types.StateTreeVersion4, types.StateTreeVersion4)
require.NoError(t, err)
newStateTree, err := state.LoadStateTree(ctxStore, newStateRoot)
@@ -90,11 +91,11 @@ func TestLiteMigration(t *testing.T) {
require.NoError(t, err)
}
-func makeTestManifest(t *testing.T, ctxStore adt.Store) cid.Cid {
+func makeTestManifest(t *testing.T, ctxStore adt.Store, av actorstypes.Version) cid.Cid {
builder := cid.V1Builder{Codec: cid.Raw, MhType: mh.IDENTITY}
manifestData := manifest.ManifestData{}
- for _, name := range []string{"system", "init", "cron", "account", "storagepower", "storageminer", "storagemarket", "paymentchannel", "multisig", "reward", "verifiedregistry"} {
+ for _, name := range actors.GetBuiltinActorsKeys(av) {
codeCid, err := builder.Sum([]byte(fmt.Sprintf("fil/8/%s", name)))
if err != nil {
t.Fatal(err)
diff --git a/itests/migration_nv17_test.go b/itests/migration_nv17_test.go
new file mode 100644
index 000000000..1b0d13ae1
--- /dev/null
+++ b/itests/migration_nv17_test.go
@@ -0,0 +1,522 @@
+package itests
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/builtin"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ migration "github.com/filecoin-project/go-state-types/builtin/v9/migration/test"
+ miner9 "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifregst "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+ "github.com/filecoin-project/go-state-types/crypto"
+ "github.com/filecoin-project/go-state-types/network"
+ gstStore "github.com/filecoin-project/go-state-types/store"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/blockstore"
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/datacap"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/market"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
+ "github.com/filecoin-project/lotus/chain/consensus/filcns"
+ "github.com/filecoin-project/lotus/chain/state"
+ "github.com/filecoin-project/lotus/chain/stmgr"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/chain/wallet/key"
+ "github.com/filecoin-project/lotus/itests/kit"
+ "github.com/filecoin-project/lotus/node/impl"
+)
+
+func TestMigrationNV17(t *testing.T) {
+ kit.QuietMiningLogs()
+
+ rootKey, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifier1Key, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifier2Key, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifiedClientKey, err := key.GenerateKey(types.KTBLS)
+ require.NoError(t, err)
+
+ bal, err := types.ParseFIL("100fil")
+ require.NoError(t, err)
+
+ nv17epoch := abi.ChainEpoch(1000)
+ testClient, testMiner, ens := kit.EnsembleMinimal(t, kit.MockProofs(),
+ kit.RootVerifier(rootKey, abi.NewTokenAmount(bal.Int64())),
+ kit.Account(verifier1Key, abi.NewTokenAmount(bal.Int64())),
+ kit.Account(verifier2Key, abi.NewTokenAmount(bal.Int64())),
+ kit.Account(verifiedClientKey, abi.NewTokenAmount(bal.Int64())),
+ kit.UpgradeSchedule(stmgr.Upgrade{
+ Network: network.Version16,
+ Height: -1,
+ }, stmgr.Upgrade{
+ Network: network.Version17,
+ Height: nv17epoch,
+ Migration: filcns.UpgradeActorsV9,
+ },
+ ))
+
+ ens.InterconnectAll().BeginMining(10 * time.Millisecond)
+
+ clientApi := testClient.FullNode.(*impl.FullNodeAPI)
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ // Before the upgrade, we need to:
+ // Setup a verified client
+ // Publish (but NOT activate) a verified storage deal from that clien
+
+ // get VRH
+ //stm: @CHAIN_STATE_VERIFIED_REGISTRY_ROOT_KEY_001
+ vrh, err := clientApi.StateVerifiedRegistryRootKey(ctx, types.TipSetKey{})
+ fmt.Println(vrh.String())
+ require.NoError(t, err)
+
+ // import the root key.
+ rootAddr, err := clientApi.WalletImport(ctx, &rootKey.KeyInfo)
+ require.NoError(t, err)
+
+ // import the verifier's key.
+ verifier1Addr, err := clientApi.WalletImport(ctx, &verifier1Key.KeyInfo)
+ require.NoError(t, err)
+
+ verifier1IDAddr, err := clientApi.StateLookupID(ctx, verifier1Addr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ verifier2Addr, err := clientApi.WalletImport(ctx, &verifier2Key.KeyInfo)
+ require.NoError(t, err)
+
+ verifier2IDAddr, err := clientApi.StateLookupID(ctx, verifier2Addr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ // import the verified client's key.
+ verifiedClientAddr, err := clientApi.WalletImport(ctx, &verifiedClientKey.KeyInfo)
+ require.NoError(t, err)
+
+ verifiedClientIDAddr, err := clientApi.StateLookupID(ctx, verifiedClientAddr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ params, err := actors.SerializeParams(&verifregst.AddVerifierParams{Address: verifier1Addr, Allowance: big.NewInt(100000000000)})
+ require.NoError(t, err)
+
+ msg := &types.Message{
+ From: rootAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifier,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err := clientApi.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err, "AddVerifier failed")
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err := clientApi.StateWaitMsg(ctx, sm.Cid(), 1, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, res.Receipt.ExitCode.IsSuccess())
+
+ params, err = actors.SerializeParams(&verifregst.AddVerifierParams{Address: verifier2Addr, Allowance: big.NewInt(100000000000)})
+ require.NoError(t, err)
+
+ msg = &types.Message{
+ From: rootAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifier,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err = clientApi.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err, "AddVerifier failed")
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err = clientApi.StateWaitMsg(ctx, sm.Cid(), 1, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, res.Receipt.ExitCode.IsSuccess())
+
+ // assign datacap to a client
+ datacapToAssign := big.NewInt(10000)
+
+ params, err = actors.SerializeParams(&verifregst.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacapToAssign})
+ require.NoError(t, err)
+
+ msg = &types.Message{
+ From: verifier1Addr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifiedClient,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err = clientApi.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err)
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err = clientApi.StateWaitMsg(ctx, sm.Cid(), 1, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, res.Receipt.ExitCode.IsSuccess())
+
+ // check datacap balance
+ //stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001
+ dc, err := clientApi.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, *dc, datacapToAssign)
+
+ label, err := markettypes.NewLabelFromString("")
+ require.NoError(t, err)
+
+ dealProposal := markettypes.DealProposal{
+ PieceCID: migration.MakeCID("1", &markettypes.PieceCIDPrefix),
+ PieceSize: 1024,
+ Client: verifiedClientAddr,
+ Provider: testMiner.ActorAddr,
+ Label: label,
+ StartEpoch: nv17epoch + 500,
+ EndEpoch: abi.ChainEpoch(1000_000),
+ StoragePricePerEpoch: big.Zero(),
+ ProviderCollateral: big.Zero(),
+ ClientCollateral: big.Zero(),
+ VerifiedDeal: true,
+ }
+
+ serializedProposal := new(bytes.Buffer)
+ err = dealProposal.MarshalCBOR(serializedProposal)
+ require.NoError(t, err)
+
+ sig, err := clientApi.WalletSign(ctx, verifiedClientAddr, serializedProposal.Bytes())
+ require.NoError(t, err)
+
+ publishDealParams := markettypes.PublishStorageDealsParams{
+ Deals: []markettypes.ClientDealProposal{{
+ Proposal: dealProposal,
+ ClientSignature: crypto.Signature{
+ Type: crypto.SigTypeBLS,
+ Data: sig.Data,
+ },
+ }},
+ }
+
+ serializedParams := new(bytes.Buffer)
+ require.NoError(t, publishDealParams.MarshalCBOR(serializedParams))
+
+ m, err := clientApi.MpoolPushMessage(ctx, &types.Message{
+ To: builtin.StorageMarketActorAddr,
+ From: testMiner.OwnerKey.Address,
+ Value: types.FromFil(0),
+ Method: builtin.MethodsMarket.PublishStorageDeals,
+ Params: serializedParams.Bytes(),
+ }, nil)
+ require.NoError(t, err)
+
+ r, err := clientApi.StateWaitMsg(ctx, m.Cid(), 2, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, r.Receipt.ExitCode.IsSuccess())
+
+ ret, err := market.DecodePublishStorageDealsReturn(r.Receipt.Return, network.Version16)
+ require.NoError(t, err)
+ valid, _, err := ret.IsDealValid(0)
+ require.NoError(t, err)
+ require.True(t, valid)
+ dealIds, err := ret.DealIDs()
+ require.NoError(t, err)
+
+ currNV, err := clientApi.StateNetworkVersion(ctx, types.EmptyTSK)
+ require.NoError(t, err)
+ if currNV >= network.Version17 {
+ // if we moved too slowly and are already at v17, abort the test here with "success"
+ // it's not actually gonna test what we want, but the alternative is flakiness...
+ fmt.Println("early termination -- test reached the migration too quickly!")
+ return
+ }
+
+ testClient.WaitTillChain(ctx, kit.HeightAtLeast(nv17epoch+5))
+
+ // Now that we have upgraded, we need to:
+ // - confirm that the pending deal state is correct (allocation, entry in market pending allocations, etc.)
+ // - activate the deal, confirm it succeeds, and has a corresponding claim
+
+ bs := blockstore.NewAPIBlockstore(testClient)
+ ctxStore := gstStore.WrapBlockStore(ctx, bs)
+
+ currTs, err := clientApi.ChainHead(ctx)
+ require.NoError(t, err)
+
+ newStateTree, err := state.LoadStateTree(ctxStore, currTs.Blocks()[0].ParentStateRoot)
+ require.NoError(t, err)
+
+ datacapAct, err := newStateTree.GetActor(builtin.DatacapActorAddr)
+ require.NoError(t, err)
+
+ datacapSt, err := datacap.Load(ctxStore, datacapAct)
+ require.NoError(t, err)
+
+ ok, dcap, err := datacapSt.VerifiedClientDataCap(verifiedClientIDAddr)
+ require.NoError(t, err)
+
+ require.True(t, ok)
+ // The client has already spent datacap equal to the deal's size -- this will be found in the VerifiedRegistryActor
+ require.Equal(t, big.Sub(datacapToAssign, big.NewIntUnsigned(uint64(dealProposal.PieceSize))), dcap)
+
+ ok, dcap, err = datacapSt.VerifiedClientDataCap(builtin.VerifiedRegistryActorAddr)
+ require.NoError(t, err)
+
+ require.True(t, ok)
+ require.Equal(t, big.NewIntUnsigned(uint64(dealProposal.PieceSize)), dcap)
+
+ // The deal has a pending allocation
+ marketAct, err := newStateTree.GetActor(builtin.StorageMarketActorAddr)
+ require.NoError(t, err)
+
+ marketSt, err := market.Load(ctxStore, marketAct)
+ require.NoError(t, err)
+
+ allocationId, err := marketSt.GetAllocationIdForPendingDeal(dealIds[0])
+ require.NoError(t, err)
+ require.Equal(t, verifregst.AllocationId(1), allocationId)
+
+ minerInfo, err := testClient.StateMinerInfo(ctx, testMiner.ActorAddr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ spt, err := miner.SealProofTypeFromSectorSize(minerInfo.SectorSize, network.Version17)
+ require.NoError(t, err)
+
+ preCommitParams := miner9.PreCommitSectorParams{
+ SealProof: spt,
+ SectorNumber: 1000,
+ SealedCID: migration.MakeCID("sector", &miner9.SealedCIDPrefix),
+ SealRandEpoch: nv17epoch,
+ DealIDs: dealIds,
+ Expiration: dealProposal.EndEpoch,
+ }
+
+ serializedParams = new(bytes.Buffer)
+ require.NoError(t, preCommitParams.MarshalCBOR(serializedParams))
+
+ m, err = clientApi.MpoolPushMessage(ctx, &types.Message{
+ To: testMiner.ActorAddr,
+ From: testMiner.OwnerKey.Address,
+ Value: types.FromFil(0),
+ Method: builtin.MethodsMiner.PreCommitSector,
+ Params: serializedParams.Bytes(),
+ }, nil)
+ require.NoError(t, err)
+
+ r, err = clientApi.StateWaitMsg(ctx, m.Cid(), 2, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, r.Receipt.ExitCode.IsSuccess())
+
+ testClient.WaitTillChain(ctx, kit.HeightAtLeast(r.Height+miner9.PreCommitChallengeDelay+5))
+
+ proveCommitParams := miner9.ProveCommitSectorParams{
+ SectorNumber: preCommitParams.SectorNumber,
+ Proof: []byte{0xde, 0xad, 0xbe, 0xef},
+ }
+
+ serializedParams = new(bytes.Buffer)
+ require.NoError(t, proveCommitParams.MarshalCBOR(serializedParams))
+
+ m, err = clientApi.MpoolPushMessage(ctx, &types.Message{
+ To: testMiner.ActorAddr,
+ From: testMiner.OwnerKey.Address,
+ Value: types.FromFil(0),
+ Method: builtin.MethodsMiner.ProveCommitSector,
+ Params: serializedParams.Bytes(),
+ }, nil)
+ require.NoError(t, err)
+
+ r, err = clientApi.StateWaitMsg(ctx, m.Cid(), 2, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, r.Receipt.ExitCode.IsSuccess())
+
+ // Yay, the deal has been activated! Let's assert that it has a claim.
+
+ currTs, err = clientApi.ChainHead(ctx)
+ require.NoError(t, err)
+
+ newStateTree, err = state.LoadStateTree(ctxStore, currTs.Blocks()[0].ParentStateRoot)
+ require.NoError(t, err)
+
+ verifregAct, err := newStateTree.GetActor(builtin.VerifiedRegistryActorAddr)
+ require.NoError(t, err)
+
+ verifregSt, err := verifreg.Load(ctxStore, verifregAct)
+ require.NoError(t, err)
+
+ claims, err := verifregSt.GetClaims(testMiner.ActorAddr)
+ require.NoError(t, err)
+
+ require.Equal(t, len(claims), 1)
+ claim, ok := claims[1]
+ require.True(t, ok)
+
+ claimerIdAddr, err := address.NewIDAddress(uint64(claim.Client))
+ require.NoError(t, err)
+
+ require.Equal(t, verifiedClientIDAddr, claimerIdAddr)
+
+ // And that the deal no longer has a pending allocation
+
+ marketAct, err = newStateTree.GetActor(builtin.StorageMarketActorAddr)
+ require.NoError(t, err)
+
+ marketSt, err = market.Load(ctxStore, marketAct)
+ require.NoError(t, err)
+
+ allocationId, err = marketSt.GetAllocationIdForPendingDeal(dealIds[0])
+ require.NoError(t, err)
+ require.Equal(t, verifregst.NoAllocationID, allocationId)
+
+ testClient.WaitTillChain(ctx, kit.HeightAtLeast(dealProposal.StartEpoch+5))
+
+ currTs, err = clientApi.ChainHead(ctx)
+ require.NoError(t, err)
+
+ cso, err := clientApi.StateCompute(ctx, currTs.Height(), nil, currTs.Key())
+ require.NoError(t, err)
+
+ // cso.Trace[len(cso.Trace) - 1] because Cron is always the last entry in an InvocResult
+ // Subcalls [1] because Cron calls Power before Market
+ marketCronTrace := cso.Trace[len(cso.Trace)-1].ExecutionTrace.Subcalls[1]
+ require.Equal(t, builtin.CronActorAddr, marketCronTrace.Msg.From)
+ require.Equal(t, builtin.StorageMarketActorAddr, marketCronTrace.Msg.To)
+ require.True(t, marketCronTrace.MsgRct.ExitCode.IsSuccess())
+
+ // Now let's make sure the verified client can still use its balance for new deals
+
+ dealProposal.PieceCID = migration.MakeCID("2", &markettypes.PieceCIDPrefix)
+ dealProposal.StartEpoch = currTs.Height() + 1000
+
+ serializedProposal = new(bytes.Buffer)
+ err = dealProposal.MarshalCBOR(serializedProposal)
+ require.NoError(t, err)
+
+ sig, err = clientApi.WalletSign(ctx, verifiedClientAddr, serializedProposal.Bytes())
+ require.NoError(t, err)
+
+ publishDealParams = markettypes.PublishStorageDealsParams{
+ Deals: []markettypes.ClientDealProposal{{
+ Proposal: dealProposal,
+ ClientSignature: crypto.Signature{
+ Type: crypto.SigTypeBLS,
+ Data: sig.Data,
+ },
+ }},
+ }
+
+ serializedParams = new(bytes.Buffer)
+ require.NoError(t, publishDealParams.MarshalCBOR(serializedParams))
+
+ m, err = clientApi.MpoolPushMessage(ctx, &types.Message{
+ To: builtin.StorageMarketActorAddr,
+ From: testMiner.OwnerKey.Address,
+ Value: types.FromFil(0),
+ Method: builtin.MethodsMarket.PublishStorageDeals,
+ Params: serializedParams.Bytes(),
+ }, nil)
+ require.NoError(t, err)
+
+ r, err = clientApi.StateWaitMsg(ctx, m.Cid(), 2, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, r.Receipt.ExitCode.IsSuccess())
+
+ // Confirm balance was used
+
+ currTs, err = clientApi.ChainHead(ctx)
+ require.NoError(t, err)
+
+ newStateTree, err = state.LoadStateTree(ctxStore, currTs.Blocks()[0].ParentStateRoot)
+ require.NoError(t, err)
+
+ datacapAct, err = newStateTree.GetActor(builtin.DatacapActorAddr)
+ require.NoError(t, err)
+
+ datacapSt, err = datacap.Load(ctxStore, datacapAct)
+ require.NoError(t, err)
+
+ ok, dcap, err = datacapSt.VerifiedClientDataCap(verifiedClientIDAddr)
+ require.NoError(t, err)
+
+ require.True(t, ok)
+ require.Equal(t, big.Sub(datacapToAssign, big.NewIntUnsigned(uint64(dealProposal.PieceSize)*2)), dcap)
+
+ // The new deal's datacap now belongs to the verifreg
+ ok, dcap, err = datacapSt.VerifiedClientDataCap(builtin.VerifiedRegistryActorAddr)
+ require.NoError(t, err)
+
+ require.True(t, ok)
+ require.Equal(t, big.NewIntUnsigned(uint64(dealProposal.PieceSize)), dcap)
+
+ // now let's make sure we can still remove datacap
+
+ removeProposal := verifregst.RemoveDataCapProposal{
+ VerifiedClient: verifiedClientIDAddr,
+ // TAKE IT ALL AWAY!
+ DataCapAmount: datacapToAssign,
+ RemovalProposalID: verifregst.RmDcProposalID{ProposalID: 0},
+ }
+
+ buf := bytes.Buffer{}
+ buf.WriteString(verifregst.SignatureDomainSeparation_RemoveDataCap)
+ require.NoError(t, removeProposal.MarshalCBOR(&buf), "failed to marshal proposal")
+
+ removeProposalSer := buf.Bytes()
+
+ verifier1Sig, err := clientApi.WalletSign(ctx, verifier1Addr, removeProposalSer)
+ require.NoError(t, err, "failed to sign proposal")
+
+ removeRequest1 := verifregst.RemoveDataCapRequest{
+ Verifier: verifier1IDAddr,
+ VerifierSignature: *verifier1Sig,
+ }
+
+ verifier2Sig, err := clientApi.WalletSign(ctx, verifier2Addr, removeProposalSer)
+ require.NoError(t, err, "failed to sign proposal")
+
+ removeRequest2 := verifregst.RemoveDataCapRequest{
+ Verifier: verifier2IDAddr,
+ VerifierSignature: *verifier2Sig,
+ }
+
+ removeDataCapParams := verifregst.RemoveDataCapParams{
+ VerifiedClientToRemove: verifiedClientIDAddr,
+ DataCapAmountToRemove: datacapToAssign,
+ VerifierRequest1: removeRequest1,
+ VerifierRequest2: removeRequest2,
+ }
+
+ params, aerr := actors.SerializeParams(&removeDataCapParams)
+ require.NoError(t, aerr)
+
+ m, err = clientApi.MpoolPushMessage(ctx, &types.Message{
+ From: rootAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.RemoveVerifiedClientDataCap,
+ Params: params,
+ Value: big.Zero(),
+ }, nil)
+ require.NoError(t, err)
+
+ r, err = clientApi.StateWaitMsg(ctx, m.Cid(), 2, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, r.Receipt.ExitCode.IsSuccess())
+
+ dc, err = clientApi.StateVerifiedClientStatus(ctx, verifiedClientIDAddr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ require.Nil(t, dc)
+}
diff --git a/itests/mpool_msg_uuid_test.go b/itests/mpool_msg_uuid_test.go
new file mode 100644
index 000000000..3eb30a6f6
--- /dev/null
+++ b/itests/mpool_msg_uuid_test.go
@@ -0,0 +1,55 @@
+package itests
+
+import (
+ "context"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/exitcode"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/itests/kit"
+ "github.com/filecoin-project/lotus/node/config"
+)
+
+func TestMsgWithoutUuidWithMaxFee(t *testing.T) {
+ ctx := context.Background()
+
+ kit.QuietMiningLogs()
+
+ node, _, ens := kit.EnsembleMinimal(t, kit.MockProofs())
+ ens.InterconnectAll().BeginMining(10 * time.Millisecond)
+
+ bal, err := node.WalletBalance(ctx, node.DefaultKey.Address)
+ require.NoError(t, err)
+
+ // send self half of account balance
+ msgHalfBal := &types.Message{
+ From: node.DefaultKey.Address,
+ To: node.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(2)),
+ }
+ smHalfBal, err := node.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)})
+ require.NoError(t, err)
+ mLookup, err := node.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ msgQuarterBal := &types.Message{
+ From: node.DefaultKey.Address,
+ To: node.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(4)),
+ }
+ smQuarterBal, err := node.MpoolPushMessage(ctx, msgQuarterBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)})
+ require.NoError(t, err)
+
+ require.Equal(t, msgQuarterBal.Value, smQuarterBal.Message.Value)
+ mLookup, err = node.StateWaitMsg(ctx, smQuarterBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+}
diff --git a/itests/mpool_push_with_uuid_test.go b/itests/mpool_push_with_uuid_test.go
new file mode 100644
index 000000000..6b94dbad1
--- /dev/null
+++ b/itests/mpool_push_with_uuid_test.go
@@ -0,0 +1,54 @@
+package itests
+
+import (
+ "context"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/exitcode"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/itests/kit"
+ "github.com/filecoin-project/lotus/node/config"
+)
+
+func TestMpoolPushWithoutUuidWithMaxFee(t *testing.T) {
+ //stm: @TOKEN_WALLET_SIGN_001, @CHAIN_MEMPOOL_PUSH_001
+ ctx := context.Background()
+
+ kit.QuietMiningLogs()
+
+ client15, _, ens := kit.EnsembleMinimal(t, kit.MockProofs())
+ ens.InterconnectAll().BeginMining(10 * time.Millisecond)
+
+ bal, err := client15.WalletBalance(ctx, client15.DefaultKey.Address)
+ require.NoError(t, err)
+
+ // send self half of account balance
+ msgHalfBal := &types.Message{
+ From: client15.DefaultKey.Address,
+ To: client15.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(2)),
+ }
+ smHalfBal, err := client15.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)})
+ require.NoError(t, err)
+ mLookup, err := client15.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ msgQuarterBal := &types.Message{
+ From: client15.DefaultKey.Address,
+ To: client15.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(4)),
+ }
+ smcid, err := client15.MpoolPushMessage(ctx, msgQuarterBal, &api.MessageSendSpec{MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee)})
+ require.NoError(t, err)
+ mLookup, err = client15.StateWaitMsg(ctx, smcid.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+}
diff --git a/itests/multisig/suite.go b/itests/multisig/suite.go
index 39edfdc4e..9a81d0bf9 100644
--- a/itests/multisig/suite.go
+++ b/itests/multisig/suite.go
@@ -79,8 +79,6 @@ func RunMultisigTests(t *testing.T, client *kit.TestFullNode) {
require.Regexp(t, regexp.MustCompile("Balance: 0.000000000000001 FIL"), out)
// Expect 1 transaction
require.Regexp(t, regexp.MustCompile(`Transactions:\s*1`), out)
- // Expect transaction to be "AddSigner"
- require.Regexp(t, regexp.MustCompile(`AddSigner`), out)
// Approve adding the new address
// msig add-approve --from= 0 false
diff --git a/itests/path_detach_redeclare_test.go b/itests/path_detach_redeclare_test.go
index 124266b7d..10774d012 100644
--- a/itests/path_detach_redeclare_test.go
+++ b/itests/path_detach_redeclare_test.go
@@ -15,7 +15,6 @@ import (
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/itests/kit"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -74,7 +73,7 @@ func TestPathDetachRedeclare(t *testing.T) {
checkSectors(ctx, t, client, miner, 2, 2)
// attach a new path
- newId := miner.AddStorage(ctx, t, func(cfg *paths.LocalStorageMeta) {
+ newId := miner.AddStorage(ctx, t, func(cfg *storiface.LocalStorageMeta) {
cfg.CanStore = true
})
@@ -194,7 +193,7 @@ func TestPathDetachRedeclareWorker(t *testing.T) {
checkSectors(ctx, t, client, miner, 2, 2)
// attach a new path
- newId := sealw.AddStorage(ctx, t, func(cfg *paths.LocalStorageMeta) {
+ newId := sealw.AddStorage(ctx, t, func(cfg *storiface.LocalStorageMeta) {
cfg.CanStore = true
})
@@ -239,7 +238,7 @@ func TestPathDetachRedeclareWorker(t *testing.T) {
require.Len(t, local, 0)
// add a new one again, and move the sectors there
- newId = sealw.AddStorage(ctx, t, func(cfg *paths.LocalStorageMeta) {
+ newId = sealw.AddStorage(ctx, t, func(cfg *storiface.LocalStorageMeta) {
cfg.CanStore = true
})
@@ -407,7 +406,7 @@ func checkSectors(ctx context.Context, t *testing.T, api kit.TestFullNode, miner
require.Len(t, tocheck, expectChecked)
- bad, err := miner.CheckProvable(ctx, info.WindowPoStProofType, tocheck, true)
+ bad, err := miner.CheckProvable(ctx, info.WindowPoStProofType, tocheck)
require.NoError(t, err)
require.Len(t, bad, expectBad)
}
diff --git a/itests/path_type_filters_test.go b/itests/path_type_filters_test.go
index 03dd5ea16..d41e2c215 100644
--- a/itests/path_type_filters_test.go
+++ b/itests/path_type_filters_test.go
@@ -10,7 +10,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/filecoin-project/lotus/itests/kit"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -45,7 +44,7 @@ func TestPathTypeFilters(t *testing.T) {
}
runTest(t, "invalid-type-alert", func(t *testing.T, ctx context.Context, miner *kit.TestMiner, run func()) {
- slU := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ slU := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanSeal = true
meta.AllowTypes = []string{"unsealed", "seeled"}
})
@@ -79,18 +78,18 @@ func TestPathTypeFilters(t *testing.T) {
runTest(t, "seal-to-stor-unseal-allowdeny", func(t *testing.T, ctx context.Context, miner *kit.TestMiner, run func()) {
// allow all types in the sealing path
- sealScratch := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ sealScratch := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanSeal = true
})
// unsealed storage
- unsStor := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ unsStor := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanStore = true
meta.AllowTypes = []string{"unsealed"}
})
// other storage
- sealStor := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ sealStor := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanStore = true
meta.DenyTypes = []string{"unsealed"}
})
@@ -115,14 +114,14 @@ func TestPathTypeFilters(t *testing.T) {
runTest(t, "sealstor-unseal-allowdeny", func(t *testing.T, ctx context.Context, miner *kit.TestMiner, run func()) {
// unsealed storage
- unsStor := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ unsStor := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanStore = true
meta.CanSeal = true
meta.AllowTypes = []string{"unsealed"}
})
// other storage
- sealStor := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ sealStor := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanStore = true
meta.CanSeal = true
meta.DenyTypes = []string{"unsealed"}
@@ -147,29 +146,29 @@ func TestPathTypeFilters(t *testing.T) {
runTest(t, "seal-store-allseparate", func(t *testing.T, ctx context.Context, miner *kit.TestMiner, run func()) {
// sealing stores
- slU := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ slU := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanSeal = true
meta.AllowTypes = []string{"unsealed"}
})
- slS := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ slS := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanSeal = true
meta.AllowTypes = []string{"sealed"}
})
- slC := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ slC := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanSeal = true
meta.AllowTypes = []string{"cache"}
})
// storage stores
- stU := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ stU := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanStore = true
meta.AllowTypes = []string{"unsealed"}
})
- stS := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ stS := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanStore = true
meta.AllowTypes = []string{"sealed"}
})
- stC := miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ stC := miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.CanStore = true
meta.AllowTypes = []string{"cache"}
})
diff --git a/itests/paych_cli_test.go b/itests/paych_cli_test.go
index d73f96905..f86f5d8de 100644
--- a/itests/paych_cli_test.go
+++ b/itests/paych_cli_test.go
@@ -13,6 +13,7 @@ import (
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/stretchr/testify/require"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
@@ -66,6 +67,21 @@ func TestPaymentChannelsBasic(t *testing.T) {
vamt := strconv.Itoa(voucherAmt)
voucher := creatorCLI.RunCmd("paych", "voucher", "create", chAddr.String(), vamt)
+ // DEFLAKE: We have observed this test flakily failing when the receiver node hasn't seen the paych create message
+ // This makes us wait as much as 10 epochs before giving up and failing
+ retry := 0
+ _, err = paymentReceiver.StateLookupID(ctx, chAddr, types.EmptyTSK)
+ for err != nil && xerrors.Is(err, &api.ErrActorNotFound{}) {
+ time.Sleep(blocktime)
+ _, err = paymentReceiver.StateLookupID(ctx, chAddr, types.EmptyTSK)
+ retry++
+ if retry > 10 {
+ break
+ }
+ }
+
+ require.NoError(t, err)
+
// receiver: paych voucher add
receiverCLI.RunCmd("paych", "voucher", "add", chAddr.String(), voucher)
diff --git a/itests/pending_deal_allocation_test.go b/itests/pending_deal_allocation_test.go
new file mode 100644
index 000000000..c1e0531cf
--- /dev/null
+++ b/itests/pending_deal_allocation_test.go
@@ -0,0 +1,200 @@
+// stm: #integration
+package itests
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/builtin"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ migration "github.com/filecoin-project/go-state-types/builtin/v9/migration/test"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+ "github.com/filecoin-project/go-state-types/crypto"
+ "github.com/filecoin-project/go-state-types/exitcode"
+
+ lapi "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/build"
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/market"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/chain/wallet/key"
+ "github.com/filecoin-project/lotus/itests/kit"
+ "github.com/filecoin-project/lotus/node/impl"
+)
+
+func TestGetAllocationForPendingDeal(t *testing.T) {
+ rootKey, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifierKey, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifiedClientKey, err := key.GenerateKey(types.KTBLS)
+ require.NoError(t, err)
+
+ bal, err := types.ParseFIL("100fil")
+ require.NoError(t, err)
+
+ node, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(),
+ kit.RootVerifier(rootKey, abi.NewTokenAmount(bal.Int64())),
+ kit.Account(verifierKey, abi.NewTokenAmount(bal.Int64())), // assign some balance to the verifier so they can send an AddClient message.
+ kit.Account(verifiedClientKey, abi.NewTokenAmount(bal.Int64())),
+ )
+
+ ens.InterconnectAll().BeginMining(250 * time.Millisecond)
+
+ api := node.FullNode.(*impl.FullNodeAPI)
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ // get VRH
+ //stm: @CHAIN_STATE_VERIFIED_REGISTRY_ROOT_KEY_001
+ vrh, err := api.StateVerifiedRegistryRootKey(ctx, types.TipSetKey{})
+ fmt.Println(vrh.String())
+ require.NoError(t, err)
+
+ // import the root key.
+ rootAddr, err := api.WalletImport(ctx, &rootKey.KeyInfo)
+ require.NoError(t, err)
+
+ // import the verifier's key.
+ verifierAddr, err := api.WalletImport(ctx, &verifierKey.KeyInfo)
+ require.NoError(t, err)
+
+ // import the verified client's key.
+ verifiedClientAddr, err := api.WalletImport(ctx, &verifiedClientKey.KeyInfo)
+ require.NoError(t, err)
+
+ params, err := actors.SerializeParams(&verifregtypes.AddVerifierParams{Address: verifierAddr, Allowance: big.NewInt(100000000000)})
+ require.NoError(t, err)
+
+ msg := &types.Message{
+ From: rootAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifier,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err := api.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err, "AddVerifier failed")
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err := api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.EqualValues(t, 0, res.Receipt.ExitCode)
+
+ // assign datacap to a client
+ datacap := big.NewInt(10000)
+
+ params, err = actors.SerializeParams(&verifregtypes.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacap})
+ require.NoError(t, err)
+
+ msg = &types.Message{
+ From: verifierAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifiedClient,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err = api.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err)
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err = api.StateWaitMsg(ctx, sm.Cid(), 1, lapi.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.EqualValues(t, 0, res.Receipt.ExitCode)
+
+ // check datacap balance
+ //stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001
+ dcap, err := api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, *dcap, datacap)
+
+ pieceCid := migration.MakeCID("1", &markettypes.PieceCIDPrefix)
+
+ label, err := markettypes.NewLabelFromString("")
+ require.NoError(t, err)
+
+ dealProposal := markettypes.DealProposal{
+ PieceCID: pieceCid,
+ PieceSize: 1024,
+ Client: verifiedClientAddr,
+ Provider: miner.ActorAddr,
+ Label: label,
+ StartEpoch: abi.ChainEpoch(1000_000),
+ EndEpoch: abi.ChainEpoch(2000_000),
+ StoragePricePerEpoch: big.Zero(),
+ ProviderCollateral: big.Zero(),
+ ClientCollateral: big.Zero(),
+ VerifiedDeal: true,
+ }
+
+ serializedProposal := new(bytes.Buffer)
+ err = dealProposal.MarshalCBOR(serializedProposal)
+ require.NoError(t, err)
+
+ sig, err := api.WalletSign(ctx, verifiedClientAddr, serializedProposal.Bytes())
+ require.NoError(t, err)
+
+ publishDealParams := markettypes.PublishStorageDealsParams{
+ Deals: []markettypes.ClientDealProposal{{
+ Proposal: dealProposal,
+ ClientSignature: crypto.Signature{
+ Type: crypto.SigTypeBLS,
+ Data: sig.Data,
+ },
+ }},
+ }
+
+ serializedParams := new(bytes.Buffer)
+ require.NoError(t, publishDealParams.MarshalCBOR(serializedParams))
+
+ m, err := node.MpoolPushMessage(ctx, &types.Message{
+ To: builtin.StorageMarketActorAddr,
+ From: miner.OwnerKey.Address,
+ Value: types.FromFil(0),
+ Method: builtin.MethodsMarket.PublishStorageDeals,
+ Params: serializedParams.Bytes(),
+ }, nil)
+ require.NoError(t, err)
+
+ r, err := node.StateWaitMsg(ctx, m.Cid(), 2, lapi.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, r.Receipt.ExitCode)
+
+ ret, err := market.DecodePublishStorageDealsReturn(r.Receipt.Return, build.TestNetworkVersion)
+ require.NoError(t, err)
+ valid, _, err := ret.IsDealValid(0)
+ require.NoError(t, err)
+ require.True(t, valid)
+ dealIds, err := ret.DealIDs()
+ require.NoError(t, err)
+
+ dealInfo, err := api.StateMarketStorageDeal(ctx, dealIds[0], types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, verifregtypes.AllocationId(0), dealInfo.State.VerifiedClaim) // Allocation in State should not be set yet, because it's in the allocation map
+
+ allocation, err := api.StateGetAllocationForPendingDeal(ctx, dealIds[0], types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, dealProposal.PieceCID, allocation.Data)
+
+ allocations, err := api.StateGetAllocations(ctx, verifiedClientAddr, types.EmptyTSK)
+ require.NoError(t, err)
+ for _, alloc := range allocations {
+ require.Equal(t, alloc, *allocation)
+ }
+
+ marketDeal, err := api.StateMarketStorageDeal(ctx, dealIds[0], types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, marketDeal.State.SectorStartEpoch, abi.ChainEpoch(-1))
+}
diff --git a/itests/raft_messagesigner_test.go b/itests/raft_messagesigner_test.go
new file mode 100644
index 000000000..22dd7a5eb
--- /dev/null
+++ b/itests/raft_messagesigner_test.go
@@ -0,0 +1,575 @@
+package itests
+
+import (
+ "context"
+ "crypto/rand"
+ "fmt"
+ "reflect"
+ "testing"
+ "time"
+
+ "github.com/google/uuid"
+ gorpc "github.com/libp2p/go-libp2p-gorpc"
+ libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto"
+ "github.com/libp2p/go-libp2p/core/peer"
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/exitcode"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/messagesigner"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/itests/kit"
+ consensus "github.com/filecoin-project/lotus/lib/consensus/raft"
+ "github.com/filecoin-project/lotus/node"
+ "github.com/filecoin-project/lotus/node/config"
+ "github.com/filecoin-project/lotus/node/impl"
+ "github.com/filecoin-project/lotus/node/modules"
+)
+
+func generatePrivKey() (*kit.Libp2p, error) {
+ privkey, _, err := libp2pcrypto.GenerateEd25519Key(rand.Reader)
+ if err != nil {
+ return nil, err
+ }
+
+ peerId, err := peer.IDFromPrivateKey(privkey)
+ if err != nil {
+ return nil, err
+ }
+
+ return &kit.Libp2p{PeerID: peerId, PrivKey: privkey}, nil
+}
+
+func getRaftState(ctx context.Context, t *testing.T, node *kit.TestFullNode) *api.RaftStateData {
+ raftState, err := node.RaftState(ctx)
+ require.NoError(t, err)
+ return raftState
+}
+
+func setup(ctx context.Context, t *testing.T, node0 *kit.TestFullNode, node1 *kit.TestFullNode, node2 *kit.TestFullNode, miner *kit.TestMiner) *kit.Ensemble {
+
+ blockTime := 1 * time.Second
+
+ pkey0, _ := generatePrivKey()
+ pkey1, _ := generatePrivKey()
+ pkey2, _ := generatePrivKey()
+
+ pkeys := []*kit.Libp2p{pkey0, pkey1, pkey2}
+ initPeerSet := []string{}
+ for _, pkey := range pkeys {
+ initPeerSet = append(initPeerSet, "/p2p/"+pkey.PeerID.String())
+ }
+
+ //initPeerSet := []peer.ID{pkey0.PeerID, pkey1.PeerID, pkey2.PeerID}
+
+ raftOps := kit.ConstructorOpts(
+ node.Override(new(*gorpc.Client), modules.NewRPCClient),
+ node.Override(new(*consensus.ClusterRaftConfig), func() *consensus.ClusterRaftConfig {
+ cfg := consensus.DefaultClusterRaftConfig()
+ cfg.InitPeerset = initPeerSet
+ return cfg
+ }),
+ node.Override(new(*consensus.Consensus), consensus.NewConsensusWithRPCClient(false)),
+ node.Override(new(*messagesigner.MessageSignerConsensus), messagesigner.NewMessageSignerConsensus),
+ node.Override(new(messagesigner.MsgSigner), func(ms *messagesigner.MessageSignerConsensus) *messagesigner.MessageSignerConsensus { return ms }),
+ node.Override(new(*modules.RPCHandler), modules.NewRPCHandler),
+ node.Override(node.GoRPCServer, modules.NewRPCServer),
+ )
+ //raftOps := kit.ConstructorOpts()
+
+ ens := kit.NewEnsemble(t).FullNode(node0, raftOps, kit.ThroughRPC()).FullNode(node1, raftOps, kit.ThroughRPC()).FullNode(node2, raftOps, kit.ThroughRPC())
+ node0.AssignPrivKey(pkey0)
+ node1.AssignPrivKey(pkey1)
+ node2.AssignPrivKey(pkey2)
+
+ nodes := []*kit.TestFullNode{node0, node1, node2}
+ wrappedFullNode := kit.MergeFullNodes(nodes)
+
+ ens.MinerEnroll(miner, wrappedFullNode, kit.WithAllSubsystems(), kit.ThroughRPC())
+ ens.Start()
+
+ // Import miner wallet to all nodes
+ addr0, err := node0.WalletImport(ctx, &miner.OwnerKey.KeyInfo)
+ require.NoError(t, err)
+ addr1, err := node1.WalletImport(ctx, &miner.OwnerKey.KeyInfo)
+ require.NoError(t, err)
+ addr2, err := node2.WalletImport(ctx, &miner.OwnerKey.KeyInfo)
+ require.NoError(t, err)
+
+ fmt.Println(addr0, addr1, addr2)
+
+ ens.InterconnectAll()
+
+ ens.AddInactiveMiner(miner)
+ ens.Start()
+
+ ens.InterconnectAll().BeginMining(blockTime)
+
+ return ens
+}
+
+func TestRaftState(t *testing.T) {
+
+ kit.QuietMiningLogs()
+ ctx := context.Background()
+
+ var (
+ node0 kit.TestFullNode
+ node1 kit.TestFullNode
+ node2 kit.TestFullNode
+ miner kit.TestMiner
+ )
+
+ setup(ctx, t, &node0, &node1, &node2, &miner)
+
+ fmt.Println(node0.WalletList(context.Background()))
+ fmt.Println(node1.WalletList(context.Background()))
+ fmt.Println(node2.WalletList(context.Background()))
+
+ bal, err := node0.WalletBalance(ctx, node0.DefaultKey.Address)
+ require.NoError(t, err)
+
+ msgHalfBal := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: node0.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(2)),
+ }
+
+ mu := uuid.New()
+ smHalfBal, err := node0.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{
+ MsgUuid: mu,
+ })
+ require.NoError(t, err)
+ mLookup, err := node0.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ rstate0 := getRaftState(ctx, t, &node0)
+ rstate1 := getRaftState(ctx, t, &node1)
+ rstate2 := getRaftState(ctx, t, &node2)
+
+ require.EqualValues(t, rstate0, rstate1)
+ require.EqualValues(t, rstate0, rstate2)
+}
+
+func TestRaftStateLeaderDisconnects(t *testing.T) {
+
+ kit.QuietMiningLogs()
+ ctx := context.Background()
+
+ var (
+ node0 kit.TestFullNode
+ node1 kit.TestFullNode
+ node2 kit.TestFullNode
+ miner kit.TestMiner
+ )
+
+ nodes := []*kit.TestFullNode{&node0, &node1, &node2}
+
+ setup(ctx, t, &node0, &node1, &node2, &miner)
+
+ peerToNode := make(map[peer.ID]*kit.TestFullNode)
+ for _, n := range nodes {
+ peerToNode[n.Pkey.PeerID] = n
+ }
+
+ bal, err := node0.WalletBalance(ctx, node0.DefaultKey.Address)
+ require.NoError(t, err)
+
+ msgHalfBal := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: node0.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(2)),
+ }
+ mu := uuid.New()
+ smHalfBal, err := node0.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{
+ MsgUuid: mu,
+ })
+ require.NoError(t, err)
+ mLookup, err := node0.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ rstate0 := getRaftState(ctx, t, &node0)
+ rstate1 := getRaftState(ctx, t, &node1)
+ rstate2 := getRaftState(ctx, t, &node2)
+
+ require.True(t, reflect.DeepEqual(rstate0, rstate1))
+ require.True(t, reflect.DeepEqual(rstate0, rstate2))
+
+ leader, err := node1.RaftLeader(ctx)
+ require.NoError(t, err)
+ leaderNode := peerToNode[leader]
+
+ err = leaderNode.Stop(ctx)
+ require.NoError(t, err)
+ oldLeaderNode := leaderNode
+
+ time.Sleep(5 * time.Second)
+
+ newLeader := leader
+ for _, n := range nodes {
+ if n != leaderNode {
+ newLeader, err = n.RaftLeader(ctx)
+ require.NoError(t, err)
+ require.NotEqual(t, newLeader, leader)
+ }
+ }
+
+ require.NotEqual(t, newLeader, leader)
+ leaderNode = peerToNode[newLeader]
+
+ msg2 := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: leaderNode.DefaultKey.Address,
+ Value: big.NewInt(100000),
+ }
+ mu2 := uuid.New()
+ signedMsg2, err := leaderNode.MpoolPushMessage(ctx, msg2, &api.MessageSendSpec{
+ MsgUuid: mu2,
+ })
+ require.NoError(t, err)
+ mLookup, err = leaderNode.StateWaitMsg(ctx, signedMsg2.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ rstate := getRaftState(ctx, t, leaderNode)
+
+ for _, n := range nodes {
+ if n != oldLeaderNode {
+ rs := getRaftState(ctx, t, n)
+ require.True(t, reflect.DeepEqual(rs, rstate))
+ }
+ }
+}
+
+func TestRaftStateMiner(t *testing.T) {
+
+ kit.QuietMiningLogs()
+ ctx := context.Background()
+
+ var (
+ node0 kit.TestFullNode
+ node1 kit.TestFullNode
+ node2 kit.TestFullNode
+ miner kit.TestMiner
+ )
+
+ setup(ctx, t, &node0, &node1, &node2, &miner)
+
+ fmt.Println(node0.WalletList(context.Background()))
+ fmt.Println(node1.WalletList(context.Background()))
+ fmt.Println(node2.WalletList(context.Background()))
+
+ bal, err := node0.WalletBalance(ctx, node0.DefaultKey.Address)
+ require.NoError(t, err)
+
+ msgHalfBal := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: node0.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(2)),
+ }
+ mu := uuid.New()
+ smHalfBal, err := miner.FullNode.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{
+ MsgUuid: mu,
+ })
+ require.NoError(t, err)
+ mLookup, err := node0.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ rstate0 := getRaftState(ctx, t, &node0)
+ rstate1 := getRaftState(ctx, t, &node1)
+ rstate2 := getRaftState(ctx, t, &node2)
+
+ require.EqualValues(t, rstate0, rstate1)
+ require.EqualValues(t, rstate0, rstate2)
+}
+
+func TestRaftStateLeaderDisconnectsMiner(t *testing.T) {
+
+ kit.QuietMiningLogs()
+ ctx := context.Background()
+
+ var (
+ node0 kit.TestFullNode
+ node1 kit.TestFullNode
+ node2 kit.TestFullNode
+ miner kit.TestMiner
+ )
+
+ nodes := []*kit.TestFullNode{&node0, &node1, &node2}
+
+ setup(ctx, t, &node0, &node1, &node2, &miner)
+
+ peerToNode := make(map[peer.ID]*kit.TestFullNode)
+ for _, n := range nodes {
+ peerToNode[n.Pkey.PeerID] = n
+ }
+
+ leader, err := node0.RaftLeader(ctx)
+ require.NoError(t, err)
+ leaderNode := peerToNode[leader]
+
+ // Take leader node down
+ err = leaderNode.Stop(ctx)
+ require.NoError(t, err)
+ oldLeaderNode := leaderNode
+
+ time.Sleep(5 * time.Second)
+
+ newLeader := leader
+ for _, n := range nodes {
+ if n != leaderNode {
+ newLeader, err = n.RaftLeader(ctx)
+ require.NoError(t, err)
+ require.NotEqual(t, newLeader, leader)
+ }
+ }
+
+ require.NotEqual(t, newLeader, leader)
+ leaderNode = peerToNode[newLeader]
+
+ msg2 := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: node0.DefaultKey.Address,
+ Value: big.NewInt(100000),
+ }
+ mu2 := uuid.New()
+
+ signedMsg2, err := miner.FullNode.MpoolPushMessage(ctx, msg2, &api.MessageSendSpec{
+ MaxFee: abi.TokenAmount(config.DefaultDefaultMaxFee),
+ MsgUuid: mu2,
+ })
+ require.NoError(t, err)
+
+ mLookup, err := leaderNode.StateWaitMsg(ctx, signedMsg2.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ rstate := getRaftState(ctx, t, leaderNode)
+
+ for _, n := range nodes {
+ if n != oldLeaderNode {
+ rs := getRaftState(ctx, t, n)
+ require.True(t, reflect.DeepEqual(rs, rstate))
+ }
+ }
+}
+
+// Miner sends message on leader
+// Leader disconnects
+// Call StateWaitMsg on new leader
+func TestLeaderDisconnectsCheckMsgStateOnNewLeader(t *testing.T) {
+
+ kit.QuietMiningLogs()
+ ctx := context.Background()
+
+ var (
+ node0 kit.TestFullNode
+ node1 kit.TestFullNode
+ node2 kit.TestFullNode
+ miner kit.TestMiner
+ )
+
+ nodes := []*kit.TestFullNode{&node0, &node1, &node2}
+
+ setup(ctx, t, &node0, &node1, &node2, &miner)
+
+ peerToNode := make(map[peer.ID]*kit.TestFullNode)
+ for _, n := range nodes {
+ peerToNode[n.Pkey.PeerID] = n
+ }
+
+ bal, err := node0.WalletBalance(ctx, node0.DefaultKey.Address)
+ require.NoError(t, err)
+
+ msgHalfBal := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: node0.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(2)),
+ }
+ mu := uuid.New()
+ smHalfBal, err := miner.FullNode.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{
+ MsgUuid: mu,
+ })
+ require.NoError(t, err)
+
+ leader, err := node0.RaftLeader(ctx)
+ require.NoError(t, err)
+ leaderNode := peerToNode[leader]
+
+ // Take leader node down
+ err = leaderNode.Stop(ctx)
+ require.NoError(t, err)
+ oldLeaderNode := leaderNode
+
+ time.Sleep(5 * time.Second)
+
+ // Check if all active nodes update their leader
+ newLeader := leader
+ for _, n := range nodes {
+ if n != leaderNode {
+ newLeader, err = n.RaftLeader(ctx)
+ require.NoError(t, err)
+ require.NotEqual(t, newLeader, leader)
+ }
+ }
+
+ require.NotEqual(t, newLeader, leader)
+ leaderNode = peerToNode[newLeader]
+
+ mLookup, err := leaderNode.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+
+ rstate := getRaftState(ctx, t, leaderNode)
+
+ // Check if Raft state is consistent on all active nodes
+ for _, n := range nodes {
+ if n != oldLeaderNode {
+ rs := getRaftState(ctx, t, n)
+ require.True(t, reflect.DeepEqual(rs, rstate))
+ }
+ }
+}
+
+func TestChainStoreSync(t *testing.T) {
+
+ kit.QuietMiningLogs()
+ ctx := context.Background()
+
+ var (
+ node0 kit.TestFullNode
+ node1 kit.TestFullNode
+ node2 kit.TestFullNode
+ miner kit.TestMiner
+ )
+
+ nodes := []*kit.TestFullNode{&node0, &node1, &node2}
+
+ setup(ctx, t, &node0, &node1, &node2, &miner)
+
+ peerToNode := make(map[peer.ID]*kit.TestFullNode)
+ for _, n := range nodes {
+ peerToNode[n.Pkey.PeerID] = n
+ }
+
+ bal, err := node0.WalletBalance(ctx, node0.DefaultKey.Address)
+ require.NoError(t, err)
+
+ leader, err := node0.RaftLeader(ctx)
+ require.NoError(t, err)
+ leaderNode := peerToNode[leader]
+
+ msgHalfBal := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: node0.DefaultKey.Address,
+ Value: big.Div(bal, big.NewInt(2)),
+ }
+ mu := uuid.New()
+ smHalfBal, err := miner.FullNode.MpoolPushMessage(ctx, msgHalfBal, &api.MessageSendSpec{
+ MsgUuid: mu,
+ })
+ require.NoError(t, err)
+
+ for _, n := range nodes {
+ fmt.Println(n != leaderNode)
+ if n != leaderNode {
+ mLookup, err := n.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode)
+ //break
+ }
+ }
+}
+
+func TestGoRPCAuth(t *testing.T) {
+
+ blockTime := 1 * time.Second
+
+ kit.QuietMiningLogs()
+ ctx := context.Background()
+
+ var (
+ node0 kit.TestFullNode
+ node1 kit.TestFullNode
+ node2 kit.TestFullNode
+ node3 kit.TestFullNode
+ miner kit.TestMiner
+ )
+
+ pkey0, _ := generatePrivKey()
+ pkey1, _ := generatePrivKey()
+ pkey2, _ := generatePrivKey()
+
+ pkeys := []*kit.Libp2p{pkey0, pkey1, pkey2}
+ initPeerSet := []string{}
+ for _, pkey := range pkeys {
+ initPeerSet = append(initPeerSet, "/p2p/"+pkey.PeerID.String())
+ }
+
+ raftOps := kit.ConstructorOpts(
+ node.Override(new(*gorpc.Client), modules.NewRPCClient),
+ node.Override(new(*consensus.ClusterRaftConfig), func() *consensus.ClusterRaftConfig {
+ cfg := consensus.DefaultClusterRaftConfig()
+ cfg.InitPeerset = initPeerSet
+ return cfg
+ }),
+ node.Override(new(*consensus.Consensus), consensus.NewConsensusWithRPCClient(false)),
+ node.Override(new(*messagesigner.MessageSignerConsensus), messagesigner.NewMessageSignerConsensus),
+ node.Override(new(messagesigner.MsgSigner), func(ms *messagesigner.MessageSignerConsensus) *messagesigner.MessageSignerConsensus { return ms }),
+ node.Override(new(*modules.RPCHandler), modules.NewRPCHandler),
+ node.Override(node.GoRPCServer, modules.NewRPCServer),
+ )
+ //raftOps := kit.ConstructorOpts()
+
+ ens := kit.NewEnsemble(t).FullNode(&node0, raftOps, kit.ThroughRPC()).FullNode(&node1, raftOps, kit.ThroughRPC()).FullNode(&node2, raftOps, kit.ThroughRPC()).FullNode(&node3, raftOps)
+ node0.AssignPrivKey(pkey0)
+ node1.AssignPrivKey(pkey1)
+ node2.AssignPrivKey(pkey2)
+
+ nodes := []*kit.TestFullNode{&node0, &node1, &node2}
+ wrappedFullNode := kit.MergeFullNodes(nodes)
+
+ ens.MinerEnroll(&miner, wrappedFullNode, kit.WithAllSubsystems(), kit.ThroughRPC())
+ ens.Start()
+
+ // Import miner wallet to all nodes
+ addr0, err := node0.WalletImport(ctx, &miner.OwnerKey.KeyInfo)
+ require.NoError(t, err)
+ addr1, err := node1.WalletImport(ctx, &miner.OwnerKey.KeyInfo)
+ require.NoError(t, err)
+ addr2, err := node2.WalletImport(ctx, &miner.OwnerKey.KeyInfo)
+ require.NoError(t, err)
+
+ fmt.Println(addr0, addr1, addr2)
+
+ ens.InterconnectAll()
+
+ ens.AddInactiveMiner(&miner)
+ ens.Start()
+
+ ens.InterconnectAll().BeginMining(blockTime)
+
+ leader, err := node0.RaftLeader(ctx)
+ require.NoError(t, err)
+
+ client := node3.FullNode.(*impl.FullNodeAPI).RaftAPI.MessageSigner.Consensus.RpcClient
+ method := "MpoolPushMessage"
+
+ msg := &types.Message{
+ From: miner.OwnerKey.Address,
+ To: node0.DefaultKey.Address,
+ Value: big.NewInt(100000),
+ }
+ msgWhole := &api.MpoolMessageWhole{Msg: msg}
+ var ret types.SignedMessage
+
+ err = client.CallContext(ctx, leader, "Consensus", method, msgWhole, &ret)
+ require.True(t, gorpc.IsAuthorizationError(err))
+
+}
diff --git a/itests/remove_verifreg_datacap_test.go b/itests/remove_verifreg_datacap_test.go
new file mode 100644
index 000000000..3fd241748
--- /dev/null
+++ b/itests/remove_verifreg_datacap_test.go
@@ -0,0 +1,284 @@
+package itests
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/builtin"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ migration "github.com/filecoin-project/go-state-types/builtin/v9/migration/test"
+ verifregst "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
+ "github.com/filecoin-project/go-state-types/crypto"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/build"
+ "github.com/filecoin-project/lotus/chain/actors"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/market"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/chain/wallet/key"
+ "github.com/filecoin-project/lotus/itests/kit"
+ "github.com/filecoin-project/lotus/node/impl"
+)
+
+func TestNoRemoveDatacapFromVerifreg(t *testing.T) {
+ kit.QuietMiningLogs()
+
+ rootKey, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifier1Key, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifier2Key, err := key.GenerateKey(types.KTSecp256k1)
+ require.NoError(t, err)
+
+ verifiedClientKey, err := key.GenerateKey(types.KTBLS)
+ require.NoError(t, err)
+
+ bal, err := types.ParseFIL("100fil")
+ require.NoError(t, err)
+
+ testClient, testMiner, ens := kit.EnsembleMinimal(t, kit.MockProofs(),
+ kit.RootVerifier(rootKey, abi.NewTokenAmount(bal.Int64())),
+ kit.Account(verifier1Key, abi.NewTokenAmount(bal.Int64())),
+ kit.Account(verifier2Key, abi.NewTokenAmount(bal.Int64())),
+ kit.Account(verifiedClientKey, abi.NewTokenAmount(bal.Int64())))
+
+ ens.InterconnectAll().BeginMining(10 * time.Millisecond)
+
+ clientApi := testClient.FullNode.(*impl.FullNodeAPI)
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ // Before the upgrade, we need to:
+ // Setup a verified client
+ // Publish (but NOT activate) a verified storage deal from that clien
+
+ // get VRH
+ //stm: @CHAIN_STATE_VERIFIED_REGISTRY_ROOT_KEY_001
+ vrh, err := clientApi.StateVerifiedRegistryRootKey(ctx, types.TipSetKey{})
+ fmt.Println(vrh.String())
+ require.NoError(t, err)
+
+ // import the root key.
+ rootAddr, err := clientApi.WalletImport(ctx, &rootKey.KeyInfo)
+ require.NoError(t, err)
+
+ // import the verifier's key.
+ verifier1Addr, err := clientApi.WalletImport(ctx, &verifier1Key.KeyInfo)
+ require.NoError(t, err)
+
+ verifier1IDAddr, err := clientApi.StateLookupID(ctx, verifier1Addr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ verifier2Addr, err := clientApi.WalletImport(ctx, &verifier2Key.KeyInfo)
+ require.NoError(t, err)
+
+ verifier2IDAddr, err := clientApi.StateLookupID(ctx, verifier2Addr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ // import the verified client's key.
+ verifiedClientAddr, err := clientApi.WalletImport(ctx, &verifiedClientKey.KeyInfo)
+ require.NoError(t, err)
+
+ verifiedClientIDAddr, err := clientApi.StateLookupID(ctx, verifiedClientAddr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ params, err := actors.SerializeParams(&verifregst.AddVerifierParams{Address: verifier1Addr, Allowance: big.NewInt(100000000000)})
+ require.NoError(t, err)
+
+ msg := &types.Message{
+ From: rootAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifier,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err := clientApi.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err, "AddVerifier failed")
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err := clientApi.StateWaitMsg(ctx, sm.Cid(), 1, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, res.Receipt.ExitCode.IsSuccess())
+
+ params, err = actors.SerializeParams(&verifregst.AddVerifierParams{Address: verifier2Addr, Allowance: big.NewInt(100000000000)})
+ require.NoError(t, err)
+
+ msg = &types.Message{
+ From: rootAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifier,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err = clientApi.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err, "AddVerifier failed")
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err = clientApi.StateWaitMsg(ctx, sm.Cid(), 1, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, res.Receipt.ExitCode.IsSuccess())
+
+ // assign datacap to a client
+ datacapToAssign := big.NewInt(10000)
+
+ params, err = actors.SerializeParams(&verifregst.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacapToAssign})
+ require.NoError(t, err)
+
+ msg = &types.Message{
+ From: verifier1Addr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.AddVerifiedClient,
+ Params: params,
+ Value: big.Zero(),
+ }
+
+ sm, err = clientApi.MpoolPushMessage(ctx, msg, nil)
+ require.NoError(t, err)
+
+ //stm: @CHAIN_STATE_WAIT_MSG_001
+ res, err = clientApi.StateWaitMsg(ctx, sm.Cid(), 1, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, res.Receipt.ExitCode.IsSuccess())
+
+ // check datacap balance
+ //stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001
+ dc, err := clientApi.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, *dc, datacapToAssign)
+
+ // END OF VERIFIED CLIENT BOILERPLATE
+
+ label, err := markettypes.NewLabelFromString("")
+ require.NoError(t, err)
+
+ dealStartEpoch := abi.ChainEpoch(1000)
+ dealProposal := markettypes.DealProposal{
+ PieceCID: migration.MakeCID("1", &markettypes.PieceCIDPrefix),
+ PieceSize: 1024,
+ Client: verifiedClientAddr,
+ Provider: testMiner.ActorAddr,
+ Label: label,
+ StartEpoch: dealStartEpoch,
+ EndEpoch: abi.ChainEpoch(1000_000),
+ StoragePricePerEpoch: big.Zero(),
+ ProviderCollateral: big.Zero(),
+ ClientCollateral: big.Zero(),
+ VerifiedDeal: true,
+ }
+
+ serializedProposal := new(bytes.Buffer)
+ err = dealProposal.MarshalCBOR(serializedProposal)
+ require.NoError(t, err)
+
+ sig, err := clientApi.WalletSign(ctx, verifiedClientAddr, serializedProposal.Bytes())
+ require.NoError(t, err)
+
+ publishDealParams := markettypes.PublishStorageDealsParams{
+ Deals: []markettypes.ClientDealProposal{{
+ Proposal: dealProposal,
+ ClientSignature: crypto.Signature{
+ Type: crypto.SigTypeBLS,
+ Data: sig.Data,
+ },
+ }},
+ }
+
+ serializedParams := new(bytes.Buffer)
+ require.NoError(t, publishDealParams.MarshalCBOR(serializedParams))
+
+ m, err := clientApi.MpoolPushMessage(ctx, &types.Message{
+ To: builtin.StorageMarketActorAddr,
+ From: testMiner.OwnerKey.Address,
+ Value: types.FromFil(0),
+ Method: builtin.MethodsMarket.PublishStorageDeals,
+ Params: serializedParams.Bytes(),
+ }, nil)
+ require.NoError(t, err)
+
+ r, err := clientApi.StateWaitMsg(ctx, m.Cid(), 2, api.LookbackNoLimit, true)
+ require.NoError(t, err)
+ require.True(t, r.Receipt.ExitCode.IsSuccess())
+
+ ret, err := market.DecodePublishStorageDealsReturn(r.Receipt.Return, build.TestNetworkVersion)
+ require.NoError(t, err)
+ valid, _, err := ret.IsDealValid(0)
+ require.NoError(t, err)
+ require.True(t, valid)
+
+ verifiedClientDcap, err := clientApi.StateVerifiedClientStatus(ctx, verifiedClientIDAddr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ // The client has already spent datacap equal to the deal's size -- this will be found in the VerifiedRegistryActor
+ require.Equal(t, big.Sub(datacapToAssign, big.NewIntUnsigned(uint64(dealProposal.PieceSize))), *verifiedClientDcap)
+
+ verifregDcapBefore, err := clientApi.StateVerifiedClientStatus(ctx, builtin.VerifiedRegistryActorAddr, types.EmptyTSK)
+ require.NoError(t, err)
+
+ // Verifreg should now have the datacap for this deal
+ require.Equal(t, big.NewIntUnsigned(uint64(dealProposal.PieceSize)), *verifregDcapBefore)
+
+ // Now let's try to remove datacap from Verifreg
+ removeProposal := verifregst.RemoveDataCapProposal{
+ VerifiedClient: verifreg.Address,
+ DataCapAmount: *verifregDcapBefore,
+ RemovalProposalID: verifregst.RmDcProposalID{ProposalID: 0},
+ }
+
+ buf := bytes.Buffer{}
+ buf.WriteString(verifregst.SignatureDomainSeparation_RemoveDataCap)
+ require.NoError(t, removeProposal.MarshalCBOR(&buf), "failed to marshal proposal")
+
+ removeProposalSer := buf.Bytes()
+
+ verifier1Sig, err := clientApi.WalletSign(ctx, verifier1Addr, removeProposalSer)
+ require.NoError(t, err, "failed to sign proposal")
+
+ removeRequest1 := verifregst.RemoveDataCapRequest{
+ Verifier: verifier1IDAddr,
+ VerifierSignature: *verifier1Sig,
+ }
+
+ verifier2Sig, err := clientApi.WalletSign(ctx, verifier2Addr, removeProposalSer)
+ require.NoError(t, err, "failed to sign proposal")
+
+ removeRequest2 := verifregst.RemoveDataCapRequest{
+ Verifier: verifier2IDAddr,
+ VerifierSignature: *verifier2Sig,
+ }
+
+ removeDataCapParams := verifregst.RemoveDataCapParams{
+ VerifiedClientToRemove: verifreg.Address,
+ DataCapAmountToRemove: *verifregDcapBefore,
+ VerifierRequest1: removeRequest1,
+ VerifierRequest2: removeRequest2,
+ }
+
+ params, aerr := actors.SerializeParams(&removeDataCapParams)
+ require.NoError(t, aerr)
+
+ callResult, err := clientApi.StateCall(ctx, &types.Message{
+ From: rootAddr,
+ To: verifreg.Address,
+ Method: verifreg.Methods.RemoveVerifiedClientDataCap,
+ Params: params,
+ Value: big.Zero(),
+ }, types.EmptyTSK)
+ require.Error(t, err)
+ require.False(t, callResult.MsgRct.ExitCode.IsSuccess())
+
+ verifregDatacapAfter, err := clientApi.StateVerifiedClientStatus(ctx, builtin.VerifiedRegistryActorAddr, types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, *verifregDcapBefore, *verifregDatacapAfter) // Verifreg should not have lost datacap
+}
diff --git a/itests/sector_finalize_early_test.go b/itests/sector_finalize_early_test.go
index 8678e6a28..fb7d9d94d 100644
--- a/itests/sector_finalize_early_test.go
+++ b/itests/sector_finalize_early_test.go
@@ -11,7 +11,7 @@ import (
"github.com/filecoin-project/lotus/itests/kit"
"github.com/filecoin-project/lotus/node/config"
- "github.com/filecoin-project/lotus/storage/paths"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
func TestDealsWithFinalizeEarly(t *testing.T) {
@@ -36,11 +36,11 @@ func TestDealsWithFinalizeEarly(t *testing.T) {
ctx := context.Background()
- miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.Weight = 1000000000
meta.CanSeal = true
})
- miner.AddStorage(ctx, t, func(meta *paths.LocalStorageMeta) {
+ miner.AddStorage(ctx, t, func(meta *storiface.LocalStorageMeta) {
meta.Weight = 1000000000
meta.CanStore = true
})
diff --git a/itests/sector_import_full_test.go b/itests/sector_import_full_test.go
new file mode 100644
index 000000000..35fc3e623
--- /dev/null
+++ b/itests/sector_import_full_test.go
@@ -0,0 +1,494 @@
+package itests
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "path/filepath"
+ "testing"
+ "time"
+
+ "github.com/gorilla/mux"
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/crypto"
+
+ "github.com/filecoin-project/lotus/api"
+ lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
+ "github.com/filecoin-project/lotus/chain/actors/policy"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/itests/kit"
+ spaths "github.com/filecoin-project/lotus/storage/paths"
+ sealing "github.com/filecoin-project/lotus/storage/pipeline"
+ "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
+ "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper/basicfs"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
+ "github.com/filecoin-project/lotus/storage/sealer/tarutil"
+)
+
+func TestSectorImport(t *testing.T) {
+
+ type testCase struct {
+ c1handler func(s *ffiwrapper.Sealer, m *kit.TestMiner) func(w http.ResponseWriter, r *http.Request)
+
+ mutateRemoteMeta func(*api.RemoteSectorMeta)
+
+ expectImportErrContains string
+
+ expectDoneSuccess bool
+ expectDoneState string
+ }
+
+ makeTest := func(mut func(*testCase)) *testCase {
+ tc := &testCase{
+ c1handler: testRemoteCommit1,
+
+ expectDoneSuccess: true,
+ expectDoneState: "Proving",
+ }
+ mut(tc)
+ return tc
+ }
+
+ runTest := func(tc *testCase) func(t *testing.T) {
+ return func(t *testing.T) {
+ kit.QuietMiningLogs()
+
+ var blockTime = 50 * time.Millisecond
+
+ ////////
+ // Start a miner node
+
+ client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC())
+ ens.InterconnectAll().BeginMining(blockTime)
+
+ ctx := context.Background()
+
+ ////////
+ // Reserve some sector numbers on the miner node; We'll use one of those when creating the sector "remotely"
+ snums, err := miner.SectorNumReserveCount(ctx, "test-reservation-0001", 16)
+ require.NoError(t, err)
+
+ sectorDir := t.TempDir()
+
+ maddr, err := miner.ActorAddress(ctx)
+ require.NoError(t, err)
+
+ mid, err := address.IDFromAddress(maddr)
+ require.NoError(t, err)
+
+ mi, err := client.StateMinerInfo(ctx, maddr, types.EmptyTSK)
+ require.NoError(t, err)
+ ver, err := client.StateNetworkVersion(ctx, types.EmptyTSK)
+ require.NoError(t, err)
+ spt, err := lminer.PreferredSealProofTypeFromWindowPoStType(ver, mi.WindowPoStProofType)
+ require.NoError(t, err)
+
+ ssize, err := spt.SectorSize()
+ require.NoError(t, err)
+
+ pieceSize := abi.PaddedPieceSize(ssize)
+
+ ////////
+ // Create/Seal a sector up to pc2 outside of the pipeline
+
+ // get one sector number from the reservation done on the miner above
+ sn, err := snums.First()
+ require.NoError(t, err)
+
+ // create all the sector identifiers
+ snum := abi.SectorNumber(sn)
+ sid := abi.SectorID{Miner: abi.ActorID(mid), Number: snum}
+ sref := storiface.SectorRef{ID: sid, ProofType: spt}
+
+ // create a low-level sealer instance
+ sealer, err := ffiwrapper.New(&basicfs.Provider{
+ Root: sectorDir,
+ })
+ require.NoError(t, err)
+
+ // CREATE THE UNSEALED FILE
+
+ // create a reader for all-zero (CC) data
+ dataReader := bytes.NewReader(bytes.Repeat([]byte{0}, int(pieceSize.Unpadded())))
+
+ // create the unsealed CC sector file
+ pieceInfo, err := sealer.AddPiece(ctx, sref, nil, pieceSize.Unpadded(), dataReader)
+ require.NoError(t, err)
+
+ // GENERATE THE TICKET
+
+ // get most recent valid ticket epoch
+ ts, err := client.ChainHead(ctx)
+ require.NoError(t, err)
+ ticketEpoch := ts.Height() - policy.SealRandomnessLookback
+
+ // ticket entropy is cbor-seriasized miner addr
+ buf := new(bytes.Buffer)
+ require.NoError(t, maddr.MarshalCBOR(buf))
+
+ // generate ticket randomness
+ rand, err := client.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, ticketEpoch, buf.Bytes(), ts.Key())
+ require.NoError(t, err)
+
+ // EXECUTE PRECOMMIT 1 / 2
+
+ // run PC1
+ pc1out, err := sealer.SealPreCommit1(ctx, sref, abi.SealRandomness(rand), []abi.PieceInfo{pieceInfo})
+ require.NoError(t, err)
+
+ // run pc2
+ scids, err := sealer.SealPreCommit2(ctx, sref, pc1out)
+ require.NoError(t, err)
+
+ // make finalized cache, put it in [sectorDir]/fin-cache while keeping the large cache for remote C1
+ finDst := filepath.Join(sectorDir, "fin-cache", fmt.Sprintf("s-t01000-%d", snum))
+ require.NoError(t, os.MkdirAll(finDst, 0777))
+ require.NoError(t, sealer.FinalizeSectorInto(ctx, sref, finDst))
+
+ ////////
+ // start http server serving sector data
+
+ doneResp := new(*api.RemoteSealingDoneParams)
+
+ m := mux.NewRouter()
+ m.HandleFunc("/sectors/{type}/{id}", testRemoteGetSector(sectorDir)).Methods("GET")
+ m.HandleFunc("/sectors/{id}/commit1", tc.c1handler(sealer, miner)).Methods("POST")
+ m.HandleFunc("/sectors/{id}/sealed", testRemoteDone(doneResp)).Methods("POST")
+ m.HandleFunc("/commit2", testRemoteCommit2(sealer)).Methods("POST")
+ srv := httptest.NewServer(m)
+
+ unsealedURL := fmt.Sprintf("%s/sectors/unsealed/s-t0%d-%d", srv.URL, mid, snum)
+ sealedURL := fmt.Sprintf("%s/sectors/sealed/s-t0%d-%d", srv.URL, mid, snum)
+ cacheURL := fmt.Sprintf("%s/sectors/cache/s-t0%d-%d", srv.URL, mid, snum)
+ remoteC1URL := fmt.Sprintf("%s/sectors/s-t0%d-%d/commit1", srv.URL, mid, snum)
+ remoteC2URL := fmt.Sprintf("%s/commit2", srv.URL)
+ doneURL := fmt.Sprintf("%s/sectors/s-t0%d-%d/sealed", srv.URL, mid, snum)
+
+ ////////
+ // import the sector and continue sealing
+
+ rmeta := api.RemoteSectorMeta{
+ State: "PreCommitting",
+ Sector: sid,
+ Type: spt,
+
+ Pieces: []api.SectorPiece{
+ {
+ Piece: pieceInfo,
+ DealInfo: nil,
+ },
+ },
+
+ TicketValue: abi.SealRandomness(rand),
+ TicketEpoch: ticketEpoch,
+
+ PreCommit1Out: pc1out,
+
+ CommD: &scids.Unsealed,
+ CommR: &scids.Sealed,
+
+ DataUnsealed: &storiface.SectorLocation{
+ Local: false,
+ URL: unsealedURL,
+ },
+ DataSealed: &storiface.SectorLocation{
+ Local: false,
+ URL: sealedURL,
+ },
+ DataCache: &storiface.SectorLocation{
+ Local: false,
+ URL: cacheURL,
+ },
+
+ RemoteCommit1Endpoint: remoteC1URL,
+ RemoteCommit2Endpoint: remoteC2URL,
+ RemoteSealingDoneEndpoint: doneURL,
+ }
+
+ if tc.mutateRemoteMeta != nil {
+ tc.mutateRemoteMeta(&rmeta)
+ }
+
+ err = miner.SectorReceive(ctx, rmeta)
+ if tc.expectImportErrContains != "" {
+ require.ErrorContains(t, err, tc.expectImportErrContains)
+ return
+ }
+
+ require.NoError(t, err)
+
+ // check that we see the imported sector
+ ng, err := miner.SectorsListNonGenesis(ctx)
+ require.NoError(t, err)
+ require.Len(t, ng, 1)
+ require.Equal(t, snum, ng[0])
+
+ miner.WaitSectorsProvingAllowFails(ctx, map[abi.SectorNumber]struct{}{snum: {}}, map[api.SectorState]struct{}{api.SectorState(sealing.RemoteCommitFailed): {}})
+
+ require.NotNil(t, *doneResp)
+ require.Equal(t, tc.expectDoneSuccess, (*doneResp).Successful)
+ require.Equal(t, tc.expectDoneState, (*doneResp).State)
+ if tc.expectDoneSuccess {
+ require.NotNil(t, (*doneResp).CommitMessage)
+ }
+ }
+ }
+
+ // fail first remote c1, verifies that c1 retry works
+ t.Run("c1-retry", runTest(makeTest(func(testCase *testCase) {
+ prt := sealing.MinRetryTime
+ sealing.MinRetryTime = time.Second
+ t.Cleanup(func() {
+ sealing.MinRetryTime = prt
+ })
+
+ testCase.c1handler = func(s *ffiwrapper.Sealer, m *kit.TestMiner) func(w http.ResponseWriter, r *http.Request) {
+ var failedOnce bool
+
+ return func(w http.ResponseWriter, r *http.Request) {
+ if !failedOnce {
+ failedOnce = true
+ w.WriteHeader(http.StatusBadGateway)
+ return
+ }
+
+ testRemoteCommit1(s, m)(w, r)
+ }
+ }
+ })))
+
+ t.Run("c1-fail-remove", runTest(makeTest(func(testCase *testCase) {
+ prt := sealing.MinRetryTime
+ sealing.MinRetryTime = time.Second
+ t.Cleanup(func() {
+ sealing.MinRetryTime = prt
+ })
+
+ testCase.c1handler = func(s *ffiwrapper.Sealer, m *kit.TestMiner) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+
+ id, err := storiface.ParseSectorID(vars["id"])
+ if err != nil {
+ panic(err)
+ }
+
+ err = m.SectorRemove(r.Context(), id.Number)
+ if err != nil {
+ panic(err)
+ }
+
+ w.WriteHeader(http.StatusBadGateway)
+ }
+ }
+
+ testCase.expectDoneSuccess = false
+ testCase.expectDoneState = "Removing"
+ })))
+
+ t.Run("nil-commd", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ meta.CommD = nil
+ }
+ testCase.expectImportErrContains = "both CommR/CommD cids need to be set for sectors in PreCommitting and later states"
+ })))
+ t.Run("nil-commr", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ meta.CommR = nil
+ }
+ testCase.expectImportErrContains = "both CommR/CommD cids need to be set for sectors in PreCommitting and later states"
+ })))
+
+ t.Run("nil-uns", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ meta.DataUnsealed = nil
+ }
+ testCase.expectImportErrContains = "expected DataUnsealed to be set"
+ })))
+ t.Run("nil-sealed", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ meta.DataSealed = nil
+ }
+ testCase.expectImportErrContains = "expected DataSealed to be set"
+ })))
+ t.Run("nil-cache", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ meta.DataCache = nil
+ }
+ testCase.expectImportErrContains = "expected DataCache to be set"
+ })))
+
+ t.Run("bad-commd", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ meta.CommD = meta.CommR
+ }
+ testCase.expectImportErrContains = "CommD cid has wrong prefix"
+ })))
+ t.Run("bad-commr", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ meta.CommR = meta.CommD
+ }
+ testCase.expectImportErrContains = "CommR cid has wrong prefix"
+ })))
+
+ t.Run("bad-ticket", runTest(makeTest(func(testCase *testCase) {
+ testCase.mutateRemoteMeta = func(meta *api.RemoteSectorMeta) {
+ // flip one bit
+ meta.TicketValue[23] ^= 4
+ }
+ testCase.expectImportErrContains = "tickets differ"
+ })))
+
+}
+
+// note: stuff below is almost the same as in _simple version of this file; We need
+// to copy it because on Circle we can't call those functions between test files,
+// and for the _simple test we want everything in one file to make it easy to follow
+func testRemoteDone(rs **api.RemoteSealingDoneParams) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ *rs = new(api.RemoteSealingDoneParams)
+ if err := json.NewDecoder(r.Body).Decode(*rs); err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ w.WriteHeader(200)
+ }
+}
+
+func testRemoteCommit1(s *ffiwrapper.Sealer, m *kit.TestMiner) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+
+ // validate sector id
+ id, err := storiface.ParseSectorID(vars["id"])
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ var params api.RemoteCommit1Params
+ if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ sref := storiface.SectorRef{
+ ID: id,
+ ProofType: params.ProofType,
+ }
+
+ ssize, err := params.ProofType.SectorSize()
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ p, err := s.SealCommit1(r.Context(), sref, params.Ticket, params.Seed, []abi.PieceInfo{
+ {
+ Size: abi.PaddedPieceSize(ssize),
+ PieceCID: params.Unsealed,
+ },
+ }, storiface.SectorCids{
+ Unsealed: params.Unsealed,
+ Sealed: params.Sealed,
+ })
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ if _, err := w.Write(p); err != nil {
+ fmt.Println("c1 write error")
+ }
+ }
+}
+
+func testRemoteCommit2(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ var params api.RemoteCommit2Params
+ if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ sref := storiface.SectorRef{
+ ID: params.Sector,
+ ProofType: params.ProofType,
+ }
+
+ p, err := s.SealCommit2(r.Context(), sref, params.Commit1Out)
+ if err != nil {
+ fmt.Println("c2 error: ", err)
+ w.WriteHeader(500)
+ return
+ }
+
+ if _, err := w.Write(p); err != nil {
+ fmt.Println("c2 write error")
+ }
+ }
+}
+
+func testRemoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+
+ vars := mux.Vars(r)
+
+ // validate sector id
+ id, err := storiface.ParseSectorID(vars["id"])
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ // validate type
+ _, err = spaths.FileTypeFromString(vars["type"])
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ typ := vars["type"]
+ if typ == "cache" {
+ // if cache is requested, send the finalized cache we've created above
+ typ = "fin-cache"
+ }
+
+ path := filepath.Join(sectorRoot, typ, vars["id"])
+
+ stat, err := os.Stat(path)
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ if stat.IsDir() {
+ if _, has := r.Header["Range"]; has {
+ w.WriteHeader(500)
+ return
+ }
+
+ w.Header().Set("Content-Type", "application/x-tar")
+ w.WriteHeader(200)
+
+ err := tarutil.TarDirectory(path, w, make([]byte, 1<<20))
+ if err != nil {
+ return
+ }
+ } else {
+ w.Header().Set("Content-Type", "application/octet-stream")
+ // will do a ranged read over the file at the given path if the caller has asked for a ranged read in the request headers.
+ http.ServeFile(w, r, path)
+ }
+
+ fmt.Printf("served sector file/dir, sectorID=%+v, fileType=%s, path=%s\n", id, vars["type"], path)
+ }
+}
diff --git a/itests/sector_import_simple_test.go b/itests/sector_import_simple_test.go
new file mode 100644
index 000000000..0cf7e098b
--- /dev/null
+++ b/itests/sector_import_simple_test.go
@@ -0,0 +1,345 @@
+package itests
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "path/filepath"
+ "testing"
+ "time"
+
+ "github.com/gorilla/mux"
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/crypto"
+
+ "github.com/filecoin-project/lotus/api"
+ lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
+ "github.com/filecoin-project/lotus/chain/actors/policy"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/itests/kit"
+ spaths "github.com/filecoin-project/lotus/storage/paths"
+ "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
+ "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper/basicfs"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
+ "github.com/filecoin-project/lotus/storage/sealer/tarutil"
+)
+
+func TestSectorImportAfterPC2(t *testing.T) {
+ kit.QuietMiningLogs()
+
+ var blockTime = 50 * time.Millisecond
+
+ ////////
+ // Start a miner node
+
+ client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC())
+ ens.InterconnectAll().BeginMining(blockTime)
+
+ ctx := context.Background()
+
+ ////////
+ // Reserve some sector numbers on the miner node; We'll use one of those when creating the sector "remotely"
+ snums, err := miner.SectorNumReserveCount(ctx, "test-reservation-0001", 16)
+ require.NoError(t, err)
+
+ sectorDir := t.TempDir()
+
+ maddr, err := miner.ActorAddress(ctx)
+ require.NoError(t, err)
+
+ mid, err := address.IDFromAddress(maddr)
+ require.NoError(t, err)
+
+ mi, err := client.StateMinerInfo(ctx, maddr, types.EmptyTSK)
+ require.NoError(t, err)
+ ver, err := client.StateNetworkVersion(ctx, types.EmptyTSK)
+ require.NoError(t, err)
+ spt, err := lminer.PreferredSealProofTypeFromWindowPoStType(ver, mi.WindowPoStProofType)
+ require.NoError(t, err)
+
+ ssize, err := spt.SectorSize()
+ require.NoError(t, err)
+
+ pieceSize := abi.PaddedPieceSize(ssize)
+
+ ////////
+ // Create/Seal a sector up to pc2 outside of the pipeline
+
+ // get one sector number from the reservation done on the miner above
+ sn, err := snums.First()
+ require.NoError(t, err)
+
+ // create all the sector identifiers
+ snum := abi.SectorNumber(sn)
+ sid := abi.SectorID{Miner: abi.ActorID(mid), Number: snum}
+ sref := storiface.SectorRef{ID: sid, ProofType: spt}
+
+ // create a low-level sealer instance
+ sealer, err := ffiwrapper.New(&basicfs.Provider{
+ Root: sectorDir,
+ })
+ require.NoError(t, err)
+
+ // CREATE THE UNSEALED FILE
+
+ // create a reader for all-zero (CC) data
+ dataReader := bytes.NewReader(bytes.Repeat([]byte{0}, int(pieceSize.Unpadded())))
+
+ // create the unsealed CC sector file
+ pieceInfo, err := sealer.AddPiece(ctx, sref, nil, pieceSize.Unpadded(), dataReader)
+ require.NoError(t, err)
+
+ // GENERATE THE TICKET
+
+ // get most recent valid ticket epoch
+ ts, err := client.ChainHead(ctx)
+ require.NoError(t, err)
+ ticketEpoch := ts.Height() - policy.SealRandomnessLookback
+
+ // ticket entropy is cbor-seriasized miner addr
+ buf := new(bytes.Buffer)
+ require.NoError(t, maddr.MarshalCBOR(buf))
+
+ // generate ticket randomness
+ rand, err := client.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, ticketEpoch, buf.Bytes(), ts.Key())
+ require.NoError(t, err)
+
+ // EXECUTE PRECOMMIT 1 / 2
+
+ // run PC1
+ pc1out, err := sealer.SealPreCommit1(ctx, sref, abi.SealRandomness(rand), []abi.PieceInfo{pieceInfo})
+ require.NoError(t, err)
+
+ // run pc2
+ scids, err := sealer.SealPreCommit2(ctx, sref, pc1out)
+ require.NoError(t, err)
+
+ // make finalized cache, put it in [sectorDir]/fin-cache while keeping the large cache for remote C1
+ finDst := filepath.Join(sectorDir, "fin-cache", fmt.Sprintf("s-t01000-%d", snum))
+ require.NoError(t, os.MkdirAll(finDst, 0777))
+ require.NoError(t, sealer.FinalizeSectorInto(ctx, sref, finDst))
+
+ ////////
+ // start http server serving sector data
+
+ doneResp := new(*api.RemoteSealingDoneParams)
+
+ m := mux.NewRouter()
+ m.HandleFunc("/sectors/{type}/{id}", remoteGetSector(sectorDir)).Methods("GET")
+ m.HandleFunc("/sectors/{id}/commit1", remoteCommit1(sealer)).Methods("POST")
+ m.HandleFunc("/sectors/{id}/sealed", remoteDone(doneResp)).Methods("POST")
+ m.HandleFunc("/commit2", remoteCommit2(sealer)).Methods("POST")
+
+ srv := httptest.NewServer(m)
+
+ unsealedURL := fmt.Sprintf("%s/sectors/unsealed/s-t0%d-%d", srv.URL, mid, snum)
+ sealedURL := fmt.Sprintf("%s/sectors/sealed/s-t0%d-%d", srv.URL, mid, snum)
+ cacheURL := fmt.Sprintf("%s/sectors/cache/s-t0%d-%d", srv.URL, mid, snum)
+ remoteC1URL := fmt.Sprintf("%s/sectors/s-t0%d-%d/commit1", srv.URL, mid, snum)
+ remoteC2URL := fmt.Sprintf("%s/commit2", srv.URL)
+ doneURL := fmt.Sprintf("%s/sectors/s-t0%d-%d/sealed", srv.URL, mid, snum)
+
+ ////////
+ // import the sector and continue sealing
+
+ err = miner.SectorReceive(ctx, api.RemoteSectorMeta{
+ State: "PreCommitting",
+ Sector: sid,
+ Type: spt,
+
+ Pieces: []api.SectorPiece{
+ {
+ Piece: pieceInfo,
+ DealInfo: nil,
+ },
+ },
+
+ TicketValue: abi.SealRandomness(rand),
+ TicketEpoch: ticketEpoch,
+
+ PreCommit1Out: pc1out,
+
+ CommD: &scids.Unsealed,
+ CommR: &scids.Sealed,
+
+ DataUnsealed: &storiface.SectorLocation{
+ Local: false,
+ URL: unsealedURL,
+ },
+ DataSealed: &storiface.SectorLocation{
+ Local: false,
+ URL: sealedURL,
+ },
+ DataCache: &storiface.SectorLocation{
+ Local: false,
+ URL: cacheURL,
+ },
+
+ RemoteCommit1Endpoint: remoteC1URL,
+ RemoteCommit2Endpoint: remoteC2URL,
+ RemoteSealingDoneEndpoint: doneURL,
+ })
+ require.NoError(t, err)
+
+ // check that we see the imported sector
+ ng, err := miner.SectorsListNonGenesis(ctx)
+ require.NoError(t, err)
+ require.Len(t, ng, 1)
+ require.Equal(t, snum, ng[0])
+
+ miner.WaitSectorsProving(ctx, map[abi.SectorNumber]struct{}{snum: {}})
+
+ require.NotNil(t, *doneResp)
+ require.True(t, (*doneResp).Successful)
+ require.Equal(t, "Proving", (*doneResp).State)
+ require.NotNil(t, (*doneResp).CommitMessage)
+}
+
+func remoteCommit1(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+
+ // validate sector id
+ id, err := storiface.ParseSectorID(vars["id"])
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ var params api.RemoteCommit1Params
+ if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ sref := storiface.SectorRef{
+ ID: id,
+ ProofType: params.ProofType,
+ }
+
+ ssize, err := params.ProofType.SectorSize()
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ p, err := s.SealCommit1(r.Context(), sref, params.Ticket, params.Seed, []abi.PieceInfo{
+ {
+ Size: abi.PaddedPieceSize(ssize),
+ PieceCID: params.Unsealed,
+ },
+ }, storiface.SectorCids{
+ Unsealed: params.Unsealed,
+ Sealed: params.Sealed,
+ })
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ if _, err := w.Write(p); err != nil {
+ fmt.Println("c1 write error")
+ }
+ }
+}
+
+func remoteDone(rs **api.RemoteSealingDoneParams) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ *rs = new(api.RemoteSealingDoneParams)
+ if err := json.NewDecoder(r.Body).Decode(*rs); err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ w.WriteHeader(200)
+ }
+}
+
+func remoteCommit2(s *ffiwrapper.Sealer) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ var params api.RemoteCommit2Params
+ if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ sref := storiface.SectorRef{
+ ID: params.Sector,
+ ProofType: params.ProofType,
+ }
+
+ p, err := s.SealCommit2(r.Context(), sref, params.Commit1Out)
+ if err != nil {
+ fmt.Println("c2 error: ", err)
+ w.WriteHeader(500)
+ return
+ }
+
+ if _, err := w.Write(p); err != nil {
+ fmt.Println("c2 write error")
+ }
+ }
+}
+
+func remoteGetSector(sectorRoot string) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+
+ vars := mux.Vars(r)
+
+ // validate sector id
+ id, err := storiface.ParseSectorID(vars["id"])
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ // validate type
+ _, err = spaths.FileTypeFromString(vars["type"])
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ typ := vars["type"]
+ if typ == "cache" {
+ // if cache is requested, send the finalized cache we've created above
+ typ = "fin-cache"
+ }
+
+ path := filepath.Join(sectorRoot, typ, vars["id"])
+
+ stat, err := os.Stat(path)
+ if err != nil {
+ w.WriteHeader(500)
+ return
+ }
+
+ if stat.IsDir() {
+ if _, has := r.Header["Range"]; has {
+ w.WriteHeader(500)
+ return
+ }
+
+ w.Header().Set("Content-Type", "application/x-tar")
+ w.WriteHeader(200)
+
+ err := tarutil.TarDirectory(path, w, make([]byte, 1<<20))
+ if err != nil {
+ return
+ }
+ } else {
+ w.Header().Set("Content-Type", "application/octet-stream")
+ // will do a ranged read over the file at the given path if the caller has asked for a ranged read in the request headers.
+ http.ServeFile(w, r, path)
+ }
+
+ fmt.Printf("served sector file/dir, sectorID=%+v, fileType=%s, path=%s\n", id, vars["type"], path)
+ }
+}
diff --git a/itests/sector_make_cc_avail_test.go b/itests/sector_make_cc_avail_test.go
index c6ed4b36d..524b3c70f 100644
--- a/itests/sector_make_cc_avail_test.go
+++ b/itests/sector_make_cc_avail_test.go
@@ -44,6 +44,7 @@ func TestMakeAvailable(t *testing.T) {
{
si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK)
require.NoError(t, err)
+ require.NotNil(t, si)
require.Less(t, 50000, int(si.Expiration))
}
client.WaitForSectorActive(ctx, t, CCUpgrade, maddr)
diff --git a/itests/sector_prefer_no_upgrade_test.go b/itests/sector_prefer_no_upgrade_test.go
index 0294899d9..96f07f9e4 100644
--- a/itests/sector_prefer_no_upgrade_test.go
+++ b/itests/sector_prefer_no_upgrade_test.go
@@ -46,6 +46,7 @@ func TestPreferNoUpgrade(t *testing.T) {
{
si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK)
require.NoError(t, err)
+ require.NotNil(t, si)
require.Less(t, 50000, int(si.Expiration))
}
client.WaitForSectorActive(ctx, t, CCUpgrade, maddr)
diff --git a/itests/sector_revert_available_test.go b/itests/sector_revert_available_test.go
index 99d410e95..41a46024f 100644
--- a/itests/sector_revert_available_test.go
+++ b/itests/sector_revert_available_test.go
@@ -42,6 +42,7 @@ func TestAbortUpgradeAvailable(t *testing.T) {
{
si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK)
require.NoError(t, err)
+ require.NotNil(t, si)
require.Less(t, 50000, int(si.Expiration))
}
client.WaitForSectorActive(ctx, t, CCUpgrade, maddr)
diff --git a/itests/sector_unseal_test.go b/itests/sector_unseal_test.go
new file mode 100644
index 000000000..5d05cb0e3
--- /dev/null
+++ b/itests/sector_unseal_test.go
@@ -0,0 +1,142 @@
+package itests
+
+import (
+ "context"
+ "fmt"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+
+ "github.com/filecoin-project/lotus/itests/kit"
+ "github.com/filecoin-project/lotus/node/config"
+ "github.com/filecoin-project/lotus/storage/sealer/sealtasks"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
+)
+
+func TestUnsealPiece(t *testing.T) {
+ ctx := context.Background()
+ blockTime := 1 * time.Millisecond
+ kit.QuietMiningLogs()
+
+ _, miner, ens := kit.EnsembleMinimal(t, kit.WithAllSubsystems(), kit.ThroughRPC(), kit.WithNoLocalSealing(true),
+ kit.NoStorage(), // no storage to have better control over path settings
+ kit.MutateSealingConfig(func(sc *config.SealingConfig) {
+ sc.FinalizeEarly = true
+ sc.AlwaysKeepUnsealedCopy = false
+ })) // no mock proofs
+
+ var worker kit.TestWorker
+ ens.Worker(miner, &worker, kit.ThroughRPC(), kit.NoStorage(), // no storage to have better control over path settings
+ kit.WithTaskTypes([]sealtasks.TaskType{
+ sealtasks.TTFetch, sealtasks.TTAddPiece,
+ sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit2,
+ sealtasks.TTReplicaUpdate, sealtasks.TTUnseal, // only first update step, later steps will not run and we'll abort
+ }),
+ )
+
+ ens.Start().InterconnectAll().BeginMiningMustPost(blockTime)
+
+ maddr, err := miner.ActorAddress(ctx)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // get storage paths
+
+ // store-only path on the miner
+ miner.AddStorage(ctx, t, func(cfg *storiface.LocalStorageMeta) {
+ cfg.CanSeal = false
+ cfg.CanStore = true
+ })
+
+ mlocal, err := miner.StorageLocal(ctx)
+ require.NoError(t, err)
+ require.Len(t, mlocal, 2) // genesis and one local
+
+ // we want a seal-only path on the worker disconnected from miner path
+ worker.AddStorage(ctx, t, func(cfg *storiface.LocalStorageMeta) {
+ cfg.CanSeal = true
+ cfg.CanStore = false
+ })
+
+ wpaths, err := worker.Paths(ctx)
+ require.NoError(t, err)
+ require.Len(t, wpaths, 1)
+
+ // check which sectors files are present on the miner/worker storage paths
+ checkSectors := func(miners, workers storiface.SectorFileType) {
+ paths, err := miner.StorageList(ctx)
+ require.NoError(t, err)
+ require.Len(t, paths, 3) // genesis, miner, worker
+
+ // first loop for debugging
+ for id, decls := range paths {
+ pinfo, err := miner.StorageInfo(ctx, id)
+ require.NoError(t, err)
+
+ switch {
+ case id == wpaths[0].ID: // worker path
+ fmt.Println("Worker Decls ", len(decls), decls)
+ case !pinfo.CanStore && !pinfo.CanSeal: // genesis path
+ fmt.Println("Genesis Decls ", len(decls), decls)
+ default: // miner path
+ fmt.Println("Miner Decls ", len(decls), decls)
+ }
+ }
+
+ for id, decls := range paths {
+ pinfo, err := miner.StorageInfo(ctx, id)
+ require.NoError(t, err)
+
+ switch {
+ case id == wpaths[0].ID: // worker path
+ if workers != storiface.FTNone {
+ require.Len(t, decls, 1)
+ require.EqualValues(t, workers.Strings(), decls[0].SectorFileType.Strings())
+ } else {
+ require.Len(t, decls, 0)
+ }
+ case !pinfo.CanStore && !pinfo.CanSeal: // genesis path
+ require.Len(t, decls, kit.DefaultPresealsPerBootstrapMiner)
+ default: // miner path
+ if miners != storiface.FTNone {
+ require.Len(t, decls, 1)
+ require.EqualValues(t, miners.Strings(), decls[0].SectorFileType.Strings())
+ } else {
+ require.Len(t, decls, 0)
+ }
+ }
+ }
+ }
+ checkSectors(storiface.FTNone, storiface.FTNone)
+
+ // get a sector for upgrading
+ miner.PledgeSectors(ctx, 1, 0, nil)
+ sl, err := miner.SectorsListNonGenesis(ctx)
+ require.NoError(t, err)
+ require.Len(t, sl, 1, "expected 1 sector")
+
+ sector := sl[0]
+
+ checkSectors(storiface.FTCache|storiface.FTSealed, storiface.FTNone)
+
+ sinfo, err := miner.SectorsStatus(ctx, sector, false)
+ require.NoError(t, err)
+
+ minerId, err := address.IDFromAddress(maddr)
+ require.NoError(t, err)
+
+ sectorRef := storiface.SectorRef{
+ ID: abi.SectorID{Miner: abi.ActorID(minerId), Number: sector},
+ ProofType: sinfo.SealProof,
+ }
+
+ err = miner.SectorsUnsealPiece(ctx, sectorRef, 0, 0, sinfo.Ticket.Value, sinfo.CommD)
+ require.NoError(t, err)
+
+ checkSectors(storiface.FTCache|storiface.FTSealed|storiface.FTUnsealed, storiface.FTNone)
+}
diff --git a/itests/splitstore_test.go b/itests/splitstore_test.go
index db74e86a9..957efe32f 100644
--- a/itests/splitstore_test.go
+++ b/itests/splitstore_test.go
@@ -63,7 +63,16 @@ func TestHotstoreCompactCleansGarbage(t *testing.T) {
// create garbage
g := NewGarbager(ctx, t, full)
- garbage, e := g.Drop(ctx)
+ // state
+ garbageS, eS := g.Drop(ctx)
+ // message
+ garbageM, eM := g.Message(ctx)
+ e := eM
+ if eS > eM {
+ e = eS
+ }
+ assert.True(g.t, g.Exists(ctx, garbageS), "Garbage state not found in splitstore")
+ assert.True(g.t, g.Exists(ctx, garbageM), "Garbage message not found in splitstore")
// calculate next compaction where we should actually see cleanup
@@ -94,7 +103,8 @@ func TestHotstoreCompactCleansGarbage(t *testing.T) {
waitForCompaction(ctx, t, garbageCompactionIndex, full)
// check that garbage is cleaned up
- assert.False(t, g.Exists(ctx, garbage), "Garbage still exists in blockstore")
+ assert.False(t, g.Exists(ctx, garbageS), "Garbage state still exists in blockstore")
+ assert.False(t, g.Exists(ctx, garbageM), "Garbage message still exists in blockstore")
}
// Create unreachable state
@@ -112,8 +122,16 @@ func TestColdStorePrune(t *testing.T) {
// create garbage
g := NewGarbager(ctx, t, full)
- garbage, e := g.Drop(ctx)
- assert.True(g.t, g.Exists(ctx, garbage), "Garbage not found in splitstore")
+ // state
+ garbageS, eS := g.Drop(ctx)
+ // message
+ garbageM, eM := g.Message(ctx)
+ e := eM
+ if eS > eM {
+ e = eS
+ }
+ assert.True(g.t, g.Exists(ctx, garbageS), "Garbage state not found in splitstore")
+ assert.True(g.t, g.Exists(ctx, garbageM), "Garbage message not found in splitstore")
// calculate next compaction where we should actually see cleanup
@@ -148,7 +166,8 @@ func TestColdStorePrune(t *testing.T) {
// This data should now be moved to the coldstore.
// Access it without hotview to keep it there while checking that it still exists
// Only state compute uses hot view so garbager Exists backed by ChainReadObj is all good
- assert.True(g.t, g.Exists(ctx, garbage), "Garbage not found in splitstore")
+ assert.True(g.t, g.Exists(ctx, garbageS), "Garbage state not found in splitstore")
+ assert.True(g.t, g.Exists(ctx, garbageM), "Garbage message not found in splitstore")
bm.Restart()
// wait for compaction to finsih and pause to make sure it doesn't start to avoid racing
@@ -165,14 +184,15 @@ func TestColdStorePrune(t *testing.T) {
require.NoError(t, full.ChainPrune(ctx, pruneOpts))
bm.Restart()
waitForPrune(ctx, t, 1, full)
- assert.False(g.t, g.Exists(ctx, garbage), "Garbage should be removed from cold store after prune but it's still there")
+ assert.False(g.t, g.Exists(ctx, garbageS), "Garbage state should be removed from cold store after prune but it's still there")
+ assert.True(g.t, g.Exists(ctx, garbageM), "Garbage message should be on the cold store after prune")
}
-func TestAutoPrune(t *testing.T) {
+func TestMessagesMode(t *testing.T) {
ctx := context.Background()
// disable sync checking because efficient itests require that the node is out of sync : /
splitstore.CheckSyncGap = false
- opts := []interface{}{kit.MockProofs(), kit.SplitstoreUniversal(), kit.SplitstoreAutoPrune(), kit.FsRepo()}
+ opts := []interface{}{kit.MockProofs(), kit.SplitstoreMessges(), kit.FsRepo()}
full, genesisMiner, ens := kit.EnsembleMinimal(t, opts...)
bm := ens.InterconnectAll().BeginMining(4 * time.Millisecond)[0]
_ = full
@@ -180,8 +200,16 @@ func TestAutoPrune(t *testing.T) {
// create garbage
g := NewGarbager(ctx, t, full)
- garbage, e := g.Drop(ctx)
- assert.True(g.t, g.Exists(ctx, garbage), "Garbage not found in splitstore")
+ // state
+ garbageS, eS := g.Drop(ctx)
+ // message
+ garbageM, eM := g.Message(ctx)
+ e := eM
+ if eS > eM {
+ e = eS
+ }
+ assert.True(g.t, g.Exists(ctx, garbageS), "Garbage state not found in splitstore")
+ assert.True(g.t, g.Exists(ctx, garbageM), "Garbage message not found in splitstore")
// calculate next compaction where we should actually see cleanup
@@ -213,13 +241,12 @@ func TestAutoPrune(t *testing.T) {
bm.Pause()
- // This data should now be moved to the coldstore.
+ // Messages should be moved to the coldstore
+ // State should be gced
// Access it without hotview to keep it there while checking that it still exists
// Only state compute uses hot view so garbager Exists backed by ChainReadObj is all good
- assert.True(g.t, g.Exists(ctx, garbage), "Garbage not found in splitstore")
- bm.Restart()
- waitForPrune(ctx, t, 1, full)
- assert.False(g.t, g.Exists(ctx, garbage), "Garbage should be removed from cold store through auto prune but it's still there")
+ assert.False(g.t, g.Exists(ctx, garbageS), "Garbage state not found in splitstore")
+ assert.True(g.t, g.Exists(ctx, garbageM), "Garbage message not found in splitstore")
}
func waitForCompaction(ctx context.Context, t *testing.T, cIdx int64, n *kit.TestFullNode) {
@@ -304,7 +331,7 @@ func NewGarbager(ctx context.Context, t *testing.T, n *kit.TestFullNode) *Garbag
latest: 0,
maddr4Data: address.Undef,
}
- g.createMiner(ctx)
+ g.createMiner4Data(ctx)
g.newPeerID(ctx)
return g
}
@@ -320,6 +347,12 @@ func (g *Garbager) Drop(ctx context.Context) (cid.Cid, abi.ChainEpoch) {
return c, g.newPeerID(ctx)
}
+// message returns the cid referencing a message and the chain epoch it went on chain
+func (g *Garbager) Message(ctx context.Context) (cid.Cid, abi.ChainEpoch) {
+ mw := g.createMiner(ctx)
+ return mw.Message, mw.Height
+}
+
// exists checks whether the cid is reachable through the node
func (g *Garbager) Exists(ctx context.Context, c cid.Cid) bool {
// check chain get / blockstore get
@@ -374,8 +407,15 @@ func (g *Garbager) mInfoCid(ctx context.Context) cid.Cid {
return mSt.Info
}
-func (g *Garbager) createMiner(ctx context.Context) {
+func (g *Garbager) createMiner4Data(ctx context.Context) {
require.True(g.t, g.maddr4Data == address.Undef, "garbager miner actor already created")
+ mw := g.createMiner(ctx)
+ var retval power6.CreateMinerReturn
+ require.NoError(g.t, retval.UnmarshalCBOR(bytes.NewReader(mw.Receipt.Return)))
+ g.maddr4Data = retval.IDAddress
+}
+
+func (g *Garbager) createMiner(ctx context.Context) *lapi.MsgLookup {
owner, err := g.node.WalletDefaultAddress(ctx)
require.NoError(g.t, err)
worker := owner
@@ -401,8 +441,5 @@ func (g *Garbager) createMiner(ctx context.Context) {
mw, err := g.node.StateWaitMsg(ctx, signed.Cid(), build.MessageConfidence, lapi.LookbackNoLimit, true)
require.NoError(g.t, err)
require.True(g.t, mw.Receipt.ExitCode == 0, "garbager's internal create miner message failed")
-
- var retval power6.CreateMinerReturn
- require.NoError(g.t, retval.UnmarshalCBOR(bytes.NewReader(mw.Receipt.Return)))
- g.maddr4Data = retval.IDAddress
+ return mw
}
diff --git a/itests/verifreg_test.go b/itests/verifreg_test.go
index 9132cf28b..e942d6c71 100644
--- a/itests/verifreg_test.go
+++ b/itests/verifreg_test.go
@@ -14,7 +14,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- verifregst "github.com/filecoin-project/go-state-types/builtin/v8/verifreg"
+ verifregst "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/network"
lapi "github.com/filecoin-project/lotus/api"
@@ -123,10 +123,7 @@ func TestVerifiedClientTopUp(t *testing.T) {
//stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001
dcap, err := api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK)
require.NoError(t, err)
-
- if !dcap.Equals(datacap) {
- t.Fatal("")
- }
+ require.Equal(t, *dcap, datacap)
// try to assign datacap to the same client should fail for actor v4 and below
params, err = actors.SerializeParams(&verifregst.AddVerifiedClientParams{Address: verifiedClientAddr, Allowance: datacap})
@@ -229,7 +226,8 @@ func TestRemoveDataCap(t *testing.T) {
// make the 2 verifiers
makeVerifier := func(addr address.Address) error {
- params, aerr := actors.SerializeParams(&verifregst.AddVerifierParams{Address: addr, Allowance: big.NewInt(100000000000)})
+ allowance := big.NewInt(100000000000)
+ params, aerr := actors.SerializeParams(&verifregst.AddVerifierParams{Address: addr, Allowance: allowance})
require.NoError(t, aerr)
msg := &types.Message{
@@ -248,6 +246,10 @@ func TestRemoveDataCap(t *testing.T) {
require.NoError(t, err)
require.EqualValues(t, 0, res.Receipt.ExitCode)
+ verifierAllowance, err := api.StateVerifierStatus(ctx, addr, types.EmptyTSK)
+ require.NoError(t, err)
+ require.Equal(t, allowance, *verifierAllowance)
+
return nil
}
@@ -280,17 +282,14 @@ func TestRemoveDataCap(t *testing.T) {
//stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001
dcap, err := api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK)
require.NoError(t, err)
-
- if !dcap.Equals(datacap) {
- t.Fatal("unexpected datacap")
- }
+ require.Equal(t, *dcap, datacap)
// helper to create removedatacap message
makeRemoveDatacapMsg := func(removeDatacap big.Int, proposalID uint64) *types.Message {
removeProposal := verifregst.RemoveDataCapProposal{
VerifiedClient: verifiedClientID,
DataCapAmount: removeDatacap,
- RemovalProposalID: proposalID,
+ RemovalProposalID: verifregst.RmDcProposalID{ProposalID: proposalID},
}
buf := bytes.Buffer{}
@@ -354,10 +353,7 @@ func TestRemoveDataCap(t *testing.T) {
//stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001
dcap, err = api.StateVerifiedClientStatus(ctx, verifiedClientAddr, types.EmptyTSK)
require.NoError(t, err)
-
- if !dcap.Equals(big.Sub(datacap, removeDatacap)) {
- t.Fatal("unexpected datacap")
- }
+ require.Equal(t, *dcap, big.Sub(datacap, removeDatacap))
// now take away the second half!
diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go
index a3d157ef0..f77b5cd1b 100644
--- a/itests/wdpost_test.go
+++ b/itests/wdpost_test.go
@@ -52,6 +52,10 @@ func TestWindowedPost(t *testing.T) {
}
func testWindowPostUpgrade(t *testing.T, blocktime time.Duration, nSectors int, upgradeHeight abi.ChainEpoch) {
+
+ /// XXX TEMPORARILY DISABLED UNTIL NV18 MIGRATION IS IMPLEMENTED
+ t.Skip("temporarily disabled as nv18 migration is not yet implemented")
+
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
diff --git a/itests/wdpost_worker_config_test.go b/itests/wdpost_worker_config_test.go
index a84896eae..d1672c20f 100644
--- a/itests/wdpost_worker_config_test.go
+++ b/itests/wdpost_worker_config_test.go
@@ -17,7 +17,6 @@ import (
"github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/node/impl"
"github.com/filecoin-project/lotus/node/modules"
- "github.com/filecoin-project/lotus/storage/sealer"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
"github.com/filecoin-project/lotus/storage/wdpost"
@@ -35,10 +34,10 @@ func TestWindowPostNoBuiltinWindow(t *testing.T) {
kit.PresealSectors(sectors), // 2 sectors per partition, 2 partitions in all 48 deadlines
kit.LatestActorsAt(-1),
kit.ConstructorOpts(
- node.Override(new(sealer.Config), func() sealer.Config {
- c := config.DefaultStorageMiner().StorageManager()
- c.DisableBuiltinWindowPoSt = true
- return c
+ node.Override(new(config.ProvingConfig), func() config.ProvingConfig {
+ c := config.DefaultStorageMiner()
+ c.Proving.DisableBuiltinWindowPoSt = true
+ return c.Proving
}),
node.Override(new(*wdpost.WindowPoStScheduler), modules.WindowPostScheduler(
config.DefaultStorageMiner().Fees,
@@ -92,10 +91,10 @@ func TestWindowPostNoBuiltinWindowWithWorker(t *testing.T) {
kit.PresealSectors(sectors), // 2 sectors per partition, 2 partitions in all 48 deadlines
kit.LatestActorsAt(-1),
kit.ConstructorOpts(
- node.Override(new(sealer.Config), func() sealer.Config {
- c := config.DefaultStorageMiner().StorageManager()
- c.DisableBuiltinWindowPoSt = true
- return c
+ node.Override(new(config.ProvingConfig), func() config.ProvingConfig {
+ c := config.DefaultStorageMiner()
+ c.Proving.DisableBuiltinWindowPoSt = true
+ return c.Proving
}),
node.Override(new(*wdpost.WindowPoStScheduler), modules.WindowPostScheduler(
config.DefaultStorageMiner().Fees,
diff --git a/itests/worker_test.go b/itests/worker_test.go
index 5b26f481c..b002660f1 100644
--- a/itests/worker_test.go
+++ b/itests/worker_test.go
@@ -2,13 +2,11 @@ package itests
import (
"context"
- "encoding/json"
"strings"
"sync/atomic"
"testing"
"time"
- "github.com/google/uuid"
logging "github.com/ipfs/go-log/v2"
"github.com/stretchr/testify/require"
"golang.org/x/xerrors"
@@ -79,7 +77,7 @@ func TestWorkerPledgeLocalFin(t *testing.T) {
func TestWorkerDataCid(t *testing.T) {
ctx := context.Background()
_, miner, worker, _ := kit.EnsembleWorker(t, kit.WithAllSubsystems(), kit.ThroughRPC(), kit.WithNoLocalSealing(true),
- kit.WithTaskTypes([]sealtasks.TaskType{sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTDataCid, sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit2, sealtasks.TTUnseal})) // no mock proofs
+ kit.WithSealWorkerTasks) // no mock proofs
e, err := worker.Enabled(ctx)
require.NoError(t, err)
@@ -408,35 +406,15 @@ func TestWindowPostWorkerManualPoSt(t *testing.T) {
func TestSchedulerRemoveRequest(t *testing.T) {
ctx := context.Background()
- _, miner, worker, ens := kit.EnsembleWorker(t, kit.WithAllSubsystems(), kit.ThroughRPC(), kit.WithNoLocalSealing(true),
- kit.WithTaskTypes([]sealtasks.TaskType{sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTDataCid, sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit2, sealtasks.TTUnseal})) // no mock proofs
+ _, miner, worker, _ := kit.EnsembleWorker(t, kit.WithAllSubsystems(), kit.ThroughRPC(), kit.WithNoLocalSealing(true),
+ kit.WithTaskTypes([]sealtasks.TaskType{sealtasks.TTAddPiece, sealtasks.TTPreCommit1})) // no mock proofs
- ens.InterconnectAll().BeginMining(50 * time.Millisecond)
+ //ens.InterconnectAll().BeginMining(50 * time.Millisecond)
e, err := worker.Enabled(ctx)
require.NoError(t, err)
require.True(t, e)
- type info struct {
- CallToWork struct {
- } `json:"CallToWork"`
- EarlyRet interface{} `json:"EarlyRet"`
- ReturnedWork interface{} `json:"ReturnedWork"`
- SchedInfo struct {
- OpenWindows []string `json:"OpenWindows"`
- Requests []struct {
- Priority int `json:"Priority"`
- SchedID string `json:"SchedId"`
- Sector struct {
- Miner int `json:"Miner"`
- Number int `json:"Number"`
- } `json:"Sector"`
- TaskType string `json:"TaskType"`
- } `json:"Requests"`
- } `json:"SchedInfo"`
- Waiting interface{} `json:"Waiting"`
- }
-
tocheck := miner.StartPledge(ctx, 1, 0, nil)
var sn abi.SectorNumber
for n := range tocheck {
@@ -453,39 +431,18 @@ func TestSchedulerRemoveRequest(t *testing.T) {
}
// Dump current scheduler info
- schedb, err := miner.SealingSchedDiag(ctx, false)
- require.NoError(t, err)
-
- j, err := json.MarshalIndent(&schedb, "", " ")
- require.NoError(t, err)
-
- var b info
- err = json.Unmarshal(j, &b)
- require.NoError(t, err)
-
- var schedidb uuid.UUID
+ b := miner.SchedInfo(ctx)
// cast scheduler info and get the request UUID. Call the SealingRemoveRequest()
require.Len(t, b.SchedInfo.Requests, 1)
require.Equal(t, "seal/v0/precommit/2", b.SchedInfo.Requests[0].TaskType)
- schedidb, err = uuid.Parse(b.SchedInfo.Requests[0].SchedID)
- require.NoError(t, err)
-
- err = miner.SealingRemoveRequest(ctx, schedidb)
+ err = miner.SealingRemoveRequest(ctx, b.SchedInfo.Requests[0].SchedId)
require.NoError(t, err)
// Dump the schduler again and compare the UUID if a request is present
// If no request present then pass the test
- scheda, err := miner.SealingSchedDiag(ctx, false)
- require.NoError(t, err)
-
- k, err := json.MarshalIndent(&scheda, "", " ")
- require.NoError(t, err)
-
- var a info
- err = json.Unmarshal(k, &a)
- require.NoError(t, err)
+ a := miner.SchedInfo(ctx)
require.Len(t, a.SchedInfo.Requests, 0)
}
diff --git a/itests/worker_upgrade_test.go b/itests/worker_upgrade_test.go
new file mode 100644
index 000000000..b253a26a5
--- /dev/null
+++ b/itests/worker_upgrade_test.go
@@ -0,0 +1,170 @@
+package itests
+
+import (
+ "context"
+ "fmt"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/itests/kit"
+ "github.com/filecoin-project/lotus/node/config"
+ sealing "github.com/filecoin-project/lotus/storage/pipeline"
+ "github.com/filecoin-project/lotus/storage/sealer/sealtasks"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
+)
+
+func TestWorkerUpgradeAbortCleanup(t *testing.T) {
+ ctx := context.Background()
+ blockTime := 1 * time.Millisecond
+ kit.QuietMiningLogs()
+
+ client, miner, ens := kit.EnsembleMinimal(t, kit.WithAllSubsystems(), kit.ThroughRPC(), kit.WithNoLocalSealing(true),
+ kit.NoStorage(), // no storage to have better control over path settings
+ kit.MutateSealingConfig(func(sc *config.SealingConfig) { sc.FinalizeEarly = true })) // no mock proofs
+
+ var worker kit.TestWorker
+ ens.Worker(miner, &worker, kit.ThroughRPC(), kit.NoStorage(), // no storage to have better control over path settings
+ kit.WithTaskTypes([]sealtasks.TaskType{
+ sealtasks.TTFetch, sealtasks.TTAddPiece,
+ sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit2,
+ sealtasks.TTReplicaUpdate, // only first update step, later steps will not run and we'll abort
+ }),
+ )
+
+ ens.Start().InterconnectAll().BeginMiningMustPost(blockTime)
+
+ maddr, err := miner.ActorAddress(ctx)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // get storage paths
+
+ // store-only path on the miner
+ miner.AddStorage(ctx, t, func(cfg *storiface.LocalStorageMeta) {
+ cfg.CanSeal = false
+ cfg.CanStore = true
+ })
+
+ mlocal, err := miner.StorageLocal(ctx)
+ require.NoError(t, err)
+ require.Len(t, mlocal, 2) // genesis and one local
+
+ // we want a seal-only path on the worker disconnected from miner path
+ worker.AddStorage(ctx, t, func(cfg *storiface.LocalStorageMeta) {
+ cfg.CanSeal = true
+ cfg.CanStore = false
+ })
+
+ wpaths, err := worker.Paths(ctx)
+ require.NoError(t, err)
+ require.Len(t, wpaths, 1)
+
+ // check sectors in paths
+ checkSectors := func(miners, workers storiface.SectorFileType) {
+ paths, err := miner.StorageList(ctx)
+ require.NoError(t, err)
+ require.Len(t, paths, 3) // genesis, miner, worker
+
+ // first loop for debugging
+ for id, decls := range paths {
+ pinfo, err := miner.StorageInfo(ctx, id)
+ require.NoError(t, err)
+
+ switch {
+ case id == wpaths[0].ID: // worker path
+ fmt.Println("Worker Decls ", len(decls), decls)
+ case !pinfo.CanStore && !pinfo.CanSeal: // genesis path
+ fmt.Println("Genesis Decls ", len(decls), decls)
+ default: // miner path
+ fmt.Println("Miner Decls ", len(decls), decls)
+ }
+ }
+
+ for id, decls := range paths {
+ pinfo, err := miner.StorageInfo(ctx, id)
+ require.NoError(t, err)
+
+ switch {
+ case id == wpaths[0].ID: // worker path
+ if workers != storiface.FTNone {
+ require.Len(t, decls, 1)
+ require.EqualValues(t, workers.Strings(), decls[0].SectorFileType.Strings())
+ } else {
+ require.Len(t, decls, 0)
+ }
+ case !pinfo.CanStore && !pinfo.CanSeal: // genesis path
+ require.Len(t, decls, kit.DefaultPresealsPerBootstrapMiner)
+ default: // miner path
+ if miners != storiface.FTNone {
+ require.Len(t, decls, 1)
+ require.EqualValues(t, miners.Strings(), decls[0].SectorFileType.Strings())
+ } else {
+ require.Len(t, decls, 0)
+ }
+ }
+ }
+ }
+ checkSectors(storiface.FTNone, storiface.FTNone)
+
+ // get a sector for upgrading
+ miner.PledgeSectors(ctx, 1, 0, nil)
+ sl, err := miner.SectorsListNonGenesis(ctx)
+ require.NoError(t, err)
+ require.Len(t, sl, 1, "expected 1 sector")
+
+ snum := sl[0]
+
+ checkSectors(storiface.FTCache|storiface.FTSealed, storiface.FTNone)
+
+ client.WaitForSectorActive(ctx, t, snum, maddr)
+
+ // make available
+ err = miner.SectorMarkForUpgrade(ctx, snum, true)
+ require.NoError(t, err)
+
+ // Start a deal
+
+ dh := kit.NewDealHarness(t, client, miner, miner)
+ res, _ := client.CreateImportFile(ctx, 123, 0)
+ dp := dh.DefaultStartDealParams()
+ dp.Data.Root = res.Root
+ deal := dh.StartDeal(ctx, dp)
+
+ // wait for the deal to be in a sector
+ dh.WaitDealSealed(ctx, deal, true, false, nil)
+
+ // wait for replica update to happen
+ require.Eventually(t, func() bool {
+ sstate, err := miner.SectorsStatus(ctx, snum, false)
+ require.NoError(t, err)
+ return sstate.State == api.SectorState(sealing.ProveReplicaUpdate)
+ }, 10*time.Second, 50*time.Millisecond)
+
+ // check that the sector was copied to the worker
+ checkSectors(storiface.FTCache|storiface.FTSealed, storiface.FTCache|storiface.FTSealed|storiface.FTUnsealed|storiface.FTUpdate|storiface.FTUpdateCache)
+
+ // abort upgrade
+ err = miner.SectorAbortUpgrade(ctx, snum)
+ require.NoError(t, err)
+
+ // the task is stuck in scheduler, so manually abort the task to get the sector fsm moving
+ si := miner.SchedInfo(ctx)
+ err = miner.SealingRemoveRequest(ctx, si.SchedInfo.Requests[0].SchedId)
+ require.NoError(t, err)
+
+ var lastState api.SectorState
+ require.Eventually(t, func() bool {
+ sstate, err := miner.SectorsStatus(ctx, snum, false)
+ require.NoError(t, err)
+ lastState = sstate.State
+
+ return sstate.State == api.SectorState(sealing.Proving)
+ }, 10*time.Second, 50*time.Millisecond, "last state was %s", &lastState)
+
+ // check that nothing was left on the worker
+ checkSectors(storiface.FTCache|storiface.FTSealed, storiface.FTNone)
+}
diff --git a/lib/backupds/backupds_test.go b/lib/backupds/backupds_test.go
index 48b2a8d25..b76799bfb 100644
--- a/lib/backupds/backupds_test.go
+++ b/lib/backupds/backupds_test.go
@@ -6,6 +6,7 @@ import (
"context"
"fmt"
"io/ioutil"
+ "os"
"path/filepath"
"strings"
"testing"
@@ -72,7 +73,7 @@ func TestLogRestore(t *testing.T) {
require.NoError(t, bds.Close())
- fls, err := ioutil.ReadDir(logdir)
+ fls, err := os.ReadDir(logdir)
require.NoError(t, err)
require.Equal(t, 1, len(fls))
diff --git a/lib/backupds/log.go b/lib/backupds/log.go
index eb1174b46..13ff7227f 100644
--- a/lib/backupds/log.go
+++ b/lib/backupds/log.go
@@ -4,7 +4,6 @@ import (
"context"
"fmt"
"io"
- "io/ioutil"
"os"
"path/filepath"
"strconv"
@@ -23,7 +22,7 @@ func (d *Datastore) startLog(logdir string) error {
return xerrors.Errorf("mkdir logdir ('%s'): %w", logdir, err)
}
- files, err := ioutil.ReadDir(logdir)
+ files, err := os.ReadDir(logdir)
if err != nil {
return xerrors.Errorf("read logdir ('%s'): %w", logdir, err)
}
diff --git a/lib/consensus/raft/config.go b/lib/consensus/raft/config.go
new file mode 100644
index 000000000..81bdb7fdc
--- /dev/null
+++ b/lib/consensus/raft/config.go
@@ -0,0 +1,135 @@
+package consensus
+
+import (
+ "io/ioutil"
+ "path/filepath"
+ "time"
+
+ hraft "github.com/hashicorp/raft"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/lotus/node/config"
+ "github.com/filecoin-project/lotus/node/repo"
+)
+
+// Configuration defaults
+var (
+ DefaultDataSubFolder = "raft-cluster"
+ DefaultWaitForLeaderTimeout = 15 * time.Second
+ DefaultCommitRetries = 1
+ DefaultNetworkTimeout = 100 * time.Second
+ DefaultCommitRetryDelay = 200 * time.Millisecond
+ DefaultBackupsRotate = 6
+)
+
+// ClusterRaftConfig allows to configure the Raft Consensus component for the node cluster.
+type ClusterRaftConfig struct {
+ // config to enabled node cluster with raft consensus
+ ClusterModeEnabled bool
+ // A folder to store Raft's data.
+ DataFolder string
+ // InitPeerset provides the list of initial cluster peers for new Raft
+ // peers (with no prior state). It is ignored when Raft was already
+ // initialized or when starting in staging mode.
+ InitPeerset []string
+ // LeaderTimeout specifies how long to wait for a leader before
+ // failing an operation.
+ WaitForLeaderTimeout time.Duration
+ // NetworkTimeout specifies how long before a Raft network
+ // operation is timed out
+ NetworkTimeout time.Duration
+ // CommitRetries specifies how many times we retry a failed commit until
+ // we give up.
+ CommitRetries int
+ // How long to wait between retries
+ CommitRetryDelay time.Duration
+ // BackupsRotate specifies the maximum number of Raft's DataFolder
+ // copies that we keep as backups (renaming) after cleanup.
+ BackupsRotate int
+ // A Hashicorp Raft's configuration object.
+ RaftConfig *hraft.Config
+
+ // Tracing enables propagation of contexts across binary boundaries.
+ Tracing bool
+}
+
+func DefaultClusterRaftConfig() *ClusterRaftConfig {
+ var cfg ClusterRaftConfig
+ cfg.DataFolder = "" // empty so it gets omitted
+ cfg.InitPeerset = []string{}
+ cfg.WaitForLeaderTimeout = DefaultWaitForLeaderTimeout
+ cfg.NetworkTimeout = DefaultNetworkTimeout
+ cfg.CommitRetries = DefaultCommitRetries
+ cfg.CommitRetryDelay = DefaultCommitRetryDelay
+ cfg.BackupsRotate = DefaultBackupsRotate
+ cfg.RaftConfig = hraft.DefaultConfig()
+
+ // These options are imposed over any Default Raft Config.
+ cfg.RaftConfig.ShutdownOnRemove = false
+ cfg.RaftConfig.LocalID = "will_be_set_automatically"
+
+ // Set up logging
+ cfg.RaftConfig.LogOutput = ioutil.Discard
+ return &cfg
+}
+
+func NewClusterRaftConfig(userRaftConfig *config.UserRaftConfig) *ClusterRaftConfig {
+ var cfg ClusterRaftConfig
+ cfg.DataFolder = userRaftConfig.DataFolder
+ cfg.InitPeerset = userRaftConfig.InitPeersetMultiAddr
+ cfg.WaitForLeaderTimeout = time.Duration(userRaftConfig.WaitForLeaderTimeout)
+ cfg.NetworkTimeout = time.Duration(userRaftConfig.NetworkTimeout)
+ cfg.CommitRetries = userRaftConfig.CommitRetries
+ cfg.CommitRetryDelay = time.Duration(userRaftConfig.CommitRetryDelay)
+ cfg.BackupsRotate = userRaftConfig.BackupsRotate
+
+ // Keep this to be default hraft config for now
+ cfg.RaftConfig = hraft.DefaultConfig()
+
+ // These options are imposed over any Default Raft Config.
+ cfg.RaftConfig.ShutdownOnRemove = false
+ cfg.RaftConfig.LocalID = "will_be_set_automatically"
+
+ // Set up logging
+ cfg.RaftConfig.LogOutput = ioutil.Discard
+
+ return &cfg
+
+}
+
+// Validate checks that this configuration has working values,
+// at least in appearance.
+func ValidateConfig(cfg *ClusterRaftConfig) error {
+ if cfg.RaftConfig == nil {
+ return xerrors.Errorf("no hashicorp/raft.Config")
+ }
+ if cfg.WaitForLeaderTimeout <= 0 {
+ return xerrors.Errorf("wait_for_leader_timeout <= 0")
+ }
+
+ if cfg.NetworkTimeout <= 0 {
+ return xerrors.Errorf("network_timeout <= 0")
+ }
+
+ if cfg.CommitRetries < 0 {
+ return xerrors.Errorf("commit_retries is invalid")
+ }
+
+ if cfg.CommitRetryDelay <= 0 {
+ return xerrors.Errorf("commit_retry_delay is invalid")
+ }
+
+ if cfg.BackupsRotate <= 0 {
+ return xerrors.Errorf("backups_rotate should be larger than 0")
+ }
+
+ return hraft.ValidateConfig(cfg.RaftConfig)
+}
+
+// GetDataFolder returns the Raft data folder that we are using.
+func (cfg *ClusterRaftConfig) GetDataFolder(repo repo.LockedRepo) string {
+ if cfg.DataFolder == "" {
+ return filepath.Join(repo.Path(), DefaultDataSubFolder)
+ }
+ return filepath.Join(repo.Path(), cfg.DataFolder)
+}
diff --git a/lib/consensus/raft/consensus.go b/lib/consensus/raft/consensus.go
new file mode 100644
index 000000000..60d9dc305
--- /dev/null
+++ b/lib/consensus/raft/consensus.go
@@ -0,0 +1,512 @@
+// Package raft implements a Consensus component for IPFS Cluster which uses
+// Raft (go-libp2p-raft).
+package consensus
+
+import (
+ "bytes"
+ "context"
+ "errors"
+ "fmt"
+ "sort"
+ "time"
+
+ "github.com/google/uuid"
+ "golang.org/x/exp/slices"
+
+ addr "github.com/filecoin-project/go-address"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/messagepool"
+ "github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/lib/addrutil"
+ "github.com/filecoin-project/lotus/node/repo"
+
+ //ds "github.com/ipfs/go-datastore"
+ logging "github.com/ipfs/go-log/v2"
+ consensus "github.com/libp2p/go-libp2p-consensus"
+ rpc "github.com/libp2p/go-libp2p-gorpc"
+ libp2praft "github.com/libp2p/go-libp2p-raft"
+ host "github.com/libp2p/go-libp2p/core/host"
+ peer "github.com/libp2p/go-libp2p/core/peer"
+)
+
+var logger = logging.Logger("raft")
+
+type RaftState struct {
+ NonceMap api.NonceMapType
+ MsgUuids api.MsgUuidMapType
+
+ // TODO: add comment explaining why this is needed
+ // We need a reference to the messagepool in the raft state in order to
+ // sync messages that have been sent by the leader node
+ // Miner calls StateWaitMsg after MpoolPushMessage to check if the message has
+ // landed on chain. This check requires the message be stored in the local chainstore
+ // If a leadernode goes down after sending a message to the chain and is replaced by
+ // another node, the other node needs to have this message in its chainstore for the
+ // above check to succeed.
+
+ // This is because the miner only stores signed CIDs but the message received from in a
+ // block will be unsigned (for BLS). Hence, the process relies on the node to store the
+ // signed message which holds a copy of the unsigned message to properly perform all the
+ // needed checks
+ Mpool *messagepool.MessagePool
+}
+
+func newRaftState(mpool *messagepool.MessagePool) *RaftState {
+ return &RaftState{
+ NonceMap: make(map[addr.Address]uint64),
+ MsgUuids: make(map[uuid.UUID]*types.SignedMessage),
+ Mpool: mpool,
+ }
+}
+
+type ConsensusOp struct {
+ Nonce uint64 `codec:"nonce,omitempty"`
+ Uuid uuid.UUID `codec:"uuid,omitempty"`
+ Addr addr.Address `codec:"addr,omitempty"`
+ SignedMsg *types.SignedMessage `codec:"signedMsg,omitempty"`
+}
+
+func (c ConsensusOp) ApplyTo(state consensus.State) (consensus.State, error) {
+ s := state.(*RaftState)
+ s.NonceMap[c.Addr] = c.Nonce
+ if c.SignedMsg != nil {
+
+ // Deep copy to tmp
+ var buffer bytes.Buffer
+ err := c.SignedMsg.MarshalCBOR(&buffer)
+ if err != nil {
+ return nil, err
+ }
+ tmp, err := types.DecodeSignedMessage(buffer.Bytes())
+ if err != nil {
+ return nil, err
+ }
+ s.MsgUuids[c.Uuid] = tmp
+
+ _, err = s.Mpool.Push(context.TODO(), tmp, false)
+ // Since this is only meant to keep messages in sync, ignore any error which
+ // shows the message already exists in the mpool
+ if err != nil && !api.ErrorIsIn(err, []error{messagepool.ErrExistingNonce}) {
+ return nil, err
+ }
+ }
+
+ return s, nil
+}
+
+var _ consensus.Op = &ConsensusOp{}
+
+// Consensus handles the work of keeping a shared-state between
+// the peers of a Lotus Cluster, as well as modifying that state and
+// applying any updates in a thread-safe manner.
+type Consensus struct {
+ ctx context.Context
+ cancel func()
+ config *ClusterRaftConfig
+
+ host host.Host
+
+ consensus consensus.OpLogConsensus
+ actor consensus.Actor
+ raft *raftWrapper
+ state *RaftState
+
+ RpcClient *rpc.Client
+ rpcReady chan struct{}
+ readyCh chan struct{}
+
+ peerSet []peer.ID
+ repo repo.LockedRepo
+}
+
+// NewConsensus builds a new ClusterConsensus component using Raft.
+//
+// Raft saves state snapshots regularly and persists log data in a bolt
+// datastore. Therefore, unless memory usage is a concern, it is recommended
+// to use an in-memory go-datastore as store parameter.
+//
+// The staging parameter controls if the Raft peer should start in
+// staging mode (used when joining a new Raft peerset with other peers).
+func NewConsensus(host host.Host, cfg *ClusterRaftConfig, mpool *messagepool.MessagePool, repo repo.LockedRepo, staging bool) (*Consensus, error) {
+ err := ValidateConfig(cfg)
+ if err != nil {
+ return nil, err
+ }
+
+ ctx, cancel := context.WithCancel(context.Background())
+
+ logger.Debug("starting Consensus and waiting for a leader...")
+ state := newRaftState(mpool)
+
+ consensus := libp2praft.NewOpLog(state, &ConsensusOp{})
+
+ raft, err := newRaftWrapper(host, cfg, consensus.FSM(), repo, staging)
+ if err != nil {
+ logger.Error("error creating raft: ", err)
+ cancel()
+ return nil, err
+ }
+ actor := libp2praft.NewActor(raft.raft)
+ consensus.SetActor(actor)
+
+ peers := []peer.ID{}
+ addrInfos, err := addrutil.ParseAddresses(ctx, cfg.InitPeerset)
+ if err != nil {
+ logger.Error("error parsing addresses: ", err)
+ cancel()
+ return nil, err
+ }
+
+ for _, addrInfo := range addrInfos {
+ peers = append(peers, addrInfo.ID)
+
+ // Add peer to address book
+ host.Peerstore().AddAddrs(addrInfo.ID, addrInfo.Addrs, time.Hour*100)
+ }
+
+ cc := &Consensus{
+ ctx: ctx,
+ cancel: cancel,
+ config: cfg,
+ host: host,
+ consensus: consensus,
+ actor: actor,
+ state: state,
+ raft: raft,
+ peerSet: peers,
+ rpcReady: make(chan struct{}, 1),
+ readyCh: make(chan struct{}, 1),
+ repo: repo,
+ }
+
+ go cc.finishBootstrap()
+ return cc, nil
+
+}
+
+// TODO: Merge with NewConsensus and remove the rpcReady chan
+func NewConsensusWithRPCClient(staging bool) func(host host.Host,
+ cfg *ClusterRaftConfig,
+ rpcClient *rpc.Client,
+ mpool *messagepool.MessagePool,
+ repo repo.LockedRepo,
+) (*Consensus, error) {
+
+ return func(host host.Host, cfg *ClusterRaftConfig, rpcClient *rpc.Client, mpool *messagepool.MessagePool, repo repo.LockedRepo) (*Consensus, error) {
+ cc, err := NewConsensus(host, cfg, mpool, repo, staging)
+ if err != nil {
+ return nil, err
+ }
+ cc.RpcClient = rpcClient
+ cc.rpcReady <- struct{}{}
+ return cc, nil
+ }
+}
+
+// WaitForSync waits for a leader and for the state to be up to date, then returns.
+func (cc *Consensus) WaitForSync(ctx context.Context) error {
+
+ leaderCtx, cancel := context.WithTimeout(ctx, cc.config.WaitForLeaderTimeout)
+ defer cancel()
+
+ // 1 - wait for leader
+ // 2 - wait until we are a Voter
+ // 3 - wait until last index is applied
+
+ // From raft docs:
+
+ // once a staging server receives enough log entries to be sufficiently
+ // caught up to the leader's log, the leader will invoke a membership
+ // change to change the Staging server to a Voter
+
+ // Thus, waiting to be a Voter is a guarantee that we have a reasonable
+ // up to date state. Otherwise, we might return too early (see
+ // https://github.com/ipfs-cluster/ipfs-cluster/issues/378)
+
+ _, err := cc.raft.WaitForLeader(leaderCtx)
+ if err != nil {
+ return errors.New("error waiting for leader: " + err.Error())
+ }
+
+ err = cc.raft.WaitForVoter(ctx)
+ if err != nil {
+ return errors.New("error waiting to become a Voter: " + err.Error())
+ }
+
+ err = cc.raft.WaitForUpdates(ctx)
+ if err != nil {
+ return errors.New("error waiting for consensus updates: " + err.Error())
+ }
+ return nil
+}
+
+// waits until there is a consensus leader and syncs the state
+// to the tracker. If errors happen, this will return and never
+// signal the component as Ready.
+func (cc *Consensus) finishBootstrap() {
+ // wait until we have RPC to perform any actions.
+ select {
+ case <-cc.ctx.Done():
+ return
+ case <-cc.rpcReady:
+ }
+
+ // Sometimes bootstrap is a no-Op. It only applies when
+ // no state exists and staging=false.
+ _, err := cc.raft.Bootstrap()
+ if err != nil {
+ return
+ }
+
+ logger.Debugf("Bootstrap finished")
+ err = cc.WaitForSync(cc.ctx)
+ if err != nil {
+ return
+ }
+ logger.Debug("Raft state is now up to date")
+ logger.Debug("consensus ready")
+ cc.readyCh <- struct{}{}
+}
+
+// Shutdown stops the component so it will not process any
+// more updates. The underlying consensus is permanently
+// shutdown, along with the libp2p transport.
+func (cc *Consensus) Shutdown(ctx context.Context) error {
+
+ logger.Info("stopping Consensus component")
+
+ // Raft Shutdown
+ err := cc.raft.Shutdown(ctx)
+ if err != nil {
+ logger.Error(err)
+ }
+
+ cc.cancel()
+ close(cc.rpcReady)
+ return nil
+}
+
+// Ready returns a channel which is signaled when the Consensus
+// algorithm has finished bootstrapping and is ready to use
+func (cc *Consensus) Ready(ctx context.Context) <-chan struct{} {
+ return cc.readyCh
+}
+
+// IsTrustedPeer returns true. In Raft we trust all peers.
+func (cc *Consensus) IsTrustedPeer(ctx context.Context, p peer.ID) bool {
+ return slices.Contains(cc.peerSet, p)
+}
+
+// Trust is a no-Op.
+func (cc *Consensus) Trust(ctx context.Context, pid peer.ID) error { return nil }
+
+// Distrust is a no-Op.
+func (cc *Consensus) Distrust(ctx context.Context, pid peer.ID) error { return nil }
+
+// returns true if the operation was redirected to the leader
+// note that if the leader just dissappeared, the rpc call will
+// fail because we haven't heard that it's gone.
+func (cc *Consensus) RedirectToLeader(method string, arg interface{}, ret interface{}) (bool, error) {
+ ctx := cc.ctx
+
+ var finalErr error
+
+ // Retry redirects
+ for i := 0; i <= cc.config.CommitRetries; i++ {
+ logger.Debugf("redirect try %d", i)
+ leader, err := cc.Leader(ctx)
+
+ // No leader, wait for one
+ if err != nil {
+ logger.Warn("there seems to be no leader. Waiting for one")
+ rctx, cancel := context.WithTimeout(ctx, cc.config.WaitForLeaderTimeout)
+ defer cancel()
+ pidstr, err := cc.raft.WaitForLeader(rctx)
+
+ // means we timed out waiting for a leader
+ // we don't retry in this case
+ if err != nil {
+ return false, fmt.Errorf("timed out waiting for leader: %s", err)
+ }
+ leader, err = peer.Decode(pidstr)
+ if err != nil {
+ return false, err
+ }
+ }
+
+ logger.Infof("leader: %s, curr host: %s, peerSet: %s", leader, cc.host.ID(), cc.peerSet)
+
+ // We are the leader. Do not redirect
+ if leader == cc.host.ID() {
+ return false, nil
+ }
+
+ logger.Debugf("redirecting %s to leader: %s", method, leader.Pretty())
+ finalErr = cc.RpcClient.CallContext(
+ ctx,
+ leader,
+ "Consensus",
+ method,
+ arg,
+ ret,
+ )
+ if finalErr != nil {
+ logger.Errorf("retrying to redirect request to leader: %s", finalErr)
+ time.Sleep(2 * cc.config.RaftConfig.HeartbeatTimeout)
+ continue
+ }
+ break
+ }
+
+ // We tried to redirect, but something happened
+ return true, finalErr
+}
+
+// commit submits a cc.consensus commit. It retries upon failures.
+func (cc *Consensus) Commit(ctx context.Context, op *ConsensusOp) error {
+
+ var finalErr error
+ for i := 0; i <= cc.config.CommitRetries; i++ {
+ logger.Debugf("attempt #%d: committing %+v", i, op)
+
+ // this means we are retrying
+ if finalErr != nil {
+ logger.Errorf("retrying upon failed commit (retry %d): %s ",
+ i, finalErr)
+ }
+
+ // Being here means we are the LEADER. We can commit.
+ // now commit the changes to our state
+ _, finalErr = cc.consensus.CommitOp(op)
+ if finalErr != nil {
+ goto RETRY
+ }
+
+ RETRY:
+ time.Sleep(cc.config.CommitRetryDelay)
+ }
+ return finalErr
+}
+
+// AddPeer adds a new peer to participate in this consensus. It will
+// forward the operation to the leader if this is not it.
+func (cc *Consensus) AddPeer(ctx context.Context, pid peer.ID) error {
+ var finalErr error
+ for i := 0; i <= cc.config.CommitRetries; i++ {
+ logger.Debugf("attempt #%d: AddPeer %s", i, pid.Pretty())
+ if finalErr != nil {
+ logger.Errorf("retrying to add peer. Attempt #%d failed: %s", i, finalErr)
+ }
+ ok, err := cc.RedirectToLeader("AddPeer", pid, struct{}{})
+ if err != nil || ok {
+ return err
+ }
+ // Being here means we are the leader and can commit
+ finalErr = cc.raft.AddPeer(ctx, pid)
+ if finalErr != nil {
+ time.Sleep(cc.config.CommitRetryDelay)
+ continue
+ }
+ logger.Infof("peer added to Raft: %s", pid.Pretty())
+ break
+ }
+ return finalErr
+}
+
+// RmPeer removes a peer from this consensus. It will
+// forward the operation to the leader if this is not it.
+func (cc *Consensus) RmPeer(ctx context.Context, pid peer.ID) error {
+ var finalErr error
+ for i := 0; i <= cc.config.CommitRetries; i++ {
+ logger.Debugf("attempt #%d: RmPeer %s", i, pid.Pretty())
+ if finalErr != nil {
+ logger.Errorf("retrying to remove peer. Attempt #%d failed: %s", i, finalErr)
+ }
+ ok, err := cc.RedirectToLeader("RmPeer", pid, struct{}{})
+ if err != nil || ok {
+ return err
+ }
+ // Being here means we are the leader and can commit
+ finalErr = cc.raft.RemovePeer(ctx, pid.String())
+ if finalErr != nil {
+ time.Sleep(cc.config.CommitRetryDelay)
+ continue
+ }
+ logger.Infof("peer removed from Raft: %s", pid.Pretty())
+ break
+ }
+ return finalErr
+}
+
+// RaftState retrieves the current consensus RaftState. It may error if no RaftState has
+// been agreed upon or the state is not consistent. The returned RaftState is the
+// last agreed-upon RaftState known by this node. No writes are allowed, as all
+// writes to the shared state should happen through the Consensus component
+// methods.
+func (cc *Consensus) State(ctx context.Context) (*RaftState, error) {
+ st, err := cc.consensus.GetLogHead()
+ if err == libp2praft.ErrNoState {
+ return newRaftState(nil), nil
+ }
+
+ if err != nil {
+ return nil, err
+ }
+ state, ok := st.(*RaftState)
+ if !ok {
+ return nil, errors.New("wrong state type")
+ }
+ return state, nil
+}
+
+// Leader returns the peerID of the Leader of the
+// cluster. It returns an error when there is no leader.
+func (cc *Consensus) Leader(ctx context.Context) (peer.ID, error) {
+ // Note the hard-dependency on raft here...
+ raftactor := cc.actor.(*libp2praft.Actor)
+ return raftactor.Leader()
+}
+
+// Clean removes the Raft persisted state.
+func (cc *Consensus) Clean(ctx context.Context) error {
+ //return CleanupRaft(cc.config)
+ return nil
+}
+
+//Rollback replaces the current agreed-upon
+//state with the state provided. Only the consensus leader
+//can perform this operation.
+//func (cc *Consensus) Rollback(state RaftState) error {
+// // This is unused. It *might* be used for upgrades.
+// // There is rather untested magic in libp2p-raft's FSM()
+// // to make this possible.
+// return cc.consensus.Rollback(state)
+//}
+
+// Peers return the current list of peers in the consensus.
+// The list will be sorted alphabetically.
+func (cc *Consensus) Peers(ctx context.Context) ([]peer.ID, error) {
+
+ peers := []peer.ID{}
+ raftPeers, err := cc.raft.Peers(ctx)
+ if err != nil {
+ return nil, fmt.Errorf("cannot retrieve list of peers: %s", err)
+ }
+
+ sort.Strings(raftPeers)
+
+ for _, p := range raftPeers {
+ id, err := peer.Decode(p)
+ if err != nil {
+ panic("could not decode peer")
+ }
+ peers = append(peers, id)
+ }
+ return peers, nil
+}
+
+func (cc *Consensus) IsLeader(ctx context.Context) bool {
+ leader, _ := cc.Leader(ctx)
+ return leader == cc.host.ID()
+}
diff --git a/lib/consensus/raft/interfaces.go b/lib/consensus/raft/interfaces.go
new file mode 100644
index 000000000..2b77d1ebe
--- /dev/null
+++ b/lib/consensus/raft/interfaces.go
@@ -0,0 +1,41 @@
+package consensus
+
+import (
+ "context"
+
+ consensus "github.com/libp2p/go-libp2p-consensus"
+ "github.com/libp2p/go-libp2p/core/peer"
+)
+
+type ConsensusAPI interface {
+ // Returns a channel to signal that the consensus layer is ready
+ // allowing the main component to wait for it during start.
+ Ready(context.Context) <-chan struct{}
+
+ AddPeer(context.Context, peer.ID) error
+ RmPeer(context.Context, peer.ID) error
+ State(context.Context) (consensus.State, error)
+ // Provide a node which is responsible to perform
+ // specific tasks which must only run in 1 cluster peer.
+ Leader(context.Context) (peer.ID, error)
+ // Only returns when the consensus state has all log
+ // updates applied to it.
+ WaitForSync(context.Context) error
+ // Clean removes all consensus data.
+ Clean(context.Context) error
+ // Peers returns the peerset participating in the Consensus.
+ Peers(context.Context) ([]peer.ID, error)
+ // IsTrustedPeer returns true if the given peer is "trusted".
+ // This will grant access to more rpc endpoints and a
+ // non-trusted one. This should be fast as it will be
+ // called repeatedly for every remote RPC request.
+ IsTrustedPeer(context.Context, peer.ID) bool
+ // Trust marks a peer as "trusted".
+ Trust(context.Context, peer.ID) error
+ // Distrust removes a peer from the "trusted" set.
+ Distrust(context.Context, peer.ID) error
+ // Returns true if current node is the cluster leader
+ IsLeader(ctx context.Context) bool
+
+ Shutdown(context.Context) error
+}
diff --git a/lib/consensus/raft/raft.go b/lib/consensus/raft/raft.go
new file mode 100644
index 000000000..9cfd41a4a
--- /dev/null
+++ b/lib/consensus/raft/raft.go
@@ -0,0 +1,592 @@
+package consensus
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "time"
+
+ hraft "github.com/hashicorp/raft"
+ raftboltdb "github.com/hashicorp/raft-boltdb"
+ "github.com/ipfs/go-log/v2"
+ p2praft "github.com/libp2p/go-libp2p-raft"
+ host "github.com/libp2p/go-libp2p/core/host"
+ peer "github.com/libp2p/go-libp2p/core/peer"
+ "go.uber.org/multierr"
+ "go.uber.org/zap"
+
+ "github.com/filecoin-project/lotus/lib/addrutil"
+ "github.com/filecoin-project/lotus/node/repo"
+)
+
+var raftLogger = log.Logger("raft-cluster")
+
+// ErrWaitingForSelf is returned when we are waiting for ourselves to depart
+// the peer set, which won't happen
+var errWaitingForSelf = errors.New("waiting for ourselves to depart")
+
+// RaftMaxSnapshots indicates how many snapshots to keep in the consensus data
+// folder.
+// TODO: Maybe include this in Config. Not sure how useful it is to touch
+// this anyways.
+var RaftMaxSnapshots = 5
+
+// RaftLogCacheSize is the maximum number of logs to cache in-memory.
+// This is used to reduce disk I/O for the recently committed entries.
+var RaftLogCacheSize = 512
+
+// How long we wait for updates during shutdown before snapshotting
+var waitForUpdatesShutdownTimeout = 5 * time.Second
+var waitForUpdatesInterval = 400 * time.Millisecond
+
+// How many times to retry snapshotting when shutting down
+var maxShutdownSnapshotRetries = 5
+
+// raftWrapper wraps the hraft.Raft object and related things like the
+// different stores used or the hraft.Configuration.
+// Its methods provide functionality for working with Raft.
+type raftWrapper struct {
+ ctx context.Context
+ cancel context.CancelFunc
+ raft *hraft.Raft
+ config *ClusterRaftConfig
+ host host.Host
+ serverConfig hraft.Configuration
+ transport *hraft.NetworkTransport
+ snapshotStore hraft.SnapshotStore
+ logStore hraft.LogStore
+ stableStore hraft.StableStore
+ boltdb *raftboltdb.BoltStore
+ repo repo.LockedRepo
+ staging bool
+}
+
+// newRaftWrapper creates a Raft instance and initializes
+// everything leaving it ready to use. Note, that Bootstrap() should be called
+// to make sure the raft instance is usable.
+func newRaftWrapper(
+ host host.Host,
+ cfg *ClusterRaftConfig,
+ fsm hraft.FSM,
+ repo repo.LockedRepo,
+ staging bool,
+) (*raftWrapper, error) {
+
+ raftW := &raftWrapper{}
+ raftW.config = cfg
+ raftW.host = host
+ raftW.staging = staging
+ raftW.repo = repo
+ // Set correct LocalID
+ cfg.RaftConfig.LocalID = hraft.ServerID(host.ID().String())
+
+ df := cfg.GetDataFolder(repo)
+ err := makeDataFolder(df)
+ if err != nil {
+ return nil, err
+ }
+
+ err = raftW.makeServerConfig()
+ if err != nil {
+ return nil, err
+ }
+
+ err = raftW.makeTransport()
+ if err != nil {
+ return nil, err
+ }
+
+ err = raftW.makeStores()
+ if err != nil {
+ return nil, err
+ }
+
+ raftLogger.Debug("creating Raft")
+ raftW.raft, err = hraft.NewRaft(
+ cfg.RaftConfig,
+ fsm,
+ raftW.logStore,
+ raftW.stableStore,
+ raftW.snapshotStore,
+ raftW.transport,
+ )
+ if err != nil {
+ raftLogger.Error("initializing raft: ", err)
+ return nil, err
+ }
+
+ raftW.ctx, raftW.cancel = context.WithCancel(context.Background())
+
+ return raftW, nil
+}
+
+// makeDataFolder creates the folder that is meant to store Raft data. Ensures
+// we always set 0700 mode.
+func makeDataFolder(folder string) error {
+ return os.MkdirAll(folder, 0700)
+}
+
+func (rw *raftWrapper) makeTransport() (err error) {
+ raftLogger.Debug("creating libp2p Raft transport")
+ rw.transport, err = p2praft.NewLibp2pTransport(
+ rw.host,
+ rw.config.NetworkTimeout,
+ )
+ return err
+}
+
+func (rw *raftWrapper) makeStores() error {
+ raftLogger.Debug("creating BoltDB store")
+ df := rw.config.GetDataFolder(rw.repo)
+ store, err := raftboltdb.NewBoltStore(filepath.Join(df, "raft.db"))
+ if err != nil {
+ return err
+ }
+
+ // wraps the store in a LogCache to improve performance.
+ // See consul/agent/consul/server.go
+ cacheStore, err := hraft.NewLogCache(RaftLogCacheSize, store)
+ if err != nil {
+ return err
+ }
+
+ raftLogger.Debug("creating raft snapshot store")
+ snapstore, err := hraft.NewFileSnapshotStoreWithLogger(
+ df,
+ RaftMaxSnapshots,
+ zap.NewStdLog(log.Logger("raft-snapshot").SugaredLogger.Desugar()),
+ )
+ if err != nil {
+ return err
+ }
+
+ rw.logStore = cacheStore
+ rw.stableStore = store
+ rw.snapshotStore = snapstore
+ rw.boltdb = store
+ return nil
+}
+
+// Bootstrap calls BootstrapCluster on the Raft instance with a valid
+// Configuration (generated from InitPeerset) when Raft has no state
+// and we are not setting up a staging peer. It returns if Raft
+// was boostrapped (true) and an error.
+func (rw *raftWrapper) Bootstrap() (bool, error) {
+ logger.Debug("checking for existing raft states")
+ hasState, err := hraft.HasExistingState(
+ rw.logStore,
+ rw.stableStore,
+ rw.snapshotStore,
+ )
+ if err != nil {
+ return false, err
+ }
+
+ if hasState {
+ logger.Debug("raft cluster is already initialized")
+
+ // Inform the user that we are working with a pre-existing peerset
+ logger.Info("existing Raft state found! raft.InitPeerset will be ignored")
+ cf := rw.raft.GetConfiguration()
+ if err := cf.Error(); err != nil {
+ logger.Debug(err)
+ return false, err
+ }
+ currentCfg := cf.Configuration()
+ srvs := ""
+ for _, s := range currentCfg.Servers {
+ srvs += fmt.Sprintf(" %s\n", s.ID)
+ }
+
+ logger.Debugf("Current Raft Peerset:\n%s\n", srvs)
+ return false, nil
+ }
+
+ if rw.staging {
+ logger.Debug("staging servers do not need initialization")
+ logger.Info("peer is ready to join a cluster")
+ return false, nil
+ }
+
+ voters := ""
+ for _, s := range rw.serverConfig.Servers {
+ voters += fmt.Sprintf(" %s\n", s.ID)
+ }
+
+ logger.Infof("initializing raft cluster with the following voters:\n%s\n", voters)
+
+ future := rw.raft.BootstrapCluster(rw.serverConfig)
+ if err := future.Error(); err != nil {
+ logger.Error("bootstrapping cluster: ", err)
+ return true, err
+ }
+ return true, nil
+}
+
+// create Raft servers configuration. The result is used
+// by Bootstrap() when it proceeds to Bootstrap.
+func (rw *raftWrapper) makeServerConfig() error {
+ peers := []peer.ID{}
+ addrInfos, err := addrutil.ParseAddresses(context.Background(), rw.config.InitPeerset)
+ if err != nil {
+ return err
+ }
+ for _, addrInfo := range addrInfos {
+ peers = append(peers, addrInfo.ID)
+ }
+ rw.serverConfig = makeServerConf(append(peers, rw.host.ID()))
+ return nil
+}
+
+// creates a server configuration with all peers as Voters.
+func makeServerConf(peers []peer.ID) hraft.Configuration {
+ sm := make(map[string]struct{})
+
+ servers := make([]hraft.Server, 0)
+
+ // Servers are peers + self. We avoid duplicate entries below
+ for _, pid := range peers {
+ p := pid.String()
+ _, ok := sm[p]
+ if !ok { // avoid dups
+ sm[p] = struct{}{}
+ servers = append(servers, hraft.Server{
+ Suffrage: hraft.Voter,
+ ID: hraft.ServerID(p),
+ Address: hraft.ServerAddress(p),
+ })
+ }
+ }
+ return hraft.Configuration{Servers: servers}
+}
+
+// WaitForLeader holds until Raft says we have a leader.
+// Returns if ctx is canceled.
+func (rw *raftWrapper) WaitForLeader(ctx context.Context) (string, error) {
+ ticker := time.NewTicker(time.Second / 2)
+ for {
+ select {
+ case <-ticker.C:
+ if l := rw.raft.Leader(); l != "" {
+ logger.Debug("waitForleaderTimer")
+ logger.Infof("Current Raft Leader: %s", l)
+ ticker.Stop()
+ return string(l), nil
+ }
+ case <-ctx.Done():
+ return "", ctx.Err()
+ }
+ }
+}
+
+func (rw *raftWrapper) WaitForVoter(ctx context.Context) error {
+ logger.Debug("waiting until we are promoted to a voter")
+
+ pid := hraft.ServerID(rw.host.ID().String())
+ for {
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ default:
+ logger.Debugf("%s: get configuration", pid)
+ configFuture := rw.raft.GetConfiguration()
+ if err := configFuture.Error(); err != nil {
+ return err
+ }
+
+ if isVoter(pid, configFuture.Configuration()) {
+ return nil
+ }
+ logger.Debugf("%s: not voter yet", pid)
+
+ time.Sleep(waitForUpdatesInterval)
+ }
+ }
+}
+
+func isVoter(srvID hraft.ServerID, cfg hraft.Configuration) bool {
+ for _, server := range cfg.Servers {
+ if server.ID == srvID && server.Suffrage == hraft.Voter {
+ return true
+ }
+ }
+ return false
+}
+
+// WaitForUpdates holds until Raft has synced to the last index in the log
+func (rw *raftWrapper) WaitForUpdates(ctx context.Context) error {
+
+ logger.Debug("Raft state is catching up to the latest known version. Please wait...")
+ for {
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ default:
+ lai := rw.raft.AppliedIndex()
+ li := rw.raft.LastIndex()
+ logger.Debugf("current Raft index: %d/%d",
+ lai, li)
+ if lai == li {
+ return nil
+ }
+ time.Sleep(waitForUpdatesInterval)
+ }
+ }
+}
+
+func (rw *raftWrapper) WaitForPeer(ctx context.Context, pid string, depart bool) error {
+
+ for {
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ default:
+ peers, err := rw.Peers(ctx)
+ if err != nil {
+ return err
+ }
+
+ if len(peers) == 1 && pid == peers[0] && depart {
+ return errWaitingForSelf
+ }
+
+ found := find(peers, pid)
+
+ // departing
+ if depart && !found {
+ return nil
+ }
+
+ // joining
+ if !depart && found {
+ return nil
+ }
+
+ time.Sleep(50 * time.Millisecond)
+ }
+ }
+}
+
+// Snapshot tells Raft to take a snapshot.
+func (rw *raftWrapper) Snapshot() error {
+ future := rw.raft.Snapshot()
+ err := future.Error()
+ if err != nil && err.Error() != hraft.ErrNothingNewToSnapshot.Error() {
+ return err
+ }
+ return nil
+}
+
+// snapshotOnShutdown attempts to take a snapshot before a shutdown.
+// Snapshotting might fail if the raft applied index is not the last index.
+// This waits for the updates and tries to take a snapshot when the
+// applied index is up to date.
+// It will retry if the snapshot still fails, in case more updates have arrived.
+// If waiting for updates times-out, it will not try anymore, since something
+// is wrong. This is a best-effort solution as there is no way to tell Raft
+// to stop processing entries because we want to take a snapshot before
+// shutting down.
+func (rw *raftWrapper) snapshotOnShutdown() error {
+ var err error
+ for i := 0; i < maxShutdownSnapshotRetries; i++ {
+ ctx, cancel := context.WithTimeout(context.Background(), waitForUpdatesShutdownTimeout)
+ err = rw.WaitForUpdates(ctx)
+ cancel()
+ if err != nil {
+ logger.Warn("timed out waiting for state updates before shutdown. Snapshotting may fail")
+ return rw.Snapshot()
+ }
+
+ err = rw.Snapshot()
+ if err == nil {
+ return nil // things worked
+ }
+
+ // There was an error
+ err = errors.New("could not snapshot raft: " + err.Error())
+ logger.Warnf("retrying to snapshot (%d/%d)...", i+1, maxShutdownSnapshotRetries)
+ }
+ return err
+}
+
+// Shutdown shutdown Raft and closes the BoltDB.
+func (rw *raftWrapper) Shutdown(ctx context.Context) error {
+
+ rw.cancel()
+
+ var finalErr error
+
+ err := rw.snapshotOnShutdown()
+ if err != nil {
+ finalErr = multierr.Append(finalErr, err)
+ }
+
+ future := rw.raft.Shutdown()
+ err = future.Error()
+ if err != nil {
+ finalErr = multierr.Append(finalErr, err)
+ }
+
+ err = rw.boltdb.Close() // important!
+ if err != nil {
+ finalErr = multierr.Append(finalErr, err)
+ }
+
+ return finalErr
+}
+
+// AddPeer adds a peer to Raft
+func (rw *raftWrapper) AddPeer(ctx context.Context, peerId peer.ID) error {
+
+ // Check that we don't have it to not waste
+ // log entries if so.
+ peers, err := rw.Peers(ctx)
+ if err != nil {
+ return err
+ }
+ if find(peers, peerId.String()) {
+ logger.Infof("%s is already a raft peerStr", peerId.String())
+ return nil
+ }
+
+ err = rw.host.Connect(ctx, peer.AddrInfo{ID: peerId})
+ if err != nil {
+ return err
+ }
+
+ future := rw.raft.AddVoter(
+ hraft.ServerID(peerId.String()),
+ hraft.ServerAddress(peerId.String()),
+ 0,
+ 0,
+ ) // TODO: Extra cfg value?
+ err = future.Error()
+ if err != nil {
+ logger.Error("raft cannot add peer: ", err)
+ }
+ return err
+}
+
+// RemovePeer removes a peer from Raft
+func (rw *raftWrapper) RemovePeer(ctx context.Context, peer string) error {
+ // Check that we have it to not waste
+ // log entries if we don't.
+ peers, err := rw.Peers(ctx)
+ if err != nil {
+ return err
+ }
+ if !find(peers, peer) {
+ logger.Infof("%s is not among raft peers", peer)
+ return nil
+ }
+
+ if len(peers) == 1 && peers[0] == peer {
+ return errors.New("cannot remove ourselves from a 1-peer cluster")
+ }
+
+ rmFuture := rw.raft.RemoveServer(
+ hraft.ServerID(peer),
+ 0,
+ 0,
+ )
+ err = rmFuture.Error()
+ if err != nil {
+ logger.Error("raft cannot remove peer: ", err)
+ return err
+ }
+
+ return nil
+}
+
+// Leader returns Raft's leader. It may be an empty string if
+// there is no leader or it is unknown.
+func (rw *raftWrapper) Leader(ctx context.Context) string {
+ return string(rw.raft.Leader())
+}
+
+func (rw *raftWrapper) Peers(ctx context.Context) ([]string, error) {
+ ids := make([]string, 0)
+
+ configFuture := rw.raft.GetConfiguration()
+ if err := configFuture.Error(); err != nil {
+ return nil, err
+ }
+
+ for _, server := range configFuture.Configuration().Servers {
+ ids = append(ids, string(server.ID))
+ }
+
+ return ids, nil
+}
+
+// CleanupRaft moves the current data folder to a backup location
+//func CleanupRaft(cfg *Config) error {
+// dataFolder := cfg.GetDataFolder()
+// keep := cfg.BackupsRotate
+//
+// meta, _, err := latestSnapshot(dataFolder)
+// if meta == nil && err == nil {
+// // no snapshots at all. Avoid creating backups
+// // from empty state folders.
+// logger.Infof("cleaning empty Raft data folder (%s)", dataFolder)
+// os.RemoveAll(dataFolder)
+// return nil
+// }
+//
+// logger.Infof("cleaning and backing up Raft data folder (%s)", dataFolder)
+// dbh := newDataBackupHelper(dataFolder, keep)
+// err = dbh.makeBackup()
+// if err != nil {
+// logger.Warn(err)
+// logger.Warn("the state could not be cleaned properly")
+// logger.Warn("manual intervention may be needed before starting cluster again")
+// }
+// return nil
+//}
+
+// only call when Raft is shutdown
+func (rw *raftWrapper) Clean() error {
+ //return CleanupRaft(rw.config)
+ return nil
+}
+
+func find(s []string, elem string) bool {
+ for _, selem := range s {
+ if selem == elem {
+ return true
+ }
+ }
+ return false
+}
+
+func (rw *raftWrapper) observePeers() {
+ obsCh := make(chan hraft.Observation, 1)
+ defer close(obsCh)
+
+ observer := hraft.NewObserver(obsCh, true, func(o *hraft.Observation) bool {
+ po, ok := o.Data.(hraft.PeerObservation)
+ return ok && po.Removed
+ })
+
+ rw.raft.RegisterObserver(observer)
+ defer rw.raft.DeregisterObserver(observer)
+
+ for {
+ select {
+ case obs := <-obsCh:
+ pObs := obs.Data.(hraft.PeerObservation)
+ logger.Info("raft peer departed. Removing from peerstore: ", pObs.Peer.ID)
+ pID, err := peer.Decode(string(pObs.Peer.ID))
+ if err != nil {
+ logger.Error(err)
+ continue
+ }
+ rw.host.Peerstore().ClearAddrs(pID)
+ case <-rw.ctx.Done():
+ logger.Debug("stopped observing raft peers")
+ return
+ }
+ }
+}
diff --git a/lib/lazy/getonce.go b/lib/lazy/getonce.go
new file mode 100644
index 000000000..7f9d4d664
--- /dev/null
+++ b/lib/lazy/getonce.go
@@ -0,0 +1,50 @@
+package lazy
+
+import (
+ "context"
+ "sync"
+)
+
+type Lazy[T any] struct {
+ Get func() (T, error)
+
+ once sync.Once
+
+ val T
+ err error
+}
+
+func MakeLazy[T any](get func() (T, error)) *Lazy[T] {
+ return &Lazy[T]{
+ Get: get,
+ }
+}
+
+func (l *Lazy[T]) Val() (T, error) {
+ l.once.Do(func() {
+ l.val, l.err = l.Get()
+ })
+ return l.val, l.err
+}
+
+type LazyCtx[T any] struct {
+ Get func(context.Context) (T, error)
+
+ once sync.Once
+
+ val T
+ err error
+}
+
+func MakeLazyCtx[T any](get func(ctx context.Context) (T, error)) *LazyCtx[T] {
+ return &LazyCtx[T]{
+ Get: get,
+ }
+}
+
+func (l *LazyCtx[T]) Val(ctx context.Context) (T, error) {
+ l.once.Do(func() {
+ l.val, l.err = l.Get(ctx)
+ })
+ return l.val, l.err
+}
diff --git a/lib/result/result.go b/lib/result/result.go
new file mode 100644
index 000000000..bec839d7a
--- /dev/null
+++ b/lib/result/result.go
@@ -0,0 +1,35 @@
+package result
+
+// Result is a small wrapper type encapsulating Value/Error tuples, mostly for
+// use when sending values across channels
+// NOTE: Avoid adding any functionality to this, any "nice" things added here will
+// make it more difficult to switch to a more standardised Result-like type when
+// one gets into the stdlib, or when we will want to switch to a library providing
+// those types.
+type Result[T any] struct {
+ Value T
+ Error error
+}
+
+func Ok[T any](value T) Result[T] {
+ return Result[T]{
+ Value: value,
+ }
+}
+
+func Err[T any](err error) Result[T] {
+ return Result[T]{
+ Error: err,
+ }
+}
+
+func Wrap[T any](value T, err error) Result[T] {
+ return Result[T]{
+ Value: value,
+ Error: err,
+ }
+}
+
+func (r *Result[T]) Unwrap() (T, error) {
+ return r.Value, r.Error
+}
diff --git a/lib/retry/retry.go b/lib/retry/retry.go
index 0b53c0fa3..897dbb06c 100644
--- a/lib/retry/retry.go
+++ b/lib/retry/retry.go
@@ -1,26 +1,17 @@
package retry
import (
- "errors"
- "reflect"
+ "context"
"time"
logging "github.com/ipfs/go-log/v2"
+
+ "github.com/filecoin-project/lotus/api"
)
var log = logging.Logger("retry")
-func ErrorIsIn(err error, errorTypes []error) bool {
- for _, etype := range errorTypes {
- tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface()
- if errors.As(err, tmp) {
- return true
- }
- }
- return false
-}
-
-func Retry[T any](attempts int, initialBackoff time.Duration, errorTypes []error, f func() (T, error)) (result T, err error) {
+func Retry[T any](ctx context.Context, attempts int, initialBackoff time.Duration, errorTypes []error, f func() (T, error)) (result T, err error) {
for i := 0; i < attempts; i++ {
if i > 0 {
log.Info("Retrying after error:", err)
@@ -28,9 +19,12 @@ func Retry[T any](attempts int, initialBackoff time.Duration, errorTypes []error
initialBackoff *= 2
}
result, err = f()
- if err == nil || !ErrorIsIn(err, errorTypes) {
+ if err == nil || !api.ErrorIsIn(err, errorTypes) {
return result, err
}
+ if ctx.Err() != nil {
+ return result, ctx.Err()
+ }
}
log.Errorf("Failed after %d attempts, last error: %s", attempts, err)
return result, err
diff --git a/lib/retry/retry_test.go b/lib/retry/retry_test.go
deleted file mode 100644
index a60d47db2..000000000
--- a/lib/retry/retry_test.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package retry
-
-import (
- "testing"
-
- "github.com/stretchr/testify/require"
- "golang.org/x/xerrors"
-
- "github.com/filecoin-project/go-jsonrpc"
-)
-
-func TestRetryErrorIsInTrue(t *testing.T) {
- errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
- require.True(t, ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry))
-}
-
-func TestRetryErrorIsInFalse(t *testing.T) {
- errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
- require.False(t, ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry))
-}
-
-func TestRetryWrappedErrorIsInTrue(t *testing.T) {
- errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
- require.True(t, ErrorIsIn(xerrors.Errorf("wrapped: %w", &jsonrpc.RPCConnectionError{}), errorsToRetry))
-}
diff --git a/lotuspond/api.go b/lotuspond/api.go
deleted file mode 100644
index a02357919..000000000
--- a/lotuspond/api.go
+++ /dev/null
@@ -1,139 +0,0 @@
-package main
-
-import (
- "context"
- "crypto/rand"
- "io"
- "io/ioutil"
- "os"
- "sync"
-
- "golang.org/x/xerrors"
-
- "github.com/filecoin-project/go-jsonrpc"
-
- "github.com/filecoin-project/lotus/node/repo"
-)
-
-type NodeState int
-
-const (
- NodeUnknown = iota //nolint:deadcode
- NodeRunning
- NodeStopped
-)
-
-type api struct {
- cmds int32
- running map[int32]*runningNode
- runningLk sync.Mutex
- genesis string
-}
-
-type nodeInfo struct {
- Repo string
- ID int32
- APIPort int32
- State NodeState
-
- FullNode string // only for storage nodes
- Storage bool
-}
-
-func (api *api) Nodes() []nodeInfo {
- api.runningLk.Lock()
- out := make([]nodeInfo, 0, len(api.running))
- for _, node := range api.running {
- out = append(out, node.meta)
- }
-
- api.runningLk.Unlock()
-
- return out
-}
-
-func (api *api) TokenFor(id int32) (string, error) {
- api.runningLk.Lock()
- defer api.runningLk.Unlock()
-
- rnd, ok := api.running[id]
- if !ok {
- return "", xerrors.New("no running node with this ID")
- }
-
- r, err := repo.NewFS(rnd.meta.Repo)
- if err != nil {
- return "", err
- }
-
- t, err := r.APIToken()
- if err != nil {
- return "", err
- }
-
- return string(t), nil
-}
-
-func (api *api) FullID(id int32) (int32, error) {
- api.runningLk.Lock()
- defer api.runningLk.Unlock()
-
- stor, ok := api.running[id]
- if !ok {
- return 0, xerrors.New("storage node not found")
- }
-
- if !stor.meta.Storage {
- return 0, xerrors.New("node is not a storage node")
- }
-
- for id, n := range api.running {
- if n.meta.Repo == stor.meta.FullNode {
- return id, nil
- }
- }
- return 0, xerrors.New("node not found")
-}
-
-func (api *api) CreateRandomFile(size int64) (string, error) {
- tf, err := ioutil.TempFile(os.TempDir(), "pond-random-")
- if err != nil {
- return "", err
- }
-
- _, err = io.CopyN(tf, rand.Reader, size)
- if err != nil {
- return "", err
- }
-
- if err := tf.Close(); err != nil {
- return "", err
- }
-
- return tf.Name(), nil
-}
-
-func (api *api) Stop(node int32) error {
- api.runningLk.Lock()
- nd, ok := api.running[node]
- api.runningLk.Unlock()
-
- if !ok {
- return nil
- }
-
- nd.stop()
- return nil
-}
-
-type client struct {
- Nodes func() []nodeInfo
-}
-
-func apiClient(ctx context.Context) (*client, error) {
- c := &client{}
- if _, err := jsonrpc.NewClient(ctx, "ws://"+listenAddr+"/rpc/v0", "Pond", c, nil); err != nil {
- return nil, err
- }
- return c, nil
-}
diff --git a/lotuspond/front/.gitignore b/lotuspond/front/.gitignore
deleted file mode 100644
index 4d29575de..000000000
--- a/lotuspond/front/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# production
-/build
-
-# misc
-.DS_Store
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
diff --git a/lotuspond/front/package-lock.json b/lotuspond/front/package-lock.json
deleted file mode 100644
index 9bc04c8a3..000000000
--- a/lotuspond/front/package-lock.json
+++ /dev/null
@@ -1,13251 +0,0 @@
-{
- "name": "front",
- "version": "0.1.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "101": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/101/-/101-1.6.3.tgz",
- "integrity": "sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw==",
- "requires": {
- "clone": "^1.0.2",
- "deep-eql": "^0.1.3",
- "keypather": "^1.10.2"
- }
- },
- "@babel/code-frame": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
- "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
- "requires": {
- "@babel/highlight": "^7.0.0"
- }
- },
- "@babel/core": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz",
- "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.4.0",
- "@babel/helpers": "^7.4.3",
- "@babel/parser": "^7.4.3",
- "@babel/template": "^7.4.0",
- "@babel/traverse": "^7.4.3",
- "@babel/types": "^7.4.0",
- "convert-source-map": "^1.1.0",
- "debug": "^4.1.0",
- "json5": "^2.1.0",
- "lodash": "^4.17.11",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "@babel/generator": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz",
- "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==",
- "requires": {
- "@babel/types": "^7.5.5",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0",
- "trim-right": "^1.0.1"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- }
- }
- },
- "@babel/helper-annotate-as-pure": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
- "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
- "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
- "requires": {
- "@babel/helper-explode-assignable-expression": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-builder-react-jsx": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz",
- "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==",
- "requires": {
- "@babel/types": "^7.3.0",
- "esutils": "^2.0.0"
- }
- },
- "@babel/helper-call-delegate": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
- "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
- "requires": {
- "@babel/helper-hoist-variables": "^7.4.4",
- "@babel/traverse": "^7.4.4",
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/helper-create-class-features-plugin": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz",
- "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==",
- "requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-member-expression-to-functions": "^7.5.5",
- "@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.5.5",
- "@babel/helper-split-export-declaration": "^7.4.4"
- }
- },
- "@babel/helper-define-map": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
- "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==",
- "requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/types": "^7.5.5",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- }
- }
- },
- "@babel/helper-explode-assignable-expression": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
- "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
- "requires": {
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
- "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
- "requires": {
- "@babel/helper-get-function-arity": "^7.0.0",
- "@babel/template": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
- "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
- "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
- "requires": {
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/helper-member-expression-to-functions": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
- "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
- "requires": {
- "@babel/types": "^7.5.5"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
- "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz",
- "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==",
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-simple-access": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.4.4",
- "@babel/template": "^7.4.4",
- "@babel/types": "^7.5.5",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- }
- }
- },
- "@babel/helper-optimise-call-expression": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
- "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
- "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA=="
- },
- "@babel/helper-regex": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
- "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
- "requires": {
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- }
- }
- },
- "@babel/helper-remap-async-to-generator": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
- "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-wrap-function": "^7.1.0",
- "@babel/template": "^7.1.0",
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
- "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.5.5",
- "@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/traverse": "^7.5.5",
- "@babel/types": "^7.5.5"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
- "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
- "requires": {
- "@babel/template": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
- "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
- "requires": {
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/helper-wrap-function": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
- "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
- "requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/template": "^7.1.0",
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.2.0"
- }
- },
- "@babel/helpers": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz",
- "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==",
- "requires": {
- "@babel/template": "^7.4.4",
- "@babel/traverse": "^7.5.5",
- "@babel/types": "^7.5.5"
- }
- },
- "@babel/highlight": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
- "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
- "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g=="
- },
- "@babel/plugin-proposal-async-generator-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
- "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-remap-async-to-generator": "^7.1.0",
- "@babel/plugin-syntax-async-generators": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-class-properties": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz",
- "integrity": "sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.4.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-proposal-decorators": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz",
- "integrity": "sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.4.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-decorators": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-dynamic-import": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz",
- "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-dynamic-import": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-json-strings": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
- "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-json-strings": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-object-rest-spread": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz",
- "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
- "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
- }
- },
- "@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz",
- "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.4",
- "regexpu-core": "^4.5.4"
- }
- },
- "@babel/plugin-syntax-async-generators": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
- "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-decorators": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz",
- "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-dynamic-import": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
- "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-flow": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz",
- "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-json-strings": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
- "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-jsx": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz",
- "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-object-rest-spread": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
- "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
- "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-syntax-typescript": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz",
- "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-arrow-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
- "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-async-to-generator": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz",
- "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==",
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-remap-async-to-generator": "^7.1.0"
- }
- },
- "@babel/plugin-transform-block-scoped-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
- "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-block-scoping": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz",
- "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- }
- }
- },
- "@babel/plugin-transform-classes": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz",
- "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-define-map": "^7.5.5",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.5.5",
- "@babel/helper-split-export-declaration": "^7.4.4",
- "globals": "^11.1.0"
- }
- },
- "@babel/plugin-transform-computed-properties": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
- "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-destructuring": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz",
- "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-dotall-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz",
- "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.4",
- "regexpu-core": "^4.5.4"
- }
- },
- "@babel/plugin-transform-duplicate-keys": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz",
- "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-exponentiation-operator": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
- "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
- "requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-flow-strip-types": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.0.tgz",
- "integrity": "sha512-C4ZVNejHnfB22vI2TYN4RUp2oCmq6cSEAg4RygSvYZUECRqUu9O4PMEMNJ4wsemaRGg27BbgYctG4BZh+AgIHw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-flow": "^7.2.0"
- }
- },
- "@babel/plugin-transform-for-of": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
- "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-function-name": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
- "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
- "requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
- "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-member-expression-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
- "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-modules-amd": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz",
- "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==",
- "requires": {
- "@babel/helper-module-transforms": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-commonjs": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz",
- "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==",
- "requires": {
- "@babel/helper-module-transforms": "^7.4.4",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-simple-access": "^7.1.0",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-systemjs": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz",
- "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==",
- "requires": {
- "@babel/helper-hoist-variables": "^7.4.4",
- "@babel/helper-plugin-utils": "^7.0.0",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-umd": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
- "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
- "requires": {
- "@babel/helper-module-transforms": "^7.1.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz",
- "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==",
- "requires": {
- "regexp-tree": "^0.1.6"
- }
- },
- "@babel/plugin-transform-new-target": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
- "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-object-super": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz",
- "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.5.5"
- }
- },
- "@babel/plugin-transform-parameters": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
- "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
- "requires": {
- "@babel/helper-call-delegate": "^7.4.4",
- "@babel/helper-get-function-arity": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-property-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
- "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-react-constant-elements": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.5.0.tgz",
- "integrity": "sha512-c5Ba8cpybZFp1Izkf2sWGuNjOxoQ32tFgBvvYvwGhi4+9f6vGiSK9Gex4uVuO/Va6YJFu41aAh1MzMjUWkp0IQ==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-react-display-name": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz",
- "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-react-jsx": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz",
- "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==",
- "requires": {
- "@babel/helper-builder-react-jsx": "^7.3.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-jsx": "^7.2.0"
- }
- },
- "@babel/plugin-transform-react-jsx-self": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz",
- "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-jsx": "^7.2.0"
- }
- },
- "@babel/plugin-transform-react-jsx-source": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz",
- "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-jsx": "^7.2.0"
- }
- },
- "@babel/plugin-transform-regenerator": {
- "version": "7.4.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
- "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
- "requires": {
- "regenerator-transform": "^0.14.0"
- }
- },
- "@babel/plugin-transform-reserved-words": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
- "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-runtime": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz",
- "integrity": "sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg==",
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "resolve": "^1.8.1",
- "semver": "^5.5.1"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "@babel/plugin-transform-shorthand-properties": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
- "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-spread": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
- "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-sticky-regex": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
- "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.0.0"
- }
- },
- "@babel/plugin-transform-template-literals": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
- "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-typeof-symbol": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
- "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-typescript": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz",
- "integrity": "sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.5.5",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-typescript": "^7.2.0"
- }
- },
- "@babel/plugin-transform-unicode-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz",
- "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.4",
- "regexpu-core": "^4.5.4"
- }
- },
- "@babel/preset-env": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz",
- "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==",
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
- "@babel/plugin-proposal-dynamic-import": "^7.5.0",
- "@babel/plugin-proposal-json-strings": "^7.2.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
- "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
- "@babel/plugin-syntax-async-generators": "^7.2.0",
- "@babel/plugin-syntax-dynamic-import": "^7.2.0",
- "@babel/plugin-syntax-json-strings": "^7.2.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
- "@babel/plugin-transform-arrow-functions": "^7.2.0",
- "@babel/plugin-transform-async-to-generator": "^7.5.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
- "@babel/plugin-transform-block-scoping": "^7.5.5",
- "@babel/plugin-transform-classes": "^7.5.5",
- "@babel/plugin-transform-computed-properties": "^7.2.0",
- "@babel/plugin-transform-destructuring": "^7.5.0",
- "@babel/plugin-transform-dotall-regex": "^7.4.4",
- "@babel/plugin-transform-duplicate-keys": "^7.5.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
- "@babel/plugin-transform-for-of": "^7.4.4",
- "@babel/plugin-transform-function-name": "^7.4.4",
- "@babel/plugin-transform-literals": "^7.2.0",
- "@babel/plugin-transform-member-expression-literals": "^7.2.0",
- "@babel/plugin-transform-modules-amd": "^7.5.0",
- "@babel/plugin-transform-modules-commonjs": "^7.5.0",
- "@babel/plugin-transform-modules-systemjs": "^7.5.0",
- "@babel/plugin-transform-modules-umd": "^7.2.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
- "@babel/plugin-transform-new-target": "^7.4.4",
- "@babel/plugin-transform-object-super": "^7.5.5",
- "@babel/plugin-transform-parameters": "^7.4.4",
- "@babel/plugin-transform-property-literals": "^7.2.0",
- "@babel/plugin-transform-regenerator": "^7.4.5",
- "@babel/plugin-transform-reserved-words": "^7.2.0",
- "@babel/plugin-transform-shorthand-properties": "^7.2.0",
- "@babel/plugin-transform-spread": "^7.2.0",
- "@babel/plugin-transform-sticky-regex": "^7.2.0",
- "@babel/plugin-transform-template-literals": "^7.4.4",
- "@babel/plugin-transform-typeof-symbol": "^7.2.0",
- "@babel/plugin-transform-unicode-regex": "^7.4.4",
- "@babel/types": "^7.5.5",
- "browserslist": "^4.6.0",
- "core-js-compat": "^3.1.1",
- "invariant": "^2.2.2",
- "js-levenshtein": "^1.1.3",
- "semver": "^5.5.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "@babel/preset-react": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz",
- "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-transform-react-display-name": "^7.0.0",
- "@babel/plugin-transform-react-jsx": "^7.0.0",
- "@babel/plugin-transform-react-jsx-self": "^7.0.0",
- "@babel/plugin-transform-react-jsx-source": "^7.0.0"
- }
- },
- "@babel/preset-typescript": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz",
- "integrity": "sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-transform-typescript": "^7.3.2"
- }
- },
- "@babel/runtime": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.3.tgz",
- "integrity": "sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==",
- "requires": {
- "regenerator-runtime": "^0.13.2"
- }
- },
- "@babel/template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
- "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.4.4",
- "@babel/types": "^7.4.4"
- }
- },
- "@babel/traverse": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz",
- "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==",
- "requires": {
- "@babel/code-frame": "^7.5.5",
- "@babel/generator": "^7.5.5",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.4.4",
- "@babel/parser": "^7.5.5",
- "@babel/types": "^7.5.5",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- }
- }
- },
- "@babel/types": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz",
- "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==",
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- }
- }
- },
- "@cnakazawa/watch": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz",
- "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==",
- "requires": {
- "exec-sh": "^0.3.2",
- "minimist": "^1.2.0"
- }
- },
- "@csstools/convert-colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
- "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw=="
- },
- "@csstools/normalize.css": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz",
- "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA=="
- },
- "@hapi/address": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz",
- "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw=="
- },
- "@hapi/hoek": {
- "version": "6.2.4",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz",
- "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A=="
- },
- "@hapi/joi": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.0.tgz",
- "integrity": "sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ==",
- "requires": {
- "@hapi/address": "2.x.x",
- "@hapi/hoek": "6.x.x",
- "@hapi/marker": "1.x.x",
- "@hapi/topo": "3.x.x"
- }
- },
- "@hapi/marker": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/marker/-/marker-1.0.0.tgz",
- "integrity": "sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA=="
- },
- "@hapi/topo": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.2.tgz",
- "integrity": "sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA==",
- "requires": {
- "@hapi/hoek": "8.x.x"
- },
- "dependencies": {
- "@hapi/hoek": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz",
- "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw=="
- }
- }
- },
- "@jest/console": {
- "version": "24.7.1",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz",
- "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==",
- "requires": {
- "@jest/source-map": "^24.3.0",
- "chalk": "^2.0.1",
- "slash": "^2.0.0"
- }
- },
- "@jest/core": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz",
- "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==",
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/reporters": "^24.8.0",
- "@jest/test-result": "^24.8.0",
- "@jest/transform": "^24.8.0",
- "@jest/types": "^24.8.0",
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "graceful-fs": "^4.1.15",
- "jest-changed-files": "^24.8.0",
- "jest-config": "^24.8.0",
- "jest-haste-map": "^24.8.0",
- "jest-message-util": "^24.8.0",
- "jest-regex-util": "^24.3.0",
- "jest-resolve-dependencies": "^24.8.0",
- "jest-runner": "^24.8.0",
- "jest-runtime": "^24.8.0",
- "jest-snapshot": "^24.8.0",
- "jest-util": "^24.8.0",
- "jest-validate": "^24.8.0",
- "jest-watcher": "^24.8.0",
- "micromatch": "^3.1.10",
- "p-each-series": "^1.0.0",
- "pirates": "^4.0.1",
- "realpath-native": "^1.1.0",
- "rimraf": "^2.5.4",
- "strip-ansi": "^5.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "@jest/environment": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz",
- "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==",
- "requires": {
- "@jest/fake-timers": "^24.8.0",
- "@jest/transform": "^24.8.0",
- "@jest/types": "^24.8.0",
- "jest-mock": "^24.8.0"
- }
- },
- "@jest/fake-timers": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz",
- "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "jest-message-util": "^24.8.0",
- "jest-mock": "^24.8.0"
- }
- },
- "@jest/reporters": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz",
- "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==",
- "requires": {
- "@jest/environment": "^24.8.0",
- "@jest/test-result": "^24.8.0",
- "@jest/transform": "^24.8.0",
- "@jest/types": "^24.8.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "glob": "^7.1.2",
- "istanbul-lib-coverage": "^2.0.2",
- "istanbul-lib-instrument": "^3.0.1",
- "istanbul-lib-report": "^2.0.4",
- "istanbul-lib-source-maps": "^3.0.1",
- "istanbul-reports": "^2.1.1",
- "jest-haste-map": "^24.8.0",
- "jest-resolve": "^24.8.0",
- "jest-runtime": "^24.8.0",
- "jest-util": "^24.8.0",
- "jest-worker": "^24.6.0",
- "node-notifier": "^5.2.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0",
- "string-length": "^2.0.0"
- },
- "dependencies": {
- "jest-resolve": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz",
- "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "@jest/source-map": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz",
- "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==",
- "requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "@jest/test-result": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz",
- "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==",
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/types": "^24.8.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
- }
- },
- "@jest/test-sequencer": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz",
- "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==",
- "requires": {
- "@jest/test-result": "^24.8.0",
- "jest-haste-map": "^24.8.0",
- "jest-runner": "^24.8.0",
- "jest-runtime": "^24.8.0"
- }
- },
- "@jest/transform": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz",
- "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==",
- "requires": {
- "@babel/core": "^7.1.0",
- "@jest/types": "^24.8.0",
- "babel-plugin-istanbul": "^5.1.0",
- "chalk": "^2.0.1",
- "convert-source-map": "^1.4.0",
- "fast-json-stable-stringify": "^2.0.0",
- "graceful-fs": "^4.1.15",
- "jest-haste-map": "^24.8.0",
- "jest-regex-util": "^24.3.0",
- "jest-util": "^24.8.0",
- "micromatch": "^3.1.10",
- "realpath-native": "^1.1.0",
- "slash": "^2.0.0",
- "source-map": "^0.6.1",
- "write-file-atomic": "2.4.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "@jest/types": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz",
- "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==",
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^12.0.9"
- }
- },
- "@mrmlnc/readdir-enhanced": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
- "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
- "requires": {
- "call-me-maybe": "^1.0.1",
- "glob-to-regexp": "^0.3.0"
- }
- },
- "@nodelib/fs.stat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
- },
- "@svgr/babel-plugin-add-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig=="
- },
- "@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ=="
- },
- "@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
- "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w=="
- },
- "@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
- "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w=="
- },
- "@svgr/babel-plugin-svg-dynamic-title": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.1.tgz",
- "integrity": "sha512-p6z6JJroP989jHWcuraeWpzdejehTmLUpyC9smhTBWyPN0VVGe2phbYxpPTV7Vh8XzmFrcG55idrnfWn/2oQEw=="
- },
- "@svgr/babel-plugin-svg-em-dimensions": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
- "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w=="
- },
- "@svgr/babel-plugin-transform-react-native-svg": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
- "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw=="
- },
- "@svgr/babel-plugin-transform-svg-component": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
- "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw=="
- },
- "@svgr/babel-preset": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.1.tgz",
- "integrity": "sha512-rPFKLmyhlh6oeBv3j2vEAj2nd2QbWqpoJLKzBLjwQVt+d9aeXajVaPNEqrES2spjXKR4OxfgSs7U0NtmAEkr0Q==",
- "requires": {
- "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
- "@svgr/babel-plugin-svg-dynamic-title": "^4.3.1",
- "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
- "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
- }
- },
- "@svgr/core": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.2.tgz",
- "integrity": "sha512-N+tP5CLFd1hP9RpO83QJPZY3NL8AtrdqNbuhRgBkjE/49RnMrrRsFm1wY8pueUfAGvzn6tSXUq29o6ah8RuR5w==",
- "requires": {
- "@svgr/plugin-jsx": "^4.3.2",
- "camelcase": "^5.3.1",
- "cosmiconfig": "^5.2.1"
- }
- },
- "@svgr/hast-util-to-babel-ast": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
- "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
- "requires": {
- "@babel/types": "^7.4.4"
- }
- },
- "@svgr/plugin-jsx": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.2.tgz",
- "integrity": "sha512-+1GW32RvmNmCsOkMoclA/TppNjHPLMnNZG3/Ecscxawp051XJ2MkO09Hn11VcotdC2EPrDfT8pELGRo+kbZ1Eg==",
- "requires": {
- "@babel/core": "^7.4.5",
- "@svgr/babel-preset": "^4.3.1",
- "@svgr/hast-util-to-babel-ast": "^4.3.2",
- "svg-parser": "^2.0.0"
- },
- "dependencies": {
- "@babel/core": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz",
- "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==",
- "requires": {
- "@babel/code-frame": "^7.5.5",
- "@babel/generator": "^7.5.5",
- "@babel/helpers": "^7.5.5",
- "@babel/parser": "^7.5.5",
- "@babel/template": "^7.4.4",
- "@babel/traverse": "^7.5.5",
- "@babel/types": "^7.5.5",
- "convert-source-map": "^1.1.0",
- "debug": "^4.1.0",
- "json5": "^2.1.0",
- "lodash": "^4.17.13",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
- }
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "@svgr/plugin-svgo": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
- "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
- "requires": {
- "cosmiconfig": "^5.2.1",
- "merge-deep": "^3.0.2",
- "svgo": "^1.2.2"
- }
- },
- "@svgr/webpack": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz",
- "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==",
- "requires": {
- "@babel/core": "^7.1.6",
- "@babel/plugin-transform-react-constant-elements": "^7.0.0",
- "@babel/preset-env": "^7.1.6",
- "@babel/preset-react": "^7.0.0",
- "@svgr/core": "^4.1.0",
- "@svgr/plugin-jsx": "^4.1.0",
- "@svgr/plugin-svgo": "^4.0.3",
- "loader-utils": "^1.1.0"
- }
- },
- "@types/babel__core": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz",
- "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==",
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "@types/babel__generator": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz",
- "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==",
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@types/babel__template": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
- "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@types/babel__traverse": {
- "version": "7.0.7",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz",
- "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==",
- "requires": {
- "@babel/types": "^7.3.0"
- }
- },
- "@types/istanbul-lib-coverage": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz",
- "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg=="
- },
- "@types/istanbul-lib-report": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz",
- "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==",
- "requires": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "@types/istanbul-reports": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz",
- "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==",
- "requires": {
- "@types/istanbul-lib-coverage": "*",
- "@types/istanbul-lib-report": "*"
- }
- },
- "@types/q": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
- "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw=="
- },
- "@types/stack-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
- "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw=="
- },
- "@types/yargs": {
- "version": "12.0.12",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz",
- "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw=="
- },
- "@typescript-eslint/eslint-plugin": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz",
- "integrity": "sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ==",
- "requires": {
- "@typescript-eslint/parser": "1.6.0",
- "@typescript-eslint/typescript-estree": "1.6.0",
- "requireindex": "^1.2.0",
- "tsutils": "^3.7.0"
- }
- },
- "@typescript-eslint/parser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.6.0.tgz",
- "integrity": "sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw==",
- "requires": {
- "@typescript-eslint/typescript-estree": "1.6.0",
- "eslint-scope": "^4.0.0",
- "eslint-visitor-keys": "^1.0.0"
- }
- },
- "@typescript-eslint/typescript-estree": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz",
- "integrity": "sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA==",
- "requires": {
- "lodash.unescape": "4.0.1",
- "semver": "5.5.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
- }
- }
- },
- "@webassemblyjs/ast": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
- "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
- "requires": {
- "@webassemblyjs/helper-module-context": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/wast-parser": "1.8.5"
- }
- },
- "@webassemblyjs/floating-point-hex-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
- "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ=="
- },
- "@webassemblyjs/helper-api-error": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
- "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA=="
- },
- "@webassemblyjs/helper-buffer": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
- "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q=="
- },
- "@webassemblyjs/helper-code-frame": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
- "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
- "requires": {
- "@webassemblyjs/wast-printer": "1.8.5"
- }
- },
- "@webassemblyjs/helper-fsm": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
- "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow=="
- },
- "@webassemblyjs/helper-module-context": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
- "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "mamacro": "^0.0.3"
- }
- },
- "@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
- "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ=="
- },
- "@webassemblyjs/helper-wasm-section": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
- "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5"
- }
- },
- "@webassemblyjs/ieee754": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
- "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
- "requires": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "@webassemblyjs/leb128": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
- "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
- "requires": {
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/utf8": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
- "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw=="
- },
- "@webassemblyjs/wasm-edit": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
- "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/helper-wasm-section": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5",
- "@webassemblyjs/wasm-opt": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5",
- "@webassemblyjs/wast-printer": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-gen": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
- "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/ieee754": "1.8.5",
- "@webassemblyjs/leb128": "1.8.5",
- "@webassemblyjs/utf8": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-opt": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
- "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
- "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-api-error": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/ieee754": "1.8.5",
- "@webassemblyjs/leb128": "1.8.5",
- "@webassemblyjs/utf8": "1.8.5"
- }
- },
- "@webassemblyjs/wast-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
- "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/floating-point-hex-parser": "1.8.5",
- "@webassemblyjs/helper-api-error": "1.8.5",
- "@webassemblyjs/helper-code-frame": "1.8.5",
- "@webassemblyjs/helper-fsm": "1.8.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/wast-printer": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
- "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/wast-parser": "1.8.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
- },
- "@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
- },
- "abab": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz",
- "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w=="
- },
- "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"
- }
- },
- "acorn": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz",
- "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q=="
- },
- "acorn-dynamic-import": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
- "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw=="
- },
- "acorn-globals": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz",
- "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==",
- "requires": {
- "acorn": "^6.0.1",
- "acorn-walk": "^6.0.1"
- }
- },
- "acorn-jsx": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
- "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg=="
- },
- "acorn-walk": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
- "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA=="
- },
- "address": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
- "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
- },
- "ajv": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
- "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
- "requires": {
- "fast-deep-equal": "^2.0.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-errors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
- "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
- },
- "ajv-keywords": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
- "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ=="
- },
- "alphanum-sort": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
- "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
- },
- "ansi-colors": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
- "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA=="
- },
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
- },
- "ansi-html": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
- "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
- },
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- }
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "aria-query": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz",
- "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=",
- "requires": {
- "ast-types-flow": "0.0.7",
- "commander": "^2.11.0"
- }
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
- },
- "array-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
- "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
- },
- "array-filter": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
- "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
- },
- "array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
- },
- "array-includes": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
- "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
- "requires": {
- "define-properties": "^1.1.2",
- "es-abstract": "^1.7.0"
- }
- },
- "array-map": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
- "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI="
- },
- "array-reduce": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
- "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys="
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "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": "4.10.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
- "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
- "requires": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "assert": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
- "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
- "requires": {
- "object-assign": "^4.1.1",
- "util": "0.10.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
- },
- "util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
- "requires": {
- "inherits": "2.0.1"
- }
- }
- }
- },
- "assert-args": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/assert-args/-/assert-args-1.2.1.tgz",
- "integrity": "sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70=",
- "requires": {
- "101": "^1.2.0",
- "compound-subject": "0.0.1",
- "debug": "^2.2.0",
- "get-prototype-of": "0.0.0",
- "is-capitalized": "^1.0.0",
- "is-class": "0.0.4"
- },
- "dependencies": {
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
- },
- "ast-types-flow": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
- "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
- },
- "async-each": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
- "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
- },
- "async-limiter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
- "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
- },
- "autoprefixer": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz",
- "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==",
- "requires": {
- "browserslist": "^4.6.3",
- "caniuse-lite": "^1.0.30000980",
- "chalk": "^2.4.2",
- "normalize-range": "^0.1.2",
- "num2fraction": "^1.2.2",
- "postcss": "^7.0.17",
- "postcss-value-parser": "^4.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz",
- "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ=="
- }
- }
- },
- "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.8.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
- "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
- },
- "axobject-query": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz",
- "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==",
- "requires": {
- "ast-types-flow": "0.0.7"
- }
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "babel-eslint": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz",
- "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.0.0",
- "@babel/traverse": "^7.0.0",
- "@babel/types": "^7.0.0",
- "eslint-scope": "3.7.1",
- "eslint-visitor-keys": "^1.0.0"
- },
- "dependencies": {
- "eslint-scope": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
- "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- }
- }
- },
- "babel-extract-comments": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz",
- "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==",
- "requires": {
- "babylon": "^6.18.0"
- }
- },
- "babel-jest": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz",
- "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==",
- "requires": {
- "@jest/transform": "^24.8.0",
- "@jest/types": "^24.8.0",
- "@types/babel__core": "^7.1.0",
- "babel-plugin-istanbul": "^5.1.0",
- "babel-preset-jest": "^24.6.0",
- "chalk": "^2.4.2",
- "slash": "^2.0.0"
- }
- },
- "babel-loader": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz",
- "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==",
- "requires": {
- "find-cache-dir": "^2.0.0",
- "loader-utils": "^1.0.2",
- "mkdirp": "^0.5.1",
- "util.promisify": "^1.0.0"
- }
- },
- "babel-plugin-dynamic-import-node": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
- "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
- "requires": {
- "object.assign": "^4.1.0"
- }
- },
- "babel-plugin-istanbul": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
- "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "find-up": "^3.0.0",
- "istanbul-lib-instrument": "^3.3.0",
- "test-exclude": "^5.2.3"
- }
- },
- "babel-plugin-jest-hoist": {
- "version": "24.6.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz",
- "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==",
- "requires": {
- "@types/babel__traverse": "^7.0.6"
- }
- },
- "babel-plugin-macros": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz",
- "integrity": "sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q==",
- "requires": {
- "@babel/runtime": "^7.4.2",
- "cosmiconfig": "^5.2.0",
- "resolve": "^1.10.0"
- }
- },
- "babel-plugin-named-asset-import": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz",
- "integrity": "sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ=="
- },
- "babel-plugin-syntax-object-rest-spread": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
- "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
- },
- "babel-plugin-transform-object-rest-spread": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
- "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
- "requires": {
- "babel-plugin-syntax-object-rest-spread": "^6.8.0",
- "babel-runtime": "^6.26.0"
- }
- },
- "babel-plugin-transform-react-remove-prop-types": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
- "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
- },
- "babel-preset-jest": {
- "version": "24.6.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz",
- "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==",
- "requires": {
- "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
- "babel-plugin-jest-hoist": "^24.6.0"
- }
- },
- "babel-preset-react-app": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.0.tgz",
- "integrity": "sha512-YVsDA8HpAKklhFLJtl9+AgaxrDaor8gGvDFlsg1ByOS0IPGUovumdv4/gJiAnLcDmZmKlH6+9sVOz4NVW7emAg==",
- "requires": {
- "@babel/core": "7.4.3",
- "@babel/plugin-proposal-class-properties": "7.4.0",
- "@babel/plugin-proposal-decorators": "7.4.0",
- "@babel/plugin-proposal-object-rest-spread": "7.4.3",
- "@babel/plugin-syntax-dynamic-import": "7.2.0",
- "@babel/plugin-transform-classes": "7.4.3",
- "@babel/plugin-transform-destructuring": "7.4.3",
- "@babel/plugin-transform-flow-strip-types": "7.4.0",
- "@babel/plugin-transform-react-constant-elements": "7.2.0",
- "@babel/plugin-transform-react-display-name": "7.2.0",
- "@babel/plugin-transform-runtime": "7.4.3",
- "@babel/preset-env": "7.4.3",
- "@babel/preset-react": "7.0.0",
- "@babel/preset-typescript": "7.3.3",
- "@babel/runtime": "7.4.3",
- "babel-plugin-dynamic-import-node": "2.2.0",
- "babel-plugin-macros": "2.5.1",
- "babel-plugin-transform-react-remove-prop-types": "0.4.24"
- },
- "dependencies": {
- "@babel/plugin-proposal-object-rest-spread": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz",
- "integrity": "sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
- }
- },
- "@babel/plugin-transform-classes": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz",
- "integrity": "sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-define-map": "^7.4.0",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.4.0",
- "@babel/helper-split-export-declaration": "^7.4.0",
- "globals": "^11.1.0"
- }
- },
- "@babel/plugin-transform-destructuring": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz",
- "integrity": "sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/plugin-transform-react-constant-elements": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz",
- "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0"
- }
- },
- "@babel/preset-env": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz",
- "integrity": "sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw==",
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
- "@babel/plugin-proposal-json-strings": "^7.2.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.4.3",
- "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.0",
- "@babel/plugin-syntax-async-generators": "^7.2.0",
- "@babel/plugin-syntax-json-strings": "^7.2.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
- "@babel/plugin-transform-arrow-functions": "^7.2.0",
- "@babel/plugin-transform-async-to-generator": "^7.4.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
- "@babel/plugin-transform-block-scoping": "^7.4.0",
- "@babel/plugin-transform-classes": "^7.4.3",
- "@babel/plugin-transform-computed-properties": "^7.2.0",
- "@babel/plugin-transform-destructuring": "^7.4.3",
- "@babel/plugin-transform-dotall-regex": "^7.4.3",
- "@babel/plugin-transform-duplicate-keys": "^7.2.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
- "@babel/plugin-transform-for-of": "^7.4.3",
- "@babel/plugin-transform-function-name": "^7.4.3",
- "@babel/plugin-transform-literals": "^7.2.0",
- "@babel/plugin-transform-member-expression-literals": "^7.2.0",
- "@babel/plugin-transform-modules-amd": "^7.2.0",
- "@babel/plugin-transform-modules-commonjs": "^7.4.3",
- "@babel/plugin-transform-modules-systemjs": "^7.4.0",
- "@babel/plugin-transform-modules-umd": "^7.2.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.2",
- "@babel/plugin-transform-new-target": "^7.4.0",
- "@babel/plugin-transform-object-super": "^7.2.0",
- "@babel/plugin-transform-parameters": "^7.4.3",
- "@babel/plugin-transform-property-literals": "^7.2.0",
- "@babel/plugin-transform-regenerator": "^7.4.3",
- "@babel/plugin-transform-reserved-words": "^7.2.0",
- "@babel/plugin-transform-shorthand-properties": "^7.2.0",
- "@babel/plugin-transform-spread": "^7.2.0",
- "@babel/plugin-transform-sticky-regex": "^7.2.0",
- "@babel/plugin-transform-template-literals": "^7.2.0",
- "@babel/plugin-transform-typeof-symbol": "^7.2.0",
- "@babel/plugin-transform-unicode-regex": "^7.4.3",
- "@babel/types": "^7.4.0",
- "browserslist": "^4.5.2",
- "core-js-compat": "^3.0.0",
- "invariant": "^2.2.2",
- "js-levenshtein": "^1.1.3",
- "semver": "^5.5.0"
- }
- },
- "babel-plugin-dynamic-import-node": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz",
- "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==",
- "requires": {
- "object.assign": "^4.1.0"
- }
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- },
- "dependencies": {
- "core-js": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
- "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
- }
- }
- },
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- }
- }
- },
- "base-x": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz",
- "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "base64-js": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
- "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
- },
- "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"
- }
- },
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
- },
- "bignumber.js": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
- "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
- },
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
- },
- "blakejs": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz",
- "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U="
- },
- "bluebird": {
- "version": "3.5.5",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
- "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w=="
- },
- "bn.js": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
- "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
- },
- "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"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- },
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
- }
- }
- },
- "bonjour": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
- "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
- "requires": {
- "array-flatten": "^2.1.0",
- "deep-equal": "^1.0.1",
- "dns-equal": "^1.0.0",
- "dns-txt": "^2.0.2",
- "multicast-dns": "^6.0.1",
- "multicast-dns-service-types": "^1.1.0"
- }
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
- },
- "borc": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.1.tgz",
- "integrity": "sha512-vPLLC2/gS0QN4O3cnPh+8jLshkMMD4qIfs+B1TPGPh30WrtcfItaO6j4k9alsqu/hIgKi8dVdmMvTcbq4tIF7A==",
- "requires": {
- "bignumber.js": "^9.0.0",
- "commander": "^2.15.0",
- "ieee754": "^1.1.8",
- "iso-url": "~0.4.4",
- "json-text-sequence": "~0.1.0"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
- },
- "browser-process-hrtime": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz",
- "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw=="
- },
- "browser-resolve": {
- "version": "1.11.3",
- "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
- "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
- "requires": {
- "resolve": "1.1.7"
- },
- "dependencies": {
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
- }
- }
- },
- "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.0.1",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
- "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
- "requires": {
- "bn.js": "^4.1.0",
- "randombytes": "^2.0.1"
- }
- },
- "browserify-sign": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
- "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
- "requires": {
- "bn.js": "^4.1.1",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.2",
- "elliptic": "^6.0.0",
- "inherits": "^2.0.1",
- "parse-asn1": "^5.0.0"
- }
- },
- "browserify-zlib": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
- "requires": {
- "pako": "~1.0.5"
- }
- },
- "browserslist": {
- "version": "4.6.6",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz",
- "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==",
- "requires": {
- "caniuse-lite": "^1.0.30000984",
- "electron-to-chromium": "^1.3.191",
- "node-releases": "^1.1.25"
- }
- },
- "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"
- }
- },
- "bser": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz",
- "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==",
- "requires": {
- "node-int64": "^0.4.0"
- }
- },
- "buffer": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
- "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
- }
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
- },
- "buffer-indexof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
- "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
- },
- "buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
- },
- "builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
- },
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
- },
- "cacache": {
- "version": "11.3.3",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
- "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
- "requires": {
- "bluebird": "^3.5.5",
- "chownr": "^1.1.1",
- "figgy-pudding": "^3.5.1",
- "glob": "^7.1.4",
- "graceful-fs": "^4.1.15",
- "lru-cache": "^5.1.1",
- "mississippi": "^3.0.0",
- "mkdirp": "^0.5.1",
- "move-concurrently": "^1.0.1",
- "promise-inflight": "^1.0.1",
- "rimraf": "^2.6.3",
- "ssri": "^6.0.1",
- "unique-filename": "^1.1.1",
- "y18n": "^4.0.0"
- }
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- }
- },
- "call-me-maybe": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
- "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
- },
- "caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
- "requires": {
- "callsites": "^2.0.0"
- }
- },
- "caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
- "requires": {
- "caller-callsite": "^2.0.0"
- }
- },
- "callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
- },
- "camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
- "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
- "requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
- },
- "camelize": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
- "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
- },
- "caniuse-api": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
- "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.0",
- "lodash.memoize": "^4.1.2",
- "lodash.uniq": "^4.5.0"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30000985",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz",
- "integrity": "sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w=="
- },
- "capture-exit": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
- "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
- "requires": {
- "rsvp": "^4.8.4"
- }
- },
- "case-sensitive-paths-webpack-plugin": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz",
- "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g=="
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
- },
- "chokidar": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
- "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- },
- "dependencies": {
- "fsevents": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
- "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
- "optional": true,
- "requires": {
- "nan": "^2.12.1",
- "node-pre-gyp": "^0.12.0"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "optional": true
- },
- "aproba": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- "optional": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chownr": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "optional": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "debug": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.3",
- "bundled": true,
- "optional": true
- },
- "fs-minipass": {
- "version": "1.2.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "glob": {
- "version": "7.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "bundled": true,
- "optional": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-walk": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true,
- "optional": true
- },
- "ini": {
- "version": "1.3.5",
- "bundled": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "optional": true
- },
- "minipass": {
- "version": "2.3.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.2.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.1.1",
- "bundled": true,
- "optional": true
- },
- "needle": {
- "version": "2.3.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "debug": "^4.1.0",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- }
- },
- "node-pre-gyp": {
- "version": "0.12.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "npm-bundled": {
- "version": "1.0.6",
- "bundled": true,
- "optional": true
- },
- "npm-packlist": {
- "version": "1.4.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "rimraf": {
- "version": "2.6.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "bundled": true,
- "optional": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "bundled": true,
- "optional": true
- },
- "sax": {
- "version": "1.2.4",
- "bundled": true,
- "optional": true
- },
- "semver": {
- "version": "5.7.0",
- "bundled": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "optional": true
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "tar": {
- "version": "4.4.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.3.4",
- "minizlib": "^1.1.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.2"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "wide-align": {
- "version": "1.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "yallist": {
- "version": "3.0.3",
- "bundled": true,
- "optional": true
- }
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- }
- }
- },
- "chownr": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz",
- "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A=="
- },
- "chrome-trace-event": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
- "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
- },
- "cids": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.1.tgz",
- "integrity": "sha512-qEM4j2GKE/BiT6WdUi6cfW8dairhSLTUE8tIdxJG6SvY33Mp/UPjw+xcO0n1zsllgo72BupzKF/44v+Bg8YPPg==",
- "requires": {
- "class-is": "^1.1.0",
- "multibase": "~0.6.0",
- "multicodec": "~0.5.1",
- "multihashes": "~0.4.14"
- }
- },
- "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"
- }
- },
- "circular-json": {
- "version": "0.5.9",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz",
- "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ=="
- },
- "class-is": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz",
- "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw=="
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "classnames": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
- "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
- },
- "clean-css": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
- "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
- "requires": {
- "source-map": "~0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "cliui": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
- }
- },
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- },
- "clone-deep": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
- "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
- "requires": {
- "for-own": "^0.1.3",
- "is-plain-object": "^2.0.1",
- "kind-of": "^3.0.2",
- "lazy-cache": "^1.0.3",
- "shallow-clone": "^0.1.2"
- }
- },
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
- },
- "coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "requires": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
- "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
- "requires": {
- "color-convert": "^1.9.1",
- "color-string": "^1.5.2"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "color-string": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz",
- "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==",
- "requires": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "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"
- }
- },
- "commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ=="
- },
- "common-tags": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
- "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
- },
- "compound-subject": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/compound-subject/-/compound-subject-0.0.1.tgz",
- "integrity": "sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs="
- },
- "compressible": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
- "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==",
- "requires": {
- "mime-db": ">= 1.40.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "confusing-browser-globals": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz",
- "integrity": "sha512-cgHI1azax5ATrZ8rJ+ODDML9Fvu67PimB6aNxBrc/QwSaDaM9eTfIEUHx3bBLJJ82ioSb+/5zfsMCCEJax3ByQ=="
- },
- "connect-history-api-fallback": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
- },
- "console-browserify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
- "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
- "requires": {
- "date-now": "^0.1.4"
- }
- },
- "constants-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
- },
- "contains-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
- "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
- },
- "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-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=="
- },
- "convert-source-map": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
- "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "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="
- },
- "copy-concurrently": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
- "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
- "requires": {
- "aproba": "^1.1.1",
- "fs-write-stream-atomic": "^1.0.8",
- "iferr": "^0.1.5",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.5.4",
- "run-queue": "^1.0.0"
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
- },
- "core-js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz",
- "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew=="
- },
- "core-js-compat": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz",
- "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==",
- "requires": {
- "browserslist": "^4.6.2",
- "core-js-pure": "3.1.4",
- "semver": "^6.1.1"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "core-js-pure": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz",
- "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA=="
- },
- "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="
- },
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- }
- },
- "create-ecdh": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
- "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
- "requires": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.0.0"
- }
- },
- "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"
- }
- },
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "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"
- }
- },
- "css-blank-pseudo": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
- "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
- "requires": {
- "postcss": "^7.0.5"
- }
- },
- "css-color-keywords": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
- "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU="
- },
- "css-color-names": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
- "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
- },
- "css-declaration-sorter": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
- "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
- "requires": {
- "postcss": "^7.0.1",
- "timsort": "^0.3.0"
- }
- },
- "css-has-pseudo": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
- "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
- "requires": {
- "postcss": "^7.0.6",
- "postcss-selector-parser": "^5.0.0-rc.4"
- },
- "dependencies": {
- "cssesc": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
- "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
- },
- "postcss-selector-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
- "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
- "requires": {
- "cssesc": "^2.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "css-loader": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz",
- "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==",
- "requires": {
- "camelcase": "^5.2.0",
- "icss-utils": "^4.1.0",
- "loader-utils": "^1.2.3",
- "normalize-path": "^3.0.0",
- "postcss": "^7.0.14",
- "postcss-modules-extract-imports": "^2.0.0",
- "postcss-modules-local-by-default": "^2.0.6",
- "postcss-modules-scope": "^2.1.0",
- "postcss-modules-values": "^2.0.0",
- "postcss-value-parser": "^3.3.0",
- "schema-utils": "^1.0.0"
- },
- "dependencies": {
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- }
- }
- },
- "css-prefers-color-scheme": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
- "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
- "requires": {
- "postcss": "^7.0.5"
- }
- },
- "css-select": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz",
- "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==",
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^2.1.2",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
- },
- "css-to-react-native": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.1.tgz",
- "integrity": "sha512-yO+oEx1Lf+hDKasqQRVrAvzMCz825Huh1VMlEEDlRWyAhFb/FWb6I0KpEF1PkyKQ7NEdcx9d5M2ZEWgJAsgPvQ==",
- "requires": {
- "camelize": "^1.0.0",
- "css-color-keywords": "^1.0.0",
- "postcss-value-parser": "^3.3.0"
- }
- },
- "css-tree": {
- "version": "1.0.0-alpha.33",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz",
- "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==",
- "requires": {
- "mdn-data": "2.0.4",
- "source-map": "^0.5.3"
- }
- },
- "css-unit-converter": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz",
- "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY="
- },
- "css-what": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
- "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="
- },
- "cssdb": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
- "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ=="
- },
- "cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
- },
- "cssnano": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
- "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
- "requires": {
- "cosmiconfig": "^5.0.0",
- "cssnano-preset-default": "^4.0.7",
- "is-resolvable": "^1.0.0",
- "postcss": "^7.0.0"
- }
- },
- "cssnano-preset-default": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
- "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
- "requires": {
- "css-declaration-sorter": "^4.0.1",
- "cssnano-util-raw-cache": "^4.0.1",
- "postcss": "^7.0.0",
- "postcss-calc": "^7.0.1",
- "postcss-colormin": "^4.0.3",
- "postcss-convert-values": "^4.0.1",
- "postcss-discard-comments": "^4.0.2",
- "postcss-discard-duplicates": "^4.0.2",
- "postcss-discard-empty": "^4.0.1",
- "postcss-discard-overridden": "^4.0.1",
- "postcss-merge-longhand": "^4.0.11",
- "postcss-merge-rules": "^4.0.3",
- "postcss-minify-font-values": "^4.0.2",
- "postcss-minify-gradients": "^4.0.2",
- "postcss-minify-params": "^4.0.2",
- "postcss-minify-selectors": "^4.0.2",
- "postcss-normalize-charset": "^4.0.1",
- "postcss-normalize-display-values": "^4.0.2",
- "postcss-normalize-positions": "^4.0.2",
- "postcss-normalize-repeat-style": "^4.0.2",
- "postcss-normalize-string": "^4.0.2",
- "postcss-normalize-timing-functions": "^4.0.2",
- "postcss-normalize-unicode": "^4.0.1",
- "postcss-normalize-url": "^4.0.1",
- "postcss-normalize-whitespace": "^4.0.2",
- "postcss-ordered-values": "^4.1.2",
- "postcss-reduce-initial": "^4.0.3",
- "postcss-reduce-transforms": "^4.0.2",
- "postcss-svgo": "^4.0.2",
- "postcss-unique-selectors": "^4.0.1"
- }
- },
- "cssnano-util-get-arguments": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
- "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8="
- },
- "cssnano-util-get-match": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
- "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0="
- },
- "cssnano-util-raw-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
- "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "cssnano-util-same-parent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
- "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="
- },
- "csso": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz",
- "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==",
- "requires": {
- "css-tree": "1.0.0-alpha.29"
- },
- "dependencies": {
- "css-tree": {
- "version": "1.0.0-alpha.29",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz",
- "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==",
- "requires": {
- "mdn-data": "~1.1.0",
- "source-map": "^0.5.3"
- }
- },
- "mdn-data": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz",
- "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA=="
- }
- }
- },
- "cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
- },
- "cssstyle": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
- "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
- "requires": {
- "cssom": "0.3.x"
- }
- },
- "cyclist": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
- "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA="
- },
- "damerau-levenshtein": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz",
- "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA=="
- },
- "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"
- }
- },
- "data-urls": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
- "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
- "requires": {
- "abab": "^2.0.0",
- "whatwg-mimetype": "^2.2.0",
- "whatwg-url": "^7.0.0"
- },
- "dependencies": {
- "whatwg-url": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
- "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
- "requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
- }
- }
- }
- },
- "date-now": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
- },
- "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="
- },
- "deep-eql": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
- "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
- "requires": {
- "type-detect": "0.1.1"
- }
- },
- "deep-equal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
- "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
- },
- "default-gateway": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
- "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
- "requires": {
- "execa": "^1.0.0",
- "ip-regex": "^2.1.0"
- }
- },
- "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"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- }
- }
- },
- "del": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
- "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
- "requires": {
- "globby": "^6.1.0",
- "is-path-cwd": "^1.0.0",
- "is-path-in-cwd": "^1.0.0",
- "p-map": "^1.1.1",
- "pify": "^3.0.0",
- "rimraf": "^2.2.8"
- },
- "dependencies": {
- "globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
- "requires": {
- "array-union": "^1.0.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "delimit-stream": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz",
- "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs="
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "des.js": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
- "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
- "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="
- },
- "detect-newline": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
- "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I="
- },
- "detect-node": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
- "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
- },
- "detect-port-alt": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
- "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
- "requires": {
- "address": "^1.0.1",
- "debug": "^2.6.0"
- },
- "dependencies": {
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "diff-sequences": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz",
- "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw=="
- },
- "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"
- }
- },
- "dir-glob": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
- "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
- "requires": {
- "arrify": "^1.0.1",
- "path-type": "^3.0.0"
- }
- },
- "dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
- },
- "dns-packet": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
- "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
- "requires": {
- "ip": "^1.1.0",
- "safe-buffer": "^5.0.1"
- }
- },
- "dns-txt": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
- "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
- "requires": {
- "buffer-indexof": "^1.0.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dom-converter": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
- "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
- "requires": {
- "utila": "~0.4"
- }
- },
- "dom-serializer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
- "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
- "requires": {
- "domelementtype": "^1.3.0",
- "entities": "^1.1.1"
- }
- },
- "domain-browser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
- "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
- },
- "domexception": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
- "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
- "requires": {
- "webidl-conversions": "^4.0.2"
- }
- },
- "domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
- "requires": {
- "domelementtype": "1"
- }
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "dot-prop": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
- "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
- "requires": {
- "is-obj": "^1.0.0"
- }
- },
- "dotenv": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz",
- "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w=="
- },
- "dotenv-expand": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz",
- "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU="
- },
- "duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
- },
- "duplexify": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
- "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
- "requires": {
- "end-of-stream": "^1.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0",
- "stream-shift": "^1.0.0"
- }
- },
- "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="
- },
- "electron-to-chromium": {
- "version": "1.3.200",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.200.tgz",
- "integrity": "sha512-PUurrpyDA74MuAjJRD+79ss5BqJlU3mdArRbuu4wO/dt6jc3Ic/6BDmFJxkdwbfq39cHf/XKm2vW98XSvut9Dg=="
- },
- "elliptic": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz",
- "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==",
- "requires": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
- },
- "emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
- "requires": {
- "iconv-lite": "~0.4.13"
- }
- },
- "end-of-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
- "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
- "requires": {
- "once": "^1.4.0"
- }
- },
- "enhanced-resolve": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
- "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
- "requires": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.4.0",
- "tapable": "^1.0.0"
- }
- },
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
- },
- "err-code": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
- "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA="
- },
- "errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "requires": {
- "prr": "~1.0.1"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es-abstract": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
- "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
- "requires": {
- "es-to-primitive": "^1.2.0",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "is-callable": "^1.1.4",
- "is-regex": "^1.0.4",
- "object-keys": "^1.0.12"
- }
- },
- "es-to-primitive": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
- "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "escodegen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz",
- "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==",
- "requires": {
- "esprima": "^3.1.3",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "optional": true
- }
- }
- },
- "eslint": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
- "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "ajv": "^6.9.1",
- "chalk": "^2.1.0",
- "cross-spawn": "^6.0.5",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "eslint-scope": "^4.0.3",
- "eslint-utils": "^1.3.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^5.0.1",
- "esquery": "^1.0.1",
- "esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob": "^7.1.2",
- "globals": "^11.7.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "inquirer": "^6.2.2",
- "js-yaml": "^3.13.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.11",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
- "path-is-inside": "^1.0.2",
- "progress": "^2.0.0",
- "regexpp": "^2.0.1",
- "semver": "^5.5.1",
- "strip-ansi": "^4.0.0",
- "strip-json-comments": "^2.0.1",
- "table": "^5.2.3",
- "text-table": "^0.2.0"
- },
- "dependencies": {
- "import-fresh": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
- "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==",
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "eslint-config-react-app": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz",
- "integrity": "sha512-ZsaoXUIGsK8FCi/x4lT2bZR5mMkL/Kgj+Lnw690rbvvUr/uiwgFiD8FcfAhkCycm7Xte6O5lYz4EqMx2vX7jgw==",
- "requires": {
- "confusing-browser-globals": "^1.0.7"
- }
- },
- "eslint-import-resolver-node": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
- "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
- "requires": {
- "debug": "^2.6.9",
- "resolve": "^1.5.0"
- },
- "dependencies": {
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "eslint-loader": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz",
- "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==",
- "requires": {
- "loader-fs-cache": "^1.0.0",
- "loader-utils": "^1.0.2",
- "object-assign": "^4.0.1",
- "object-hash": "^1.1.4",
- "rimraf": "^2.6.1"
- }
- },
- "eslint-module-utils": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz",
- "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==",
- "requires": {
- "debug": "^2.6.8",
- "pkg-dir": "^2.0.0"
- },
- "dependencies": {
- "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"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pkg-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
- "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
- "requires": {
- "find-up": "^2.1.0"
- }
- }
- }
- },
- "eslint-plugin-flowtype": {
- "version": "2.50.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz",
- "integrity": "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==",
- "requires": {
- "lodash": "^4.17.10"
- }
- },
- "eslint-plugin-import": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz",
- "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==",
- "requires": {
- "contains-path": "^0.1.0",
- "debug": "^2.6.9",
- "doctrine": "1.5.0",
- "eslint-import-resolver-node": "^0.3.2",
- "eslint-module-utils": "^2.3.0",
- "has": "^1.0.3",
- "lodash": "^4.17.11",
- "minimatch": "^3.0.4",
- "read-pkg-up": "^2.0.0",
- "resolve": "^1.9.0"
- },
- "dependencies": {
- "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"
- }
- },
- "doctrine": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
- "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
- "requires": {
- "esutils": "^2.0.2",
- "isarray": "^1.0.0"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
- "requires": {
- "pify": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
- }
- },
- "read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
- }
- }
- }
- },
- "eslint-plugin-jsx-a11y": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz",
- "integrity": "sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w==",
- "requires": {
- "aria-query": "^3.0.0",
- "array-includes": "^3.0.3",
- "ast-types-flow": "^0.0.7",
- "axobject-query": "^2.0.2",
- "damerau-levenshtein": "^1.0.4",
- "emoji-regex": "^7.0.2",
- "has": "^1.0.3",
- "jsx-ast-utils": "^2.0.1"
- }
- },
- "eslint-plugin-react": {
- "version": "7.12.4",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz",
- "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==",
- "requires": {
- "array-includes": "^3.0.3",
- "doctrine": "^2.1.0",
- "has": "^1.0.3",
- "jsx-ast-utils": "^2.0.1",
- "object.fromentries": "^2.0.0",
- "prop-types": "^15.6.2",
- "resolve": "^1.9.0"
- },
- "dependencies": {
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "requires": {
- "esutils": "^2.0.2"
- }
- }
- }
- },
- "eslint-plugin-react-hooks": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz",
- "integrity": "sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag=="
- },
- "eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
- "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz",
- "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==",
- "requires": {
- "eslint-visitor-keys": "^1.0.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
- "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
- },
- "espree": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
- "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
- "requires": {
- "acorn": "^6.0.7",
- "acorn-jsx": "^5.0.0",
- "eslint-visitor-keys": "^1.0.0"
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
- },
- "esquery": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
- "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
- "requires": {
- "estraverse": "^4.0.0"
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "requires": {
- "estraverse": "^4.1.0"
- }
- },
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "eventemitter3": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
- "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
- },
- "events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
- "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA=="
- },
- "eventsource": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
- "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
- "requires": {
- "original": "^1.0.0"
- }
- },
- "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"
- }
- },
- "exec-sh": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz",
- "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg=="
- },
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "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"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "expect": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz",
- "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==",
- "requires": {
- "@jest/types": "^24.8.0",
- "ansi-styles": "^3.2.0",
- "jest-get-type": "^24.8.0",
- "jest-matcher-utils": "^24.8.0",
- "jest-message-util": "^24.8.0",
- "jest-regex-util": "^24.3.0"
- }
- },
- "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"
- },
- "dependencies": {
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
- },
- "fast-glob": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
- "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
- "requires": {
- "@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.1.2",
- "glob-parent": "^3.1.0",
- "is-glob": "^4.0.0",
- "merge2": "^1.2.3",
- "micromatch": "^3.1.10"
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "faye-websocket": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
- "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "fb-watchman": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz",
- "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=",
- "requires": {
- "bser": "^2.0.0"
- }
- },
- "fbjs": {
- "version": "0.8.17",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
- "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
- "requires": {
- "core-js": "^1.0.0",
- "isomorphic-fetch": "^2.1.1",
- "loose-envify": "^1.0.0",
- "object-assign": "^4.1.0",
- "promise": "^7.1.1",
- "setimmediate": "^1.0.5",
- "ua-parser-js": "^0.7.18"
- },
- "dependencies": {
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "requires": {
- "asap": "~2.0.3"
- }
- }
- }
- },
- "figgy-pudding": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
- "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w=="
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
- "requires": {
- "flat-cache": "^2.0.1"
- }
- },
- "file-loader": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz",
- "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==",
- "requires": {
- "loader-utils": "^1.0.2",
- "schema-utils": "^1.0.0"
- }
- },
- "filesize": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
- "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg=="
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "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"
- },
- "dependencies": {
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
- }
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
- "requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- }
- },
- "flatted": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
- "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg=="
- },
- "flatten": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
- "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I="
- },
- "flush-write-stream": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
- "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
- "requires": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.3.6"
- }
- },
- "follow-redirects": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
- "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
- "requires": {
- "debug": "^3.2.6"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "fork-ts-checker-webpack-plugin": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.1.1.tgz",
- "integrity": "sha512-gqWAEMLlae/oeVnN6RWCAhesOJMswAN1MaKNqhhjXHV5O0/rTUjWI4UbgQHdlrVbCnb+xLotXmJbBlC66QmpFw==",
- "requires": {
- "babel-code-frame": "^6.22.0",
- "chalk": "^2.4.1",
- "chokidar": "^2.0.4",
- "micromatch": "^3.1.10",
- "minimatch": "^3.0.4",
- "semver": "^5.6.0",
- "tapable": "^1.0.0",
- "worker-rpc": "^0.1.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "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.1.2",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
- "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "from2": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0"
- }
- },
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-write-stream-atomic": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
- "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "iferr": "^0.1.5",
- "imurmurhash": "^0.1.4",
- "readable-stream": "1 || 2"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.6.tgz",
- "integrity": "sha512-vfmKZp3XPM36DNF0qhW+Cdxk7xm7gTEHY1clv1Xq1arwRQuKZgAhw+NZNWbJBtuaNxzNXwhfdPYRrvIbjfS33A==",
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
- },
- "get-own-enumerable-property-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz",
- "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg=="
- },
- "get-prototype-of": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/get-prototype-of/-/get-prototype-of-0.0.0.tgz",
- "integrity": "sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ="
- },
- "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"
- }
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
- },
- "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"
- }
- },
- "glob": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- },
- "dependencies": {
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "requires": {
- "is-extglob": "^2.1.0"
- }
- }
- }
- },
- "glob-to-regexp": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
- "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- }
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
- },
- "globby": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
- "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
- "requires": {
- "array-union": "^1.0.1",
- "dir-glob": "2.0.0",
- "fast-glob": "^2.0.2",
- "glob": "^7.1.2",
- "ignore": "^3.3.5",
- "pify": "^3.0.0",
- "slash": "^1.0.0"
- },
- "dependencies": {
- "ignore": {
- "version": "3.3.10",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
- "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
- }
- }
- },
- "graceful-fs": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
- "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg=="
- },
- "growly": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
- "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
- },
- "gud": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
- "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
- },
- "gzip-size": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz",
- "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==",
- "requires": {
- "duplexer": "^0.1.1",
- "pify": "^3.0.0"
- }
- },
- "handle-thing": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
- "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ=="
- },
- "handlebars": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
- "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
- "requires": {
- "neo-async": "^2.6.0",
- "optimist": "^0.6.1",
- "source-map": "^0.6.1",
- "uglify-js": "^3.1.4"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "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.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- }
- },
- "harmony-reflect": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz",
- "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA=="
- },
- "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-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- }
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
- "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "hash-base": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
- "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "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"
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
- },
- "hex-color-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
- "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
- },
- "history": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
- "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
- "requires": {
- "@babel/runtime": "^7.1.2",
- "loose-envify": "^1.2.0",
- "resolve-pathname": "^3.0.0",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0",
- "value-equal": "^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"
- }
- },
- "hoist-non-react-statics": {
- "version": "2.5.5",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
- "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
- },
- "hosted-git-info": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
- "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="
- },
- "hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "requires": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "hsl-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
- "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
- },
- "hsla-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
- "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
- },
- "html-comment-regex": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
- "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ=="
- },
- "html-encoding-sniffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
- "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
- "requires": {
- "whatwg-encoding": "^1.0.1"
- }
- },
- "html-entities": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
- "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8="
- },
- "html-minifier": {
- "version": "3.5.21",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
- "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
- "requires": {
- "camel-case": "3.0.x",
- "clean-css": "4.2.x",
- "commander": "2.17.x",
- "he": "1.2.x",
- "param-case": "2.1.x",
- "relateurl": "0.2.x",
- "uglify-js": "3.4.x"
- },
- "dependencies": {
- "commander": {
- "version": "2.17.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
- "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
- }
- }
- },
- "html-webpack-plugin": {
- "version": "4.0.0-beta.5",
- "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz",
- "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==",
- "requires": {
- "html-minifier": "^3.5.20",
- "loader-utils": "^1.1.0",
- "lodash": "^4.17.11",
- "pretty-error": "^2.1.1",
- "tapable": "^1.1.0",
- "util.promisify": "1.0.0"
- }
- },
- "htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
- "requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
- "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
- },
- "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-parser-js": {
- "version": "0.4.10",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
- "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q="
- },
- "http-proxy": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
- "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
- "requires": {
- "eventemitter3": "^3.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
- },
- "http-proxy-middleware": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
- "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
- "requires": {
- "http-proxy": "^1.17.0",
- "is-glob": "^4.0.0",
- "lodash": "^4.17.11",
- "micromatch": "^3.1.10"
- }
- },
- "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"
- }
- },
- "https-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
- "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
- },
- "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"
- }
- },
- "icss-replace-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
- "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0="
- },
- "icss-utils": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
- "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
- "requires": {
- "postcss": "^7.0.14"
- }
- },
- "identity-obj-proxy": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
- "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=",
- "requires": {
- "harmony-reflect": "^1.4.6"
- }
- },
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
- },
- "iferr": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
- "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
- },
- "immer": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz",
- "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg=="
- },
- "import-cwd": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
- "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
- "requires": {
- "import-from": "^2.1.0"
- }
- },
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "import-from": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
- "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
- "requires": {
- "resolve-from": "^3.0.0"
- }
- },
- "import-local": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
- "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
- "requires": {
- "pkg-dir": "^3.0.0",
- "resolve-cwd": "^2.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "inquirer": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz",
- "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==",
- "requires": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.12",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "internal-ip": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
- "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
- "requires": {
- "default-gateway": "^4.2.0",
- "ipaddr.js": "^1.9.0"
- }
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "invert-kv": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
- "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
- },
- "ip-regex": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
- "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
- },
- "ipaddr.js": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
- "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
- },
- "ipld-dag-cbor": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/ipld-dag-cbor/-/ipld-dag-cbor-0.15.0.tgz",
- "integrity": "sha512-wc9nrDtV4Le76UUhG4LXX57NVi5d7JS2kLid2nOYZAcr0SFhiXZL2ZyV3bfmNohO50KvgPEessSaBBSm9bflGA==",
- "requires": {
- "borc": "^2.1.0",
- "cids": "~0.7.0",
- "is-circular": "^1.0.2",
- "multicodec": "~0.5.0",
- "multihashing-async": "~0.7.0"
- }
- },
- "is-absolute-url": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
- "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "requires": {
- "binary-extensions": "^1.0.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "is-callable": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
- "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA=="
- },
- "is-capitalized": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-capitalized/-/is-capitalized-1.0.0.tgz",
- "integrity": "sha1-TIRktNkdPk7rRIid0s2PGwrEwTY="
- },
- "is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "requires": {
- "ci-info": "^2.0.0"
- }
- },
- "is-circular": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-circular/-/is-circular-1.0.2.tgz",
- "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA=="
- },
- "is-class": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.4.tgz",
- "integrity": "sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY="
- },
- "is-color-stop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
- "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
- "requires": {
- "css-color-names": "^0.0.4",
- "hex-color-regex": "^1.1.0",
- "hsl-regex": "^1.0.0",
- "hsla-regex": "^1.0.0",
- "rgb-regex": "^1.0.1",
- "rgba-regex": "^1.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "is-date-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
- "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
- },
- "is-path-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
- },
- "is-path-in-cwd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
- "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
- "requires": {
- "is-path-inside": "^1.0.0"
- }
- },
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "^1.0.1"
- }
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "is-regex": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
- "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
- "requires": {
- "has": "^1.0.1"
- }
- },
- "is-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
- "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
- },
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
- },
- "is-root": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz",
- "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-svg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
- "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
- "requires": {
- "html-comment-regex": "^1.1.0"
- }
- },
- "is-symbol": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
- "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
- "requires": {
- "has-symbols": "^1.0.0"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
- },
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "iso-url": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.6.tgz",
- "integrity": "sha512-YQO7+aIe6l1aSJUKOx+Vrv08DlhZeLFIVfehG2L29KLSEb9RszqPXilxJRVpp57px36BddKR5ZsebacO5qG0tg=="
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
- },
- "isomorphic-fetch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
- "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
- "requires": {
- "node-fetch": "^2.6.7",
- "whatwg-fetch": ">=0.10.0"
- }
- },
- "isomorphic-ws": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
- "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "istanbul-lib-coverage": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
- "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA=="
- },
- "istanbul-lib-instrument": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
- "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
- "requires": {
- "@babel/generator": "^7.4.0",
- "@babel/parser": "^7.4.3",
- "@babel/template": "^7.4.0",
- "@babel/traverse": "^7.4.3",
- "@babel/types": "^7.4.0",
- "istanbul-lib-coverage": "^2.0.5",
- "semver": "^6.0.0"
- }
- },
- "istanbul-lib-report": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
- "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
- "requires": {
- "istanbul-lib-coverage": "^2.0.5",
- "make-dir": "^2.1.0",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "istanbul-lib-source-maps": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
- "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
- "requires": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^2.0.5",
- "make-dir": "^2.1.0",
- "rimraf": "^2.6.3",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "istanbul-reports": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz",
- "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==",
- "requires": {
- "handlebars": "^4.1.2"
- }
- },
- "iterable-backoff": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/iterable-backoff/-/iterable-backoff-0.1.0.tgz",
- "integrity": "sha512-7FeWGM9u6wB2a3x5cv8zHnuAYu6WYUYtayYcNXJfe17zL6NjR8OfalqmXNBm3AeTADHgLkByhnIrzm0DU2qFCA=="
- },
- "jest": {
- "version": "24.7.1",
- "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz",
- "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==",
- "requires": {
- "import-local": "^2.0.0",
- "jest-cli": "^24.7.1"
- },
- "dependencies": {
- "jest-cli": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz",
- "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==",
- "requires": {
- "@jest/core": "^24.8.0",
- "@jest/test-result": "^24.8.0",
- "@jest/types": "^24.8.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "import-local": "^2.0.0",
- "is-ci": "^2.0.0",
- "jest-config": "^24.8.0",
- "jest-util": "^24.8.0",
- "jest-validate": "^24.8.0",
- "prompts": "^2.0.1",
- "realpath-native": "^1.1.0",
- "yargs": "^12.0.2"
- }
- }
- }
- },
- "jest-changed-files": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz",
- "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==",
- "requires": {
- "@jest/types": "^24.8.0",
- "execa": "^1.0.0",
- "throat": "^4.0.0"
- }
- },
- "jest-config": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz",
- "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==",
- "requires": {
- "@babel/core": "^7.1.0",
- "@jest/test-sequencer": "^24.8.0",
- "@jest/types": "^24.8.0",
- "babel-jest": "^24.8.0",
- "chalk": "^2.0.1",
- "glob": "^7.1.1",
- "jest-environment-jsdom": "^24.8.0",
- "jest-environment-node": "^24.8.0",
- "jest-get-type": "^24.8.0",
- "jest-jasmine2": "^24.8.0",
- "jest-regex-util": "^24.3.0",
- "jest-resolve": "^24.8.0",
- "jest-util": "^24.8.0",
- "jest-validate": "^24.8.0",
- "micromatch": "^3.1.10",
- "pretty-format": "^24.8.0",
- "realpath-native": "^1.1.0"
- },
- "dependencies": {
- "jest-resolve": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz",
- "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
- }
- }
- }
- },
- "jest-diff": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz",
- "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==",
- "requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.3.0",
- "jest-get-type": "^24.8.0",
- "pretty-format": "^24.8.0"
- }
- },
- "jest-docblock": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz",
- "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==",
- "requires": {
- "detect-newline": "^2.1.0"
- }
- },
- "jest-each": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz",
- "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==",
- "requires": {
- "@jest/types": "^24.8.0",
- "chalk": "^2.0.1",
- "jest-get-type": "^24.8.0",
- "jest-util": "^24.8.0",
- "pretty-format": "^24.8.0"
- }
- },
- "jest-environment-jsdom": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz",
- "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==",
- "requires": {
- "@jest/environment": "^24.8.0",
- "@jest/fake-timers": "^24.8.0",
- "@jest/types": "^24.8.0",
- "jest-mock": "^24.8.0",
- "jest-util": "^24.8.0",
- "jsdom": "^11.5.1"
- }
- },
- "jest-environment-jsdom-fourteen": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-0.1.0.tgz",
- "integrity": "sha512-4vtoRMg7jAstitRzL4nbw83VmGH8Rs13wrND3Ud2o1fczDhMUF32iIrNKwYGgeOPUdfvZU4oy8Bbv+ni1fgVCA==",
- "requires": {
- "jest-mock": "^24.5.0",
- "jest-util": "^24.5.0",
- "jsdom": "^14.0.0"
- },
- "dependencies": {
- "jsdom": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz",
- "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==",
- "requires": {
- "abab": "^2.0.0",
- "acorn": "^6.0.4",
- "acorn-globals": "^4.3.0",
- "array-equal": "^1.0.0",
- "cssom": "^0.3.4",
- "cssstyle": "^1.1.1",
- "data-urls": "^1.1.0",
- "domexception": "^1.0.1",
- "escodegen": "^1.11.0",
- "html-encoding-sniffer": "^1.0.2",
- "nwsapi": "^2.1.3",
- "parse5": "5.1.0",
- "pn": "^1.1.0",
- "request": "^2.88.0",
- "request-promise-native": "^1.0.5",
- "saxes": "^3.1.9",
- "symbol-tree": "^3.2.2",
- "tough-cookie": "^2.5.0",
- "w3c-hr-time": "^1.0.1",
- "w3c-xmlserializer": "^1.1.2",
- "webidl-conversions": "^4.0.2",
- "whatwg-encoding": "^1.0.5",
- "whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^7.0.0",
- "ws": "^6.1.2",
- "xml-name-validator": "^3.0.0"
- }
- },
- "parse5": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
- "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
- },
- "whatwg-url": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
- "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
- "requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
- }
- }
- }
- },
- "jest-environment-node": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz",
- "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==",
- "requires": {
- "@jest/environment": "^24.8.0",
- "@jest/fake-timers": "^24.8.0",
- "@jest/types": "^24.8.0",
- "jest-mock": "^24.8.0",
- "jest-util": "^24.8.0"
- }
- },
- "jest-get-type": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz",
- "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ=="
- },
- "jest-haste-map": {
- "version": "24.8.1",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz",
- "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==",
- "requires": {
- "@jest/types": "^24.8.0",
- "anymatch": "^2.0.0",
- "fb-watchman": "^2.0.0",
- "fsevents": "^1.2.7",
- "graceful-fs": "^4.1.15",
- "invariant": "^2.2.4",
- "jest-serializer": "^24.4.0",
- "jest-util": "^24.8.0",
- "jest-worker": "^24.6.0",
- "micromatch": "^3.1.10",
- "sane": "^4.0.3",
- "walker": "^1.0.7"
- },
- "dependencies": {
- "fsevents": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
- "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
- "optional": true,
- "requires": {
- "nan": "^2.12.1",
- "node-pre-gyp": "^0.12.0"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "optional": true
- },
- "aproba": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- "optional": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chownr": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "optional": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "debug": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.3",
- "bundled": true,
- "optional": true
- },
- "fs-minipass": {
- "version": "1.2.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "glob": {
- "version": "7.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "bundled": true,
- "optional": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-walk": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true,
- "optional": true
- },
- "ini": {
- "version": "1.3.5",
- "bundled": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "optional": true
- },
- "minipass": {
- "version": "2.3.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.2.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.1.1",
- "bundled": true,
- "optional": true
- },
- "needle": {
- "version": "2.3.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "debug": "^4.1.0",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- }
- },
- "node-pre-gyp": {
- "version": "0.12.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "npm-bundled": {
- "version": "1.0.6",
- "bundled": true,
- "optional": true
- },
- "npm-packlist": {
- "version": "1.4.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "rimraf": {
- "version": "2.6.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "bundled": true,
- "optional": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "bundled": true,
- "optional": true
- },
- "sax": {
- "version": "1.2.4",
- "bundled": true,
- "optional": true
- },
- "semver": {
- "version": "5.7.0",
- "bundled": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "optional": true
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "tar": {
- "version": "4.4.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.3.4",
- "minizlib": "^1.1.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.2"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "wide-align": {
- "version": "1.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "yallist": {
- "version": "3.0.3",
- "bundled": true,
- "optional": true
- }
- }
- }
- }
- },
- "jest-jasmine2": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz",
- "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==",
- "requires": {
- "@babel/traverse": "^7.1.0",
- "@jest/environment": "^24.8.0",
- "@jest/test-result": "^24.8.0",
- "@jest/types": "^24.8.0",
- "chalk": "^2.0.1",
- "co": "^4.6.0",
- "expect": "^24.8.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^24.8.0",
- "jest-matcher-utils": "^24.8.0",
- "jest-message-util": "^24.8.0",
- "jest-runtime": "^24.8.0",
- "jest-snapshot": "^24.8.0",
- "jest-util": "^24.8.0",
- "pretty-format": "^24.8.0",
- "throat": "^4.0.0"
- }
- },
- "jest-leak-detector": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz",
- "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==",
- "requires": {
- "pretty-format": "^24.8.0"
- }
- },
- "jest-matcher-utils": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz",
- "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==",
- "requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^24.8.0",
- "jest-get-type": "^24.8.0",
- "pretty-format": "^24.8.0"
- }
- },
- "jest-message-util": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz",
- "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.8.0",
- "@jest/types": "^24.8.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "jest-mock": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz",
- "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==",
- "requires": {
- "@jest/types": "^24.8.0"
- }
- },
- "jest-pnp-resolver": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz",
- "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ=="
- },
- "jest-regex-util": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz",
- "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg=="
- },
- "jest-resolve": {
- "version": "24.7.1",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz",
- "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==",
- "requires": {
- "@jest/types": "^24.7.0",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
- }
- },
- "jest-resolve-dependencies": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz",
- "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "jest-regex-util": "^24.3.0",
- "jest-snapshot": "^24.8.0"
- }
- },
- "jest-runner": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz",
- "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==",
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/environment": "^24.8.0",
- "@jest/test-result": "^24.8.0",
- "@jest/types": "^24.8.0",
- "chalk": "^2.4.2",
- "exit": "^0.1.2",
- "graceful-fs": "^4.1.15",
- "jest-config": "^24.8.0",
- "jest-docblock": "^24.3.0",
- "jest-haste-map": "^24.8.0",
- "jest-jasmine2": "^24.8.0",
- "jest-leak-detector": "^24.8.0",
- "jest-message-util": "^24.8.0",
- "jest-resolve": "^24.8.0",
- "jest-runtime": "^24.8.0",
- "jest-util": "^24.8.0",
- "jest-worker": "^24.6.0",
- "source-map-support": "^0.5.6",
- "throat": "^4.0.0"
- },
- "dependencies": {
- "jest-resolve": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz",
- "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
- }
- }
- }
- },
- "jest-runtime": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz",
- "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==",
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/environment": "^24.8.0",
- "@jest/source-map": "^24.3.0",
- "@jest/transform": "^24.8.0",
- "@jest/types": "^24.8.0",
- "@types/yargs": "^12.0.2",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.1.15",
- "jest-config": "^24.8.0",
- "jest-haste-map": "^24.8.0",
- "jest-message-util": "^24.8.0",
- "jest-mock": "^24.8.0",
- "jest-regex-util": "^24.3.0",
- "jest-resolve": "^24.8.0",
- "jest-snapshot": "^24.8.0",
- "jest-util": "^24.8.0",
- "jest-validate": "^24.8.0",
- "realpath-native": "^1.1.0",
- "slash": "^2.0.0",
- "strip-bom": "^3.0.0",
- "yargs": "^12.0.2"
- },
- "dependencies": {
- "jest-resolve": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz",
- "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
- }
- }
- }
- },
- "jest-serializer": {
- "version": "24.4.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz",
- "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q=="
- },
- "jest-snapshot": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz",
- "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==",
- "requires": {
- "@babel/types": "^7.0.0",
- "@jest/types": "^24.8.0",
- "chalk": "^2.0.1",
- "expect": "^24.8.0",
- "jest-diff": "^24.8.0",
- "jest-matcher-utils": "^24.8.0",
- "jest-message-util": "^24.8.0",
- "jest-resolve": "^24.8.0",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^24.8.0",
- "semver": "^5.5.0"
- },
- "dependencies": {
- "jest-resolve": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz",
- "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
- }
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "jest-util": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz",
- "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==",
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/fake-timers": "^24.8.0",
- "@jest/source-map": "^24.3.0",
- "@jest/test-result": "^24.8.0",
- "@jest/types": "^24.8.0",
- "callsites": "^3.0.0",
- "chalk": "^2.0.1",
- "graceful-fs": "^4.1.15",
- "is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "jest-validate": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz",
- "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==",
- "requires": {
- "@jest/types": "^24.8.0",
- "camelcase": "^5.0.0",
- "chalk": "^2.0.1",
- "jest-get-type": "^24.8.0",
- "leven": "^2.1.0",
- "pretty-format": "^24.8.0"
- }
- },
- "jest-watch-typeahead": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.3.0.tgz",
- "integrity": "sha512-+uOtlppt9ysST6k6ZTqsPI0WNz2HLa8bowiZylZoQCQaAVn7XsVmHhZREkz73FhKelrFrpne4hQQjdq42nFEmA==",
- "requires": {
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.4.1",
- "jest-watcher": "^24.3.0",
- "slash": "^2.0.0",
- "string-length": "^2.0.0",
- "strip-ansi": "^5.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "jest-watcher": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz",
- "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==",
- "requires": {
- "@jest/test-result": "^24.8.0",
- "@jest/types": "^24.8.0",
- "@types/yargs": "^12.0.9",
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.1",
- "jest-util": "^24.8.0",
- "string-length": "^2.0.0"
- }
- },
- "jest-worker": {
- "version": "24.6.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz",
- "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==",
- "requires": {
- "merge-stream": "^1.0.1",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "js-levenshtein": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
- "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="
- },
- "js-sha3": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
- "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
- "jsdom": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
- "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
- "requires": {
- "abab": "^2.0.0",
- "acorn": "^5.5.3",
- "acorn-globals": "^4.1.0",
- "array-equal": "^1.0.0",
- "cssom": ">= 0.3.2 < 0.4.0",
- "cssstyle": "^1.0.0",
- "data-urls": "^1.0.0",
- "domexception": "^1.0.1",
- "escodegen": "^1.9.1",
- "html-encoding-sniffer": "^1.0.2",
- "left-pad": "^1.3.0",
- "nwsapi": "^2.0.7",
- "parse5": "4.0.0",
- "pn": "^1.1.0",
- "request": "^2.87.0",
- "request-promise-native": "^1.0.5",
- "sax": "^1.2.4",
- "symbol-tree": "^3.2.2",
- "tough-cookie": "^2.3.4",
- "w3c-hr-time": "^1.0.1",
- "webidl-conversions": "^4.0.2",
- "whatwg-encoding": "^1.0.3",
- "whatwg-mimetype": "^2.1.0",
- "whatwg-url": "^6.4.1",
- "ws": "^5.2.0",
- "xml-name-validator": "^3.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "5.7.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
- "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="
- },
- "ws": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
- "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- }
- }
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
- },
- "json-rpc-peer": {
- "version": "0.15.5",
- "resolved": "https://registry.npmjs.org/json-rpc-peer/-/json-rpc-peer-0.15.5.tgz",
- "integrity": "sha512-jZUNbRmcMXTpAnp1WGY9o85IfdGLKp75lBFYOIgpKOT9ZwKDHQOc3UmxOJUUg1bBfI7D1dltR3FSA6D0ZpPMpw==",
- "requires": {
- "@babel/runtime": "7.0.0-rc.1",
- "json-rpc-protocol": "^0.12.0",
- "lodash": "^4.17.4"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.0.0-rc.1",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-rc.1.tgz",
- "integrity": "sha512-Nifv2kwP/nwR39cAOasNxzjYfpeuf/ZbZNtQz5eYxWTC9yHARU9wItFnAwz1GTZ62MU+AtSjzZPMbLK5Q9hmbg==",
- "requires": {
- "regenerator-runtime": "^0.12.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
- "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
- }
- }
- },
- "json-rpc-protocol": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/json-rpc-protocol/-/json-rpc-protocol-0.12.0.tgz",
- "integrity": "sha512-zev0tw+eiKgMkUbP+JWfVfWiYxFz9IxUhThsrAfTzgfQI7slwaeH1/9esvR/E/Yt8x+kVQY67rSh1ap9BQBvog==",
- "requires": {
- "make-error": "^1.3.0"
- }
- },
- "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-stable-stringify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "requires": {
- "jsonify": "~0.0.0"
- }
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "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="
- },
- "json-text-sequence": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz",
- "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=",
- "requires": {
- "delimit-stream": "0.1.0"
- }
- },
- "json3": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
- "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
- },
- "json5": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
- "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "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"
- }
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
- },
- "jsonrpc-websocket-client": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsonrpc-websocket-client/-/jsonrpc-websocket-client-0.5.0.tgz",
- "integrity": "sha512-kZtVAANjBpFjzZrZQm3qenOJ1lQfhemHKto+ZH2ubn58C8+f9B3XJPWKPMt4AG1jzh1/08CzsKMhEfuMmWyuvQ==",
- "requires": {
- "isomorphic-ws": "^4.0.1",
- "iterable-backoff": "^0.1.0",
- "json-rpc-peer": "^0.15.0",
- "lodash": "^4.17.4",
- "make-error": "^1.3.0",
- "promise-toolbox": "^0.12.1",
- "ws": "^6.0.0"
- }
- },
- "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"
- }
- },
- "jsx-ast-utils": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz",
- "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==",
- "requires": {
- "array-includes": "^3.0.3",
- "object.assign": "^4.1.0"
- }
- },
- "keypather": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/keypather/-/keypather-1.10.2.tgz",
- "integrity": "sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ=",
- "requires": {
- "101": "^1.0.0"
- }
- },
- "killable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
- "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- },
- "kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
- },
- "last-call-webpack-plugin": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
- "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
- "requires": {
- "lodash": "^4.17.5",
- "webpack-sources": "^1.1.0"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
- },
- "lcid": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
- "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
- "requires": {
- "invert-kv": "^2.0.0"
- }
- },
- "left-pad": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
- "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA=="
- },
- "leven": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
- "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA="
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "loader-fs-cache": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz",
- "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==",
- "requires": {
- "find-cache-dir": "^0.1.1",
- "mkdirp": "0.5.1"
- },
- "dependencies": {
- "find-cache-dir": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
- "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
- "requires": {
- "commondir": "^1.0.1",
- "mkdirp": "^0.5.1",
- "pkg-dir": "^1.0.0"
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "pkg-dir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
- "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
- "requires": {
- "find-up": "^1.0.0"
- }
- }
- }
- },
- "loader-runner": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
- "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="
- },
- "loader-utils": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^2.0.0",
- "json5": "^1.0.1"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
- "requires": {
- "minimist": "^1.2.0"
- }
- }
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
- },
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
- },
- "lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
- },
- "lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
- },
- "lodash.tail": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
- "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ="
- },
- "lodash.template": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
- "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
- "requires": {
- "lodash._reinterpolate": "^3.0.0",
- "lodash.templatesettings": "^4.0.0"
- }
- },
- "lodash.templatesettings": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
- "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
- "requires": {
- "lodash._reinterpolate": "^3.0.0"
- }
- },
- "lodash.unescape": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz",
- "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw="
- },
- "lodash.uniq": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
- "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
- },
- "loglevel": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz",
- "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA=="
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
- "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "make-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
- "requires": {
- "pify": "^4.0.1",
- "semver": "^5.6.0"
- },
- "dependencies": {
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "make-error": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
- "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g=="
- },
- "makeerror": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
- "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
- "requires": {
- "tmpl": "1.0.x"
- }
- },
- "mamacro": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
- "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA=="
- },
- "map-age-cleaner": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
- "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
- "requires": {
- "p-defer": "^1.0.0"
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "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"
- }
- },
- "mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
- },
- "mem": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
- "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
- "requires": {
- "map-age-cleaner": "^0.1.1",
- "mimic-fn": "^2.0.0",
- "p-is-promise": "^2.0.0"
- },
- "dependencies": {
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- }
- }
- },
- "memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- },
- "merge-deep": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz",
- "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==",
- "requires": {
- "arr-union": "^3.1.0",
- "clone-deep": "^0.2.4",
- "kind-of": "^3.0.2"
- }
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "merge-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
- "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
- "requires": {
- "readable-stream": "^2.0.1"
- }
- },
- "merge2": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz",
- "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA=="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "microevent.ts": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz",
- "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g=="
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- }
- }
- },
- "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": "2.4.4",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
- "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="
- },
- "mime-db": {
- "version": "1.40.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
- "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
- },
- "mime-types": {
- "version": "2.1.24",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
- "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
- "requires": {
- "mime-db": "1.40.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
- "mini-create-react-context": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz",
- "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==",
- "requires": {
- "@babel/runtime": "^7.4.0",
- "gud": "^1.0.0",
- "tiny-warning": "^1.0.2"
- }
- },
- "mini-css-extract-plugin": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz",
- "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==",
- "requires": {
- "loader-utils": "^1.1.0",
- "schema-utils": "^1.0.0",
- "webpack-sources": "^1.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="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "mississippi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
- "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
- "requires": {
- "concat-stream": "^1.5.0",
- "duplexify": "^3.4.2",
- "end-of-stream": "^1.1.0",
- "flush-write-stream": "^1.0.0",
- "from2": "^2.1.0",
- "parallel-transform": "^1.1.0",
- "pump": "^3.0.0",
- "pumpify": "^1.3.3",
- "stream-each": "^1.1.0",
- "through2": "^2.0.0"
- }
- },
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mixin-object": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
- "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
- "requires": {
- "for-in": "^0.1.3",
- "is-extendable": "^0.1.1"
- },
- "dependencies": {
- "for-in": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
- "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE="
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "move-concurrently": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
- "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
- "requires": {
- "aproba": "^1.1.1",
- "copy-concurrently": "^1.0.0",
- "fs-write-stream-atomic": "^1.0.8",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.5.4",
- "run-queue": "^1.0.3"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "multibase": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.0.tgz",
- "integrity": "sha512-R9bNLQhbD7MsitPm1NeY7w9sDgu6d7cuj25snAWH7k5PSNPSwIQQBpcpj8jx1W96dLbdigZqmUWOdQRMnAmgjA==",
- "requires": {
- "base-x": "3.0.4"
- }
- },
- "multicast-dns": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
- "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
- "requires": {
- "dns-packet": "^1.3.1",
- "thunky": "^1.0.2"
- }
- },
- "multicast-dns-service-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
- "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
- },
- "multicodec": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.5.tgz",
- "integrity": "sha512-1kOifvwAqp9IdiiTKmpK2tS+LY6GHZdKpk3S2EvW4T32vlwDyA3hJoZtGauzqdedUPVNGChnTksEotVOCVlC+Q==",
- "requires": {
- "varint": "^5.0.0"
- }
- },
- "multihashes": {
- "version": "0.4.15",
- "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.15.tgz",
- "integrity": "sha512-G/Smj1GWqw1RQP3dRuRRPe3oyLqvPqUaEDIaoi7JF7Loxl4WAWvhJNk84oyDEodSucv0MmSW/ZT0RKUrsIFD3g==",
- "requires": {
- "bs58": "^4.0.1",
- "varint": "^5.0.0"
- }
- },
- "multihashing-async": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-0.7.0.tgz",
- "integrity": "sha512-SCbfl3f+DzJh+/5piukga9ofIOxwfT05t8R4jfzZIJ88YE9zU9+l3K2X+XB19MYyxqvyK9UJRNWbmQpZqQlbRA==",
- "requires": {
- "blakejs": "^1.1.0",
- "buffer": "^5.2.1",
- "err-code": "^1.1.2",
- "js-sha3": "~0.8.0",
- "multihashes": "~0.4.13",
- "murmurhash3js-revisited": "^3.0.0"
- },
- "dependencies": {
- "buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
- "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- }
- }
- },
- "murmurhash3js-revisited": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz",
- "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g=="
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
- "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
- "optional": true
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- }
- }
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
- },
- "neo-async": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
- "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
- },
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
- },
- "no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
- "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
- "requires": {
- "lower-case": "^1.1.1"
- }
- },
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
- "requires": {
- "encoding": "^0.1.11",
- "is-stream": "^1.0.1"
- }
- },
- "node-forge": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
- "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ=="
- },
- "node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
- },
- "node-libs-browser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
- "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
- "requires": {
- "assert": "^1.1.1",
- "browserify-zlib": "^0.2.0",
- "buffer": "^4.3.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "^1.0.0",
- "crypto-browserify": "^3.11.0",
- "domain-browser": "^1.1.1",
- "events": "^3.0.0",
- "https-browserify": "^1.0.0",
- "os-browserify": "^0.3.0",
- "path-browserify": "0.0.1",
- "process": "^0.11.10",
- "punycode": "^1.2.4",
- "querystring-es3": "^0.2.0",
- "readable-stream": "^2.3.3",
- "stream-browserify": "^2.0.1",
- "stream-http": "^2.7.2",
- "string_decoder": "^1.0.0",
- "timers-browserify": "^2.0.4",
- "tty-browserify": "0.0.0",
- "url": "^0.11.0",
- "util": "^0.11.0",
- "vm-browserify": "^1.0.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
- }
- }
- },
- "node-modules-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
- "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
- },
- "node-notifier": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz",
- "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==",
- "requires": {
- "growly": "^1.3.0",
- "is-wsl": "^1.1.0",
- "semver": "^5.5.0",
- "shellwords": "^0.1.1",
- "which": "^1.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "node-releases": {
- "version": "1.1.26",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz",
- "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==",
- "requires": {
- "semver": "^5.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- }
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
- },
- "normalize-url": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
- "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "requires": {
- "boolbase": "~1.0.0"
- }
- },
- "num2fraction": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
- "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "nwsapi": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz",
- "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw=="
- },
- "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-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "object-hash": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
- "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA=="
- },
- "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-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "object.fromentries": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz",
- "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==",
- "requires": {
- "define-properties": "^1.1.2",
- "es-abstract": "^1.11.0",
- "function-bind": "^1.1.1",
- "has": "^1.0.1"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
- "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
- "requires": {
- "define-properties": "^1.1.2",
- "es-abstract": "^1.5.1"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "object.values": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz",
- "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.12.0",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
- },
- "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"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "opn": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
- "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==",
- "requires": {
- "is-wsl": "^1.1.0"
- }
- },
- "optimist": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
- "requires": {
- "minimist": "~0.0.1",
- "wordwrap": "~0.0.2"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
- },
- "wordwrap": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
- }
- }
- },
- "optimize-css-assets-webpack-plugin": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz",
- "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==",
- "requires": {
- "cssnano": "^4.1.0",
- "last-call-webpack-plugin": "^3.0.0"
- }
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.4",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "wordwrap": "~1.0.0"
- }
- },
- "original": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
- "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
- "requires": {
- "url-parse": "^1.4.3"
- }
- },
- "os-browserify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
- "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
- },
- "os-locale": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
- "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
- "requires": {
- "execa": "^1.0.0",
- "lcid": "^2.0.0",
- "mem": "^4.0.0"
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "p-defer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
- },
- "p-each-series": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
- "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
- "requires": {
- "p-reduce": "^1.0.0"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
- "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
- },
- "p-limit": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
- "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "p-map": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
- "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA=="
- },
- "p-reduce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
- "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo="
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
- },
- "pako": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
- "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw=="
- },
- "parallel-transform": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
- "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
- "requires": {
- "cyclist": "~0.2.2",
- "inherits": "^2.0.3",
- "readable-stream": "^2.1.5"
- }
- },
- "param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
- "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
- "requires": {
- "no-case": "^2.2.0"
- }
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "requires": {
- "callsites": "^3.0.0"
- },
- "dependencies": {
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- }
- }
- },
- "parse-asn1": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz",
- "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==",
- "requires": {
- "asn1.js": "^4.0.0",
- "browserify-aes": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "parse5": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
- "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA=="
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
- },
- "path-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
- "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
- },
- "path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "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="
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pbkdf2": {
- "version": "3.0.17",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
- "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
- "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="
- },
- "picocolors": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
- "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pirates": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
- "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
- "requires": {
- "node-modules-regexp": "^1.0.0"
- }
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "requires": {
- "find-up": "^3.0.0"
- }
- },
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "requires": {
- "find-up": "^2.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- }
- }
- },
- "pn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
- "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
- },
- "pnp-webpack-plugin": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz",
- "integrity": "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==",
- "requires": {
- "ts-pnp": "^1.0.0"
- }
- },
- "portfinder": {
- "version": "1.0.21",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz",
- "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==",
- "requires": {
- "async": "^1.5.2",
- "debug": "^2.2.0",
- "mkdirp": "0.5.x"
- },
- "dependencies": {
- "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"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
- },
- "postcss": {
- "version": "7.0.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
- "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
- "requires": {
- "picocolors": "^0.2.1",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "postcss-attribute-case-insensitive": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz",
- "integrity": "sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-selector-parser": "^5.0.0"
- },
- "dependencies": {
- "cssesc": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
- "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
- },
- "postcss-selector-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
- "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
- "requires": {
- "cssesc": "^2.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-browser-comments": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-2.0.0.tgz",
- "integrity": "sha512-xGG0UvoxwBc4Yx4JX3gc0RuDl1kc4bVihCzzk6UC72YPfq5fu3c717Nu8Un3nvnq1BJ31gBnFXIG/OaUTnpHgA==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-calc": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz",
- "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==",
- "requires": {
- "css-unit-converter": "^1.1.1",
- "postcss": "^7.0.5",
- "postcss-selector-parser": "^5.0.0-rc.4",
- "postcss-value-parser": "^3.3.1"
- },
- "dependencies": {
- "cssesc": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
- "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
- },
- "postcss-selector-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
- "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
- "requires": {
- "cssesc": "^2.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-color-functional-notation": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
- "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-color-gray": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
- "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
- "requires": {
- "@csstools/convert-colors": "^1.4.0",
- "postcss": "^7.0.5",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-color-hex-alpha": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
- "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
- "requires": {
- "postcss": "^7.0.14",
- "postcss-values-parser": "^2.0.1"
- }
- },
- "postcss-color-mod-function": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
- "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
- "requires": {
- "@csstools/convert-colors": "^1.4.0",
- "postcss": "^7.0.2",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-color-rebeccapurple": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
- "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-colormin": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
- "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
- "requires": {
- "browserslist": "^4.0.0",
- "color": "^3.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-convert-values": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
- "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
- "requires": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-custom-media": {
- "version": "7.0.8",
- "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
- "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
- "requires": {
- "postcss": "^7.0.14"
- }
- },
- "postcss-custom-properties": {
- "version": "8.0.11",
- "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
- "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
- "requires": {
- "postcss": "^7.0.17",
- "postcss-values-parser": "^2.0.1"
- }
- },
- "postcss-custom-selectors": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
- "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-selector-parser": "^5.0.0-rc.3"
- },
- "dependencies": {
- "cssesc": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
- "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
- },
- "postcss-selector-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
- "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
- "requires": {
- "cssesc": "^2.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-dir-pseudo-class": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
- "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-selector-parser": "^5.0.0-rc.3"
- },
- "dependencies": {
- "cssesc": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
- "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
- },
- "postcss-selector-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
- "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
- "requires": {
- "cssesc": "^2.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-discard-comments": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
- "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-discard-duplicates": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
- "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-discard-empty": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
- "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-discard-overridden": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
- "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-double-position-gradients": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
- "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
- "requires": {
- "postcss": "^7.0.5",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-env-function": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
- "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-flexbugs-fixes": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz",
- "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-focus-visible": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
- "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-focus-within": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
- "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-font-variant": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz",
- "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-gap-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
- "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-image-set-function": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
- "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-initial": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.1.tgz",
- "integrity": "sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==",
- "requires": {
- "lodash.template": "^4.5.0",
- "postcss": "^7.0.2"
- }
- },
- "postcss-lab-function": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
- "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
- "requires": {
- "@csstools/convert-colors": "^1.4.0",
- "postcss": "^7.0.2",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-load-config": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
- "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
- "requires": {
- "cosmiconfig": "^5.0.0",
- "import-cwd": "^2.0.0"
- }
- },
- "postcss-loader": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
- "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
- "requires": {
- "loader-utils": "^1.1.0",
- "postcss": "^7.0.0",
- "postcss-load-config": "^2.0.0",
- "schema-utils": "^1.0.0"
- }
- },
- "postcss-logical": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
- "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-media-minmax": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
- "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-merge-longhand": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
- "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
- "requires": {
- "css-color-names": "0.0.4",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "stylehacks": "^4.0.0"
- }
- },
- "postcss-merge-rules": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
- "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-api": "^3.0.0",
- "cssnano-util-same-parent": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0",
- "vendors": "^1.0.0"
- },
- "dependencies": {
- "postcss-selector-parser": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
- "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
- "requires": {
- "dot-prop": "^4.1.1",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-minify-font-values": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
- "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
- "requires": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-minify-gradients": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
- "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "is-color-stop": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-minify-params": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
- "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
- "requires": {
- "alphanum-sort": "^1.0.0",
- "browserslist": "^4.0.0",
- "cssnano-util-get-arguments": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "uniqs": "^2.0.0"
- }
- },
- "postcss-minify-selectors": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
- "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
- "requires": {
- "alphanum-sort": "^1.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-selector-parser": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
- "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
- "requires": {
- "dot-prop": "^4.1.1",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-modules-extract-imports": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
- "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
- "requires": {
- "postcss": "^7.0.5"
- }
- },
- "postcss-modules-local-by-default": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz",
- "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==",
- "requires": {
- "postcss": "^7.0.6",
- "postcss-selector-parser": "^6.0.0",
- "postcss-value-parser": "^3.3.1"
- }
- },
- "postcss-modules-scope": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz",
- "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==",
- "requires": {
- "postcss": "^7.0.6",
- "postcss-selector-parser": "^6.0.0"
- }
- },
- "postcss-modules-values": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz",
- "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==",
- "requires": {
- "icss-replace-symbols": "^1.1.0",
- "postcss": "^7.0.6"
- }
- },
- "postcss-nesting": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.0.tgz",
- "integrity": "sha512-WSsbVd5Ampi3Y0nk/SKr5+K34n52PqMqEfswu6RtU4r7wA8vSD+gM8/D9qq4aJkHImwn1+9iEFTbjoWsQeqtaQ==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-normalize": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-7.0.1.tgz",
- "integrity": "sha512-NOp1fwrG+6kVXWo7P9SizCHX6QvioxFD/hZcI2MLxPmVnFJFC0j0DDpIuNw2tUDeCFMni59gCVgeJ1/hYhj2OQ==",
- "requires": {
- "@csstools/normalize.css": "^9.0.1",
- "browserslist": "^4.1.1",
- "postcss": "^7.0.2",
- "postcss-browser-comments": "^2.0.0"
- }
- },
- "postcss-normalize-charset": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
- "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-normalize-display-values": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
- "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
- "requires": {
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-normalize-positions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
- "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-normalize-repeat-style": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
- "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-normalize-string": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
- "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
- "requires": {
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-normalize-timing-functions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
- "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
- "requires": {
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-normalize-unicode": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
- "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
- "requires": {
- "browserslist": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-normalize-url": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
- "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
- "requires": {
- "is-absolute-url": "^2.0.0",
- "normalize-url": "^3.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-normalize-whitespace": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
- "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
- "requires": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-ordered-values": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
- "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-overflow-shorthand": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
- "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-page-break": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
- "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-place": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
- "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-values-parser": "^2.0.0"
- }
- },
- "postcss-preset-env": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.6.0.tgz",
- "integrity": "sha512-I3zAiycfqXpPIFD6HXhLfWXIewAWO8emOKz+QSsxaUZb9Dp8HbF5kUf+4Wy/AxR33o+LRoO8blEWCHth0ZsCLA==",
- "requires": {
- "autoprefixer": "^9.4.9",
- "browserslist": "^4.4.2",
- "caniuse-lite": "^1.0.30000939",
- "css-blank-pseudo": "^0.1.4",
- "css-has-pseudo": "^0.10.0",
- "css-prefers-color-scheme": "^3.1.1",
- "cssdb": "^4.3.0",
- "postcss": "^7.0.14",
- "postcss-attribute-case-insensitive": "^4.0.1",
- "postcss-color-functional-notation": "^2.0.1",
- "postcss-color-gray": "^5.0.0",
- "postcss-color-hex-alpha": "^5.0.2",
- "postcss-color-mod-function": "^3.0.3",
- "postcss-color-rebeccapurple": "^4.0.1",
- "postcss-custom-media": "^7.0.7",
- "postcss-custom-properties": "^8.0.9",
- "postcss-custom-selectors": "^5.1.2",
- "postcss-dir-pseudo-class": "^5.0.0",
- "postcss-double-position-gradients": "^1.0.0",
- "postcss-env-function": "^2.0.2",
- "postcss-focus-visible": "^4.0.0",
- "postcss-focus-within": "^3.0.0",
- "postcss-font-variant": "^4.0.0",
- "postcss-gap-properties": "^2.0.0",
- "postcss-image-set-function": "^3.0.1",
- "postcss-initial": "^3.0.0",
- "postcss-lab-function": "^2.0.1",
- "postcss-logical": "^3.0.0",
- "postcss-media-minmax": "^4.0.0",
- "postcss-nesting": "^7.0.0",
- "postcss-overflow-shorthand": "^2.0.0",
- "postcss-page-break": "^2.0.0",
- "postcss-place": "^4.0.1",
- "postcss-pseudo-class-any-link": "^6.0.0",
- "postcss-replace-overflow-wrap": "^3.0.0",
- "postcss-selector-matches": "^4.0.0",
- "postcss-selector-not": "^4.0.0"
- }
- },
- "postcss-pseudo-class-any-link": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
- "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
- "requires": {
- "postcss": "^7.0.2",
- "postcss-selector-parser": "^5.0.0-rc.3"
- },
- "dependencies": {
- "cssesc": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
- "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
- },
- "postcss-selector-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
- "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
- "requires": {
- "cssesc": "^2.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-reduce-initial": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
- "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-api": "^3.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0"
- }
- },
- "postcss-reduce-transforms": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
- "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
- "requires": {
- "cssnano-util-get-match": "^4.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- }
- },
- "postcss-replace-overflow-wrap": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
- "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "postcss-safe-parser": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz",
- "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-selector-matches": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
- "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
- "requires": {
- "balanced-match": "^1.0.0",
- "postcss": "^7.0.2"
- }
- },
- "postcss-selector-not": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz",
- "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==",
- "requires": {
- "balanced-match": "^1.0.0",
- "postcss": "^7.0.2"
- }
- },
- "postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
- "requires": {
- "cssesc": "^3.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- },
- "postcss-svgo": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
- "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
- "requires": {
- "is-svg": "^3.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "svgo": "^1.0.0"
- }
- },
- "postcss-unique-selectors": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
- "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
- "requires": {
- "alphanum-sort": "^1.0.0",
- "postcss": "^7.0.0",
- "uniqs": "^2.0.0"
- }
- },
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- },
- "postcss-values-parser": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
- "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
- "requires": {
- "flatten": "^1.0.2",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
- },
- "pretty-bytes": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.2.0.tgz",
- "integrity": "sha512-ujANBhiUsl9AhREUDUEY1GPOharMGm8x8juS7qOHybcLi7XsKfrYQ88hSly1l2i0klXHTDYrlL8ihMCG55Dc3w=="
- },
- "pretty-error": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
- "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
- "requires": {
- "renderkid": "^2.0.1",
- "utila": "~0.4"
- }
- },
- "pretty-format": {
- "version": "24.8.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz",
- "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==",
- "requires": {
- "@jest/types": "^24.8.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- }
- }
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
- },
- "promise": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz",
- "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==",
- "requires": {
- "asap": "~2.0.6"
- }
- },
- "promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
- },
- "promise-toolbox": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/promise-toolbox/-/promise-toolbox-0.12.1.tgz",
- "integrity": "sha512-fvsSG1kxs+xDJFwmN3WgPpAdikJvaoYkcLs1xrLRHYE2luzNVfroLrx2WzIhhsGjLsbNBu+983503IRf/n9MWA==",
- "requires": {
- "make-error": "^1.3.2"
- }
- },
- "prompts": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz",
- "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==",
- "requires": {
- "kleur": "^3.0.2",
- "sisteransi": "^1.0.0"
- }
- },
- "prop-types": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
- "requires": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.8.1"
- }
- },
- "proxy-addr": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
- "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
- "requires": {
- "forwarded": "~0.1.2",
- "ipaddr.js": "1.9.0"
- }
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
- },
- "psl": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz",
- "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA=="
- },
- "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"
- }
- },
- "pumpify": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
- "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
- "requires": {
- "duplexify": "^3.6.0",
- "inherits": "^2.0.3",
- "pump": "^2.0.0"
- },
- "dependencies": {
- "pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
- "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=="
- },
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
- },
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
- },
- "querystring-es3": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
- },
- "querystringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
- "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
- },
- "raf": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
- "requires": {
- "performance-now": "^2.1.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"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- }
- }
- },
- "react": {
- "version": "16.8.6",
- "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz",
- "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "prop-types": "^15.6.2",
- "scheduler": "^0.13.6"
- }
- },
- "react-app-polyfill": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.1.tgz",
- "integrity": "sha512-LbVpT1NdzTdDDs7xEZdebjDrqsvKi5UyVKUQqtTYYNyC1JJYVAwNQWe4ybWvoT2V2WW9PGVO2u5Y6aVj4ER/Ow==",
- "requires": {
- "core-js": "3.0.1",
- "object-assign": "4.1.1",
- "promise": "8.0.2",
- "raf": "3.4.1",
- "regenerator-runtime": "0.13.2",
- "whatwg-fetch": "3.0.0"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
- "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
- }
- }
- },
- "react-cristal": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/react-cristal/-/react-cristal-0.0.12.tgz",
- "integrity": "sha512-1aerLtjDv+59omo4BC7z6gxBpN4+4H2/2/Q1tDObLNwJcWCO5/Gq12IjVQ4FjYh1BLBtuBZe0HalIbVAFVPzqg=="
- },
- "react-dev-utils": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz",
- "integrity": "sha512-pnaeMo/Pxel8aZpxk1WwxT3uXxM3tEwYvsjCYn5R7gNxjhN1auowdcLDzFB8kr7rafAj2rxmvfic/fbac5CzwQ==",
- "requires": {
- "@babel/code-frame": "7.0.0",
- "address": "1.0.3",
- "browserslist": "4.5.4",
- "chalk": "2.4.2",
- "cross-spawn": "6.0.5",
- "detect-port-alt": "1.1.6",
- "escape-string-regexp": "1.0.5",
- "filesize": "3.6.1",
- "find-up": "3.0.0",
- "fork-ts-checker-webpack-plugin": "1.1.1",
- "global-modules": "2.0.0",
- "globby": "8.0.2",
- "gzip-size": "5.0.0",
- "immer": "1.10.0",
- "inquirer": "6.2.2",
- "is-root": "2.0.0",
- "loader-utils": "1.2.3",
- "opn": "5.4.0",
- "pkg-up": "2.0.0",
- "react-error-overlay": "^5.1.6",
- "recursive-readdir": "2.2.2",
- "shell-quote": "1.6.1",
- "sockjs-client": "1.3.0",
- "strip-ansi": "5.2.0",
- "text-table": "0.2.0"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
- "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
- "requires": {
- "@babel/highlight": "^7.0.0"
- }
- },
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "browserslist": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz",
- "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==",
- "requires": {
- "caniuse-lite": "^1.0.30000955",
- "electron-to-chromium": "^1.3.122",
- "node-releases": "^1.1.13"
- }
- },
- "inquirer": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz",
- "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==",
- "requires": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.11",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.0.0",
- "through": "^2.3.6"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "react-dom": {
- "version": "16.8.6",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz",
- "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "prop-types": "^15.6.2",
- "scheduler": "^0.13.6"
- }
- },
- "react-error-overlay": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz",
- "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q=="
- },
- "react-is": {
- "version": "16.8.6",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
- "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA=="
- },
- "react-router": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz",
- "integrity": "sha512-EM7suCPNKb1NxcTZ2LEOWFtQBQRQXecLxVpdsP4DW4PbbqYWeRiLyV/Tt1SdCrvT2jcyXAXmVTmzvSzrPR63Bg==",
- "requires": {
- "@babel/runtime": "^7.1.2",
- "history": "^4.9.0",
- "hoist-non-react-statics": "^3.1.0",
- "loose-envify": "^1.3.1",
- "mini-create-react-context": "^0.3.0",
- "path-to-regexp": "^1.7.0",
- "prop-types": "^15.6.2",
- "react-is": "^16.6.0",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0"
- },
- "dependencies": {
- "hoist-non-react-statics": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz",
- "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==",
- "requires": {
- "react-is": "^16.7.0"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "path-to-regexp": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
- "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
- "requires": {
- "isarray": "0.0.1"
- }
- }
- }
- },
- "react-router-dom": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.0.1.tgz",
- "integrity": "sha512-zaVHSy7NN0G91/Bz9GD4owex5+eop+KvgbxXsP/O+iW1/Ln+BrJ8QiIR5a6xNPtrdTvLkxqlDClx13QO1uB8CA==",
- "requires": {
- "@babel/runtime": "^7.1.2",
- "history": "^4.9.0",
- "loose-envify": "^1.3.1",
- "prop-types": "^15.6.2",
- "react-router": "5.0.1",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0"
- }
- },
- "react-scripts": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.0.1.tgz",
- "integrity": "sha512-LKEjBhVpEB+c312NeJhzF+NATxF7JkHNr5GhtwMeRS1cMeLElMeIu8Ye7WGHtDP7iz7ra4ryy48Zpo6G/cwWUw==",
- "requires": {
- "@babel/core": "7.4.3",
- "@svgr/webpack": "4.1.0",
- "@typescript-eslint/eslint-plugin": "1.6.0",
- "@typescript-eslint/parser": "1.6.0",
- "babel-eslint": "10.0.1",
- "babel-jest": "^24.8.0",
- "babel-loader": "8.0.5",
- "babel-plugin-named-asset-import": "^0.3.2",
- "babel-preset-react-app": "^9.0.0",
- "camelcase": "^5.2.0",
- "case-sensitive-paths-webpack-plugin": "2.2.0",
- "css-loader": "2.1.1",
- "dotenv": "6.2.0",
- "dotenv-expand": "4.2.0",
- "eslint": "^5.16.0",
- "eslint-config-react-app": "^4.0.1",
- "eslint-loader": "2.1.2",
- "eslint-plugin-flowtype": "2.50.1",
- "eslint-plugin-import": "2.16.0",
- "eslint-plugin-jsx-a11y": "6.2.1",
- "eslint-plugin-react": "7.12.4",
- "eslint-plugin-react-hooks": "^1.5.0",
- "file-loader": "3.0.1",
- "fs-extra": "7.0.1",
- "fsevents": "2.0.6",
- "html-webpack-plugin": "4.0.0-beta.5",
- "identity-obj-proxy": "3.0.0",
- "is-wsl": "^1.1.0",
- "jest": "24.7.1",
- "jest-environment-jsdom-fourteen": "0.1.0",
- "jest-resolve": "24.7.1",
- "jest-watch-typeahead": "0.3.0",
- "mini-css-extract-plugin": "0.5.0",
- "optimize-css-assets-webpack-plugin": "5.0.1",
- "pnp-webpack-plugin": "1.2.1",
- "postcss-flexbugs-fixes": "4.1.0",
- "postcss-loader": "3.0.0",
- "postcss-normalize": "7.0.1",
- "postcss-preset-env": "6.6.0",
- "postcss-safe-parser": "4.0.1",
- "react-app-polyfill": "^1.0.1",
- "react-dev-utils": "^9.0.1",
- "resolve": "1.10.0",
- "sass-loader": "7.1.0",
- "semver": "6.0.0",
- "style-loader": "0.23.1",
- "terser-webpack-plugin": "1.2.3",
- "ts-pnp": "1.1.2",
- "url-loader": "1.1.2",
- "webpack": "4.29.6",
- "webpack-dev-server": "3.2.1",
- "webpack-manifest-plugin": "2.0.4",
- "workbox-webpack-plugin": "4.2.0"
- }
- },
- "react-tooltip": {
- "version": "3.11.1",
- "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-3.11.1.tgz",
- "integrity": "sha512-YCMVlEC2KuHIzOQhPplTK5jmBBwoL+PYJJdJKXj7M/h7oevupd/QSVq6z5U7/ehIGXyHsAqvwpdxexDfyQ0o3A==",
- "requires": {
- "classnames": "^2.2.5",
- "prop-types": "^15.6.0"
- }
- },
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- }
- },
- "read-pkg-up": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
- "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
- "requires": {
- "find-up": "^3.0.0",
- "read-pkg": "^3.0.0"
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
- "requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- }
- },
- "realpath-native": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
- "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
- "requires": {
- "util.promisify": "^1.0.0"
- }
- },
- "recursive-readdir": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
- "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
- "requires": {
- "minimatch": "3.0.4"
- }
- },
- "regenerate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
- "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
- },
- "regenerate-unicode-properties": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
- "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
- "requires": {
- "regenerate": "^1.4.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
- "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
- },
- "regenerator-transform": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
- "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
- "requires": {
- "private": "^0.1.6"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexp-tree": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz",
- "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg=="
- },
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
- },
- "regexpu-core": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz",
- "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==",
- "requires": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^8.0.2",
- "regjsgen": "^0.5.0",
- "regjsparser": "^0.6.0",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.1.0"
- }
- },
- "regjsgen": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
- "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA=="
- },
- "regjsparser": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
- "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
- }
- }
- },
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "renderkid": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
- "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
- "requires": {
- "css-select": "^1.1.0",
- "dom-converter": "^0.2",
- "htmlparser2": "^3.3.0",
- "strip-ansi": "^3.0.0",
- "utila": "^0.4.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
- "requires": {
- "boolbase": "~1.0.0",
- "css-what": "2.1",
- "domutils": "1.5.1",
- "nth-check": "~1.0.1"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
- "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.0",
- "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.4.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
- },
- "tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
- "requires": {
- "psl": "^1.1.24",
- "punycode": "^1.4.1"
- }
- }
- }
- },
- "request-promise-core": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
- "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
- "requires": {
- "lodash": "^4.17.11"
- }
- },
- "request-promise-native": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz",
- "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==",
- "requires": {
- "request-promise-core": "1.1.2",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
- },
- "requireindex": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
- "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww=="
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
- },
- "resolve": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
- "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
- "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
- "requires": {
- "resolve-from": "^3.0.0"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
- },
- "resolve-pathname": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
- "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
- },
- "rgb-regex": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
- "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
- },
- "rgba-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
- "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
- },
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "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"
- }
- },
- "rpc-websockets": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-4.5.1.tgz",
- "integrity": "sha512-OoXnJAJ6tz2WC56l0SsWFHF0hrqVQk86aZ/bCQfKx5s5GvCWUW/xNVEUHyh6RwHIgEnSnKq00fTbRD8E9Yw3Dw==",
- "requires": {
- "@babel/runtime": "^7.4.5",
- "assert-args": "^1.2.1",
- "babel-runtime": "^6.26.0",
- "circular-json": "^0.5.9",
- "eventemitter3": "^3.1.2",
- "uuid": "^3.3.2",
- "ws": "^5.2.2"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz",
- "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==",
- "requires": {
- "regenerator-runtime": "^0.13.2"
- }
- },
- "ws": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
- "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- }
- }
- },
- "rsvp": {
- "version": "4.8.5",
- "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
- "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="
- },
- "run-async": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
- "requires": {
- "is-promise": "^2.1.0"
- }
- },
- "run-queue": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
- "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
- "requires": {
- "aproba": "^1.1.1"
- }
- },
- "rxjs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
- "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "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=="
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "sane": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
- "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
- "requires": {
- "@cnakazawa/watch": "^1.0.3",
- "anymatch": "^2.0.0",
- "capture-exit": "^2.0.0",
- "exec-sh": "^0.3.2",
- "execa": "^1.0.0",
- "fb-watchman": "^2.0.0",
- "micromatch": "^3.1.4",
- "minimist": "^1.1.1",
- "walker": "~1.0.5"
- }
- },
- "sass-loader": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz",
- "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==",
- "requires": {
- "clone-deep": "^2.0.1",
- "loader-utils": "^1.0.1",
- "lodash.tail": "^4.1.1",
- "neo-async": "^2.5.0",
- "pify": "^3.0.0",
- "semver": "^5.5.0"
- },
- "dependencies": {
- "clone-deep": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
- "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
- "requires": {
- "for-own": "^1.0.0",
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.0",
- "shallow-clone": "^1.0.0"
- }
- },
- "for-own": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- },
- "shallow-clone": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
- "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
- "requires": {
- "is-extendable": "^0.1.1",
- "kind-of": "^5.0.0",
- "mixin-object": "^2.0.1"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- }
- }
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "saxes": {
- "version": "3.1.11",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
- "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
- "requires": {
- "xmlchars": "^2.1.1"
- }
- },
- "scheduler": {
- "version": "0.13.6",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz",
- "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
- },
- "selfsigned": {
- "version": "1.10.4",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
- "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
- "requires": {
- "node-forge": "0.7.5"
- }
- },
- "semver": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz",
- "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ=="
- },
- "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": {
- "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"
- },
- "dependencies": {
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "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=="
- }
- }
- },
- "serialize-javascript": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz",
- "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA=="
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "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"
- }
- },
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
- }
- }
- },
- "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"
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "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"
- }
- },
- "shallow-clone": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
- "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=",
- "requires": {
- "is-extendable": "^0.1.1",
- "kind-of": "^2.0.1",
- "lazy-cache": "^0.2.3",
- "mixin-object": "^2.0.1"
- },
- "dependencies": {
- "kind-of": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
- "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
- "requires": {
- "is-buffer": "^1.0.2"
- }
- },
- "lazy-cache": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
- "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U="
- }
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "shell-quote": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
- "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
- "requires": {
- "array-filter": "~0.0.0",
- "array-map": "~0.0.0",
- "array-reduce": "~0.0.0",
- "jsonify": "~0.0.0"
- }
- },
- "shellwords": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
- "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
- "requires": {
- "is-arrayish": "^0.3.1"
- },
- "dependencies": {
- "is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
- }
- }
- },
- "sisteransi": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.2.tgz",
- "integrity": "sha512-ZcYcZcT69nSLAR2oLN2JwNmLkJEKGooFMCdvOkFrToUt/WfcRWqhIg4P4KwY4dmLbuyXIx4o4YmPsvMRJYJd/w=="
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "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"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "requires": {
- "kind-of": "^3.2.0"
- }
- },
- "sockjs": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
- "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
- "requires": {
- "faye-websocket": "^0.10.0",
- "uuid": "^3.0.1"
- },
- "dependencies": {
- "faye-websocket": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
- "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- }
- }
- },
- "sockjs-client": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
- "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
- "requires": {
- "debug": "^3.2.5",
- "eventsource": "^1.0.7",
- "faye-websocket": "~0.11.1",
- "inherits": "^2.0.3",
- "json3": "^3.3.2",
- "url-parse": "^1.4.3"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "source-list-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- },
- "source-map-resolve": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
- "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
- "requires": {
- "atob": "^2.1.1",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-support": {
- "version": "0.5.12",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
- "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
- },
- "spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
- },
- "spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
- },
- "spdy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz",
- "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==",
- "requires": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- }
- },
- "spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "requires": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
- "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "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"
- }
- },
- "ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
- "requires": {
- "figgy-pudding": "^3.5.1"
- }
- },
- "stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA=="
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
- },
- "stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
- },
- "stream-browserify": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
- "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
- "requires": {
- "inherits": "~2.0.1",
- "readable-stream": "^2.0.2"
- }
- },
- "stream-each": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
- "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "stream-shift": "^1.0.0"
- }
- },
- "stream-http": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
- "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
- "requires": {
- "builtin-status-codes": "^3.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.3.6",
- "to-arraybuffer": "^1.0.0",
- "xtend": "^4.0.0"
- }
- },
- "stream-shift": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
- "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
- },
- "string-length": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
- "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=",
- "requires": {
- "astral-regex": "^1.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "stringify-object": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
- "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
- "requires": {
- "get-own-enumerable-property-symbols": "^3.0.0",
- "is-obj": "^1.0.1",
- "is-regexp": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
- },
- "strip-comments": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz",
- "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==",
- "requires": {
- "babel-extract-comments": "^1.0.0",
- "babel-plugin-transform-object-rest-spread": "^6.26.0"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- },
- "style-loader": {
- "version": "0.23.1",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
- "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
- "requires": {
- "loader-utils": "^1.1.0",
- "schema-utils": "^1.0.0"
- }
- },
- "styled-components": {
- "version": "3.4.10",
- "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.4.10.tgz",
- "integrity": "sha512-TA8ip8LoILgmSAFd3r326pKtXytUUGu5YWuqZcOQVwVVwB6XqUMn4MHW2IuYJ/HAD81jLrdQed8YWfLSG1LX4Q==",
- "requires": {
- "buffer": "^5.0.3",
- "css-to-react-native": "^2.0.3",
- "fbjs": "^0.8.16",
- "hoist-non-react-statics": "^2.5.0",
- "prop-types": "^15.5.4",
- "react-is": "^16.3.1",
- "stylis": "^3.5.0",
- "stylis-rule-sheet": "^0.0.10",
- "supports-color": "^3.2.3"
- },
- "dependencies": {
- "buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
- "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- },
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
- },
- "supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
- "requires": {
- "has-flag": "^1.0.0"
- }
- }
- }
- },
- "stylehacks": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
- "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
- "requires": {
- "browserslist": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-selector-parser": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
- "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
- "requires": {
- "dot-prop": "^4.1.1",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "stylis": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz",
- "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q=="
- },
- "stylis-rule-sheet": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz",
- "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw=="
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "svg-parser": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.1.tgz",
- "integrity": "sha512-8eUnCsU2sc2hyfvjK++zi5u24a2UQIB2DK9GY/cprGlaDr7SIhm9F0m9CkGYOnOgrK3iTUSnJ7M1DTLqqZt96g=="
- },
- "svgo": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz",
- "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==",
- "requires": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.33",
- "csso": "^3.5.1",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- }
- },
- "symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
- },
- "table": {
- "version": "5.4.4",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.4.tgz",
- "integrity": "sha512-IIfEAUx5QlODLblLrGTTLJA7Tk0iLSGBvgY8essPRVNGHAzThujww1YqHLs6h3HfTg55h++RzLHH5Xw/rfv+mg==",
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "tapable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
- "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
- },
- "terser": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",
- "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==",
- "requires": {
- "commander": "^2.19.0",
- "source-map": "~0.6.1",
- "source-map-support": "~0.5.10"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "terser-webpack-plugin": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz",
- "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==",
- "requires": {
- "cacache": "^11.0.2",
- "find-cache-dir": "^2.0.0",
- "schema-utils": "^1.0.0",
- "serialize-javascript": "^1.4.0",
- "source-map": "^0.6.1",
- "terser": "^3.16.1",
- "webpack-sources": "^1.1.0",
- "worker-farm": "^1.5.2"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "test-exclude": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
- "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
- "requires": {
- "glob": "^7.1.3",
- "minimatch": "^3.0.4",
- "read-pkg-up": "^4.0.0",
- "require-main-filename": "^2.0.0"
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "throat": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
- "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo="
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "thunky": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
- "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow=="
- },
- "timers-browserify": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
- "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
- "requires": {
- "setimmediate": "^1.0.4"
- }
- },
- "timsort": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
- "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
- },
- "tiny-invariant": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz",
- "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA=="
- },
- "tiny-warning": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
- "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
- },
- "to-arraybuffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
- "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "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"
- }
- },
- "tr46": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
- },
- "ts-pnp": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz",
- "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA=="
- },
- "tslib": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
- "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
- },
- "tsutils": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz",
- "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==",
- "requires": {
- "tslib": "^1.8.1"
- }
- },
- "tty-browserify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
- "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
- },
- "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-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
- "type-detect": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
- "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI="
- },
- "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": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "ua-parser-js": {
- "version": "0.7.20",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz",
- "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
- },
- "uglify-js": {
- "version": "3.4.10",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
- "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
- "requires": {
- "commander": "~2.19.0",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "commander": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
- "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "unicode-canonical-property-names-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
- "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
- },
- "unicode-match-property-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
- "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
- "requires": {
- "unicode-canonical-property-names-ecmascript": "^1.0.4",
- "unicode-property-aliases-ecmascript": "^1.0.4"
- }
- },
- "unicode-match-property-value-ecmascript": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
- "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g=="
- },
- "unicode-property-aliases-ecmascript": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
- "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw=="
- },
- "union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- }
- },
- "uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
- },
- "uniqs": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
- "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
- },
- "unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "requires": {
- "unique-slug": "^2.0.0"
- }
- },
- "unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "requires": {
- "imurmurhash": "^0.1.4"
- }
- },
- "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="
- },
- "unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
- }
- }
- },
- "upath": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
- "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q=="
- },
- "upper-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
- "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
- },
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
- }
- }
- },
- "url-loader": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz",
- "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==",
- "requires": {
- "loader-utils": "^1.1.0",
- "mime": "^2.0.3",
- "schema-utils": "^1.0.0"
- }
- },
- "url-parse": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz",
- "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==",
- "requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
- },
- "util": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
- "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
- "requires": {
- "inherits": "2.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
- "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
- "requires": {
- "define-properties": "^1.1.2",
- "object.getownpropertydescriptors": "^2.0.3"
- }
- },
- "utila": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
- "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
- },
- "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.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "value-equal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
- "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
- },
- "varint": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz",
- "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8="
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "vendors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz",
- "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw=="
- },
- "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"
- }
- },
- "vm-browserify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
- "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw=="
- },
- "w3c-hr-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
- "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
- "requires": {
- "browser-process-hrtime": "^0.1.2"
- }
- },
- "w3c-xmlserializer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
- "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
- "requires": {
- "domexception": "^1.0.1",
- "webidl-conversions": "^4.0.2",
- "xml-name-validator": "^3.0.0"
- }
- },
- "walker": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
- "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
- "requires": {
- "makeerror": "1.0.x"
- }
- },
- "watchpack": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
- "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
- "requires": {
- "chokidar": "^2.0.2",
- "graceful-fs": "^4.1.2",
- "neo-async": "^2.5.0"
- }
- },
- "wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "requires": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
- },
- "webpack": {
- "version": "4.29.6",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.6.tgz",
- "integrity": "sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-module-context": "1.8.5",
- "@webassemblyjs/wasm-edit": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5",
- "acorn": "^6.0.5",
- "acorn-dynamic-import": "^4.0.0",
- "ajv": "^6.1.0",
- "ajv-keywords": "^3.1.0",
- "chrome-trace-event": "^1.0.0",
- "enhanced-resolve": "^4.1.0",
- "eslint-scope": "^4.0.0",
- "json-parse-better-errors": "^1.0.2",
- "loader-runner": "^2.3.0",
- "loader-utils": "^1.1.0",
- "memory-fs": "~0.4.1",
- "micromatch": "^3.1.8",
- "mkdirp": "~0.5.0",
- "neo-async": "^2.5.0",
- "node-libs-browser": "^2.0.0",
- "schema-utils": "^1.0.0",
- "tapable": "^1.1.0",
- "terser-webpack-plugin": "^1.1.0",
- "watchpack": "^1.5.0",
- "webpack-sources": "^1.3.0"
- }
- },
- "webpack-dev-middleware": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz",
- "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==",
- "requires": {
- "memory-fs": "^0.4.1",
- "mime": "^2.4.2",
- "range-parser": "^1.2.1",
- "webpack-log": "^2.0.0"
- }
- },
- "webpack-dev-server": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz",
- "integrity": "sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw==",
- "requires": {
- "ansi-html": "0.0.7",
- "bonjour": "^3.5.0",
- "chokidar": "^2.0.0",
- "compression": "^1.5.2",
- "connect-history-api-fallback": "^1.3.0",
- "debug": "^4.1.1",
- "del": "^3.0.0",
- "express": "^4.16.2",
- "html-entities": "^1.2.0",
- "http-proxy-middleware": "^0.19.1",
- "import-local": "^2.0.0",
- "internal-ip": "^4.2.0",
- "ip": "^1.1.5",
- "killable": "^1.0.0",
- "loglevel": "^1.4.1",
- "opn": "^5.1.0",
- "portfinder": "^1.0.9",
- "schema-utils": "^1.0.0",
- "selfsigned": "^1.9.1",
- "semver": "^5.6.0",
- "serve-index": "^1.7.2",
- "sockjs": "0.3.19",
- "sockjs-client": "1.3.0",
- "spdy": "^4.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^6.1.0",
- "url": "^0.11.0",
- "webpack-dev-middleware": "^3.5.1",
- "webpack-log": "^2.0.0",
- "yargs": "12.0.2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
- },
- "decamelize": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
- "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
- "requires": {
- "xregexp": "4.0.0"
- }
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "yargs": {
- "version": "12.0.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
- "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^2.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^3.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1 || ^4.0.0",
- "yargs-parser": "^10.1.0"
- }
- },
- "yargs-parser": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
- "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
- "requires": {
- "camelcase": "^4.1.0"
- }
- }
- }
- },
- "webpack-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
- "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
- "requires": {
- "ansi-colors": "^3.0.0",
- "uuid": "^3.3.2"
- }
- },
- "webpack-manifest-plugin": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz",
- "integrity": "sha512-nejhOHexXDBKQOj/5v5IZSfCeTO3x1Dt1RZEcGfBSul891X/eLIcIVH31gwxPDdsi2Z8LKKFGpM4w9+oTBOSCg==",
- "requires": {
- "fs-extra": "^7.0.0",
- "lodash": ">=3.5 <5",
- "tapable": "^1.0.0"
- }
- },
- "webpack-sources": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
- "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
- "requires": {
- "source-list-map": "^2.0.0",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "websocket-driver": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
- "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
- "requires": {
- "http-parser-js": ">=0.4.0 <0.4.11",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
- "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
- },
- "whatwg-encoding": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
- "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
- "requires": {
- "iconv-lite": "0.4.24"
- }
- },
- "whatwg-fetch": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
- "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
- },
- "whatwg-mimetype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
- "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
- },
- "whatwg-url": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
- "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
- "requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
- }
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
- },
- "workbox-background-sync": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz",
- "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-broadcast-update": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz",
- "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-build": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz",
- "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==",
- "requires": {
- "@babel/runtime": "^7.3.4",
- "@hapi/joi": "^15.0.0",
- "common-tags": "^1.8.0",
- "fs-extra": "^4.0.2",
- "glob": "^7.1.3",
- "lodash.template": "^4.4.0",
- "pretty-bytes": "^5.1.0",
- "stringify-object": "^3.3.0",
- "strip-comments": "^1.0.2",
- "workbox-background-sync": "^4.3.1",
- "workbox-broadcast-update": "^4.3.1",
- "workbox-cacheable-response": "^4.3.1",
- "workbox-core": "^4.3.1",
- "workbox-expiration": "^4.3.1",
- "workbox-google-analytics": "^4.3.1",
- "workbox-navigation-preload": "^4.3.1",
- "workbox-precaching": "^4.3.1",
- "workbox-range-requests": "^4.3.1",
- "workbox-routing": "^4.3.1",
- "workbox-strategies": "^4.3.1",
- "workbox-streams": "^4.3.1",
- "workbox-sw": "^4.3.1",
- "workbox-window": "^4.3.1"
- },
- "dependencies": {
- "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"
- }
- }
- }
- },
- "workbox-cacheable-response": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz",
- "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-core": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz",
- "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg=="
- },
- "workbox-expiration": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz",
- "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-google-analytics": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz",
- "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==",
- "requires": {
- "workbox-background-sync": "^4.3.1",
- "workbox-core": "^4.3.1",
- "workbox-routing": "^4.3.1",
- "workbox-strategies": "^4.3.1"
- }
- },
- "workbox-navigation-preload": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz",
- "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-precaching": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz",
- "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-range-requests": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz",
- "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-routing": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz",
- "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-strategies": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz",
- "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-streams": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz",
- "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "workbox-sw": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz",
- "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w=="
- },
- "workbox-webpack-plugin": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.2.0.tgz",
- "integrity": "sha512-YZsiA+y/ns/GdWRaBsfYv8dln1ebWtGnJcTOg1ppO0pO1tScAHX0yGtHIjndxz3L/UUhE8b0NQE9KeLNwJwA5A==",
- "requires": {
- "@babel/runtime": "^7.0.0",
- "json-stable-stringify": "^1.0.1",
- "workbox-build": "^4.2.0"
- }
- },
- "workbox-window": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz",
- "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==",
- "requires": {
- "workbox-core": "^4.3.1"
- }
- },
- "worker-farm": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
- "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
- "requires": {
- "errno": "~0.1.7"
- }
- },
- "worker-rpc": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz",
- "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
- "requires": {
- "microevent.ts": "~0.1.1"
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
- "write-file-atomic": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
- "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
- "requires": {
- "graceful-fs": "^4.1.11",
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
- }
- },
- "ws": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
- "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- },
- "xml-name-validator": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
- },
- "xmlchars": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz",
- "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w=="
- },
- "xregexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
- "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg=="
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "xterm": {
- "version": "3.14.5",
- "resolved": "https://registry.npmjs.org/xterm/-/xterm-3.14.5.tgz",
- "integrity": "sha512-DVmQ8jlEtL+WbBKUZuMxHMBgK/yeIZwkXB81bH+MGaKKnJGYwA+770hzhXPfwEIokK9On9YIFPRleVp/5G7z9g=="
- },
- "xterm-addon-attach": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/xterm-addon-attach/-/xterm-addon-attach-0.1.0.tgz",
- "integrity": "sha512-vImYAP+AVoW/gnr4CIESrOr2MplzNxnrPX4YEkdk0EEkBOg3Pwnndu1xy7HnY0XZsfGRz7rfn71sAXfJDGLvUQ=="
- },
- "xterm-addon-fit": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.1.0.tgz",
- "integrity": "sha512-DzYThnR5rXYX7JrOZ8rHGMU36BiTwYNFUOhhNwrDSFvoUR2MgwQrfA/JrqLE62KRj0D8bkRR7+xe7qGBp1O4Rw=="
- },
- "y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
- },
- "yallist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
- "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A=="
- },
- "yargs": {
- "version": "12.0.5",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
- "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^3.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1 || ^4.0.0",
- "yargs-parser": "^11.1.1"
- },
- "dependencies": {
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- }
- }
- },
- "yargs-parser": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
- "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
-}
diff --git a/lotuspond/front/package.json b/lotuspond/front/package.json
deleted file mode 100644
index c9e6ac769..000000000
--- a/lotuspond/front/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "name": "front",
- "version": "0.1.0",
- "private": true,
- "dependencies": {
- "borc": "^2.1.1",
- "cids": "^0.7.1",
- "ipld-dag-cbor": "^0.15.0",
- "jsonrpc-websocket-client": "^0.5.0",
- "multihashes": "^0.4.15",
- "react": "^16.8.6",
- "react-cristal": "^0.0.12",
- "react-dom": "^16.8.6",
- "react-router-dom": "^5.0.1",
- "react-scripts": "3.0.1",
- "react-tooltip": "^3.11.1",
- "rpc-websockets": "^4.5.1",
- "styled-components": "^3.3.3",
- "xterm": "^3.14.5",
- "xterm-addon-attach": "^0.1.0",
- "xterm-addon-fit": "^0.1.0"
- },
- "scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
- "eject": "react-scripts eject"
- },
- "eslintConfig": {
- "extends": "react-app"
- },
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
- ]
- }
-}
diff --git a/lotuspond/front/public/index.html b/lotuspond/front/public/index.html
deleted file mode 100644
index d0709c016..000000000
--- a/lotuspond/front/public/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
- Lotus Pond
-
-
-
-
-
-
diff --git a/lotuspond/front/public/manifest.json b/lotuspond/front/public/manifest.json
deleted file mode 100644
index 1f2f141fa..000000000
--- a/lotuspond/front/public/manifest.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "short_name": "React App",
- "name": "Create React App Sample",
- "icons": [
- {
- "src": "favicon.ico",
- "sizes": "64x64 32x32 24x24 16x16",
- "type": "image/x-icon"
- }
- ],
- "start_url": ".",
- "display": "standalone",
- "theme_color": "#000000",
- "background_color": "#ffffff"
-}
diff --git a/lotuspond/front/src/Address.js b/lotuspond/front/src/Address.js
deleted file mode 100644
index b2987646e..000000000
--- a/lotuspond/front/src/Address.js
+++ /dev/null
@@ -1,148 +0,0 @@
-import React from 'react'
-import CID from 'cids'
-import ReactTooltip from 'react-tooltip'
-import * as multihash from "multihashes"
-import State from "./State"
-import methods from "./chain/methods.json"
-import Fil from "./Fil";
-
-function truncAddr(addr, len) {
- if (!addr) {
- return ""
- }
- if (addr.length > len) {
- return {addr.substr(0, len - 3) + '..'}
- }
- return addr
-}
-
-let sheet = document.createElement('style')
-document.body.appendChild(sheet);
-
-class Address extends React.Component {
- constructor(props) {
- super(props)
-
- this.openState = this.openState.bind(this)
-
- this.state = {balance: -2}
- this.refresh = this.refresh.bind(this)
- }
-
- componentDidMount() {
- this.refresh()
- if(!this.props.ts) {
- this.updates = setInterval(this.refresh, 2050)
- this.props.client.on('close', () => clearInterval(this.updates))
- }
- }
-
- componentWillUnmount() {
- clearInterval(this.updates)
- }
-
- async refresh() {
- let balance = 0
- let actor = {}
- let actorInfo
- let minerInfo
- let nonce
-
- try {
- balance = await this.props.client.call('Filecoin.WalletBalance', [this.props.addr])
- actor = await this.props.client.call('Filecoin.StateGetActor', [this.props.addr, (this.props.ts || {}).Cids])
-
- actorInfo = await this.actorInfo(actor, this.props.addr)
- if(this.props.miner) {
- minerInfo = await this.props.client.call('Filecoin.StateMinerPower', [this.props.addr, (this.props.ts || {}).Cids])
- }
- if(this.props.nonce) {
- nonce = await this.props.client.call('Filecoin.MpoolGetNonce', [this.props.addr])
- }
- } catch (err) {
- console.log(err)
- balance = -1
- }
- this.setState({balance, actor, actorInfo, minerInfo, nonce})
- }
-
- openState() {
- this.props.mountWindow((onClose) => )
- }
-
- async actorInfo(actor, addr) {
- const c = new CID(actor.Code['/'])
- const mh = multihash.decode(c.multihash) // TODO: check identity
-
- let method =
- if(this.props.method !== undefined && mh.digest.toString()) {
- method = .{methods[mh.digest.toString()][this.props.method]}
- }
-
- let info = ({mh.digest.toString()}{method})
- switch(mh.digest.toString()) {
- case 'paych':
- const actstate = await this.props.client.call('Filecoin.StateReadState', [addr, (this.props.ts || {}).Cids])
- info = ({mh.digest.toString()}{method} to )
- }
-
- return info
- }
-
- addColl = async () => {
- const coll = await this.props.client.call('Filecoin.StatePledgeCollateral', [null])
- this.props.addN(this.props.addr, coll)
- }
-
- render() {
- let add20k =
- if(this.props.addN) {
- add20k = this.props.addN(this.props.addr, 2e+18)}>[+2]
- if (this.props.add10k) {
- add20k = {add20k} this.props.addN(this.props.addr, 20e+18)}>[+20]
- add20k = {add20k} this.props.addN(this.props.addr, 200e+18)}>[+200]
- add20k = {add20k} this.addColl()}>[+C]
- }
- }
- let addr = truncAddr(this.props.addr, this.props.short ? 12 : 17)
-
- let actInfo = (?)
- if(this.state.balance >= 0) {
- actInfo = this.state.actorInfo
- addr = {addr}
- }
-
- addr = sheet.sheet.insertRule(`.pondaddr-${this.props.addr}, .pondaddr-${this.props.addr} * { color: #11ee11 !important; }`, 0)}
- onMouseLeave={() => sheet.sheet.deleteRule(0)}
- >{addr}
-
- let nonce =
- if(this.props.nonce) {
- nonce = Nc:{this.state.nonce}{nonce}
- }
-
- let balance = : {{this.state.balance}}
- if(this.props.nobalance) {
- balance =
- }
- if(this.props.short) {
- actInfo = {actInfo}: {this.state.balance}
- balance =
- }
-
- let transfer =
- if(this.props.transfer) {
- transfer = {this.props.transfer}FIL
- }
-
- let minerInfo =
- if(this.state.minerInfo) {
- minerInfo = Power: {this.state.minerInfo.MinerPower.QualityAdjPower} ({this.state.minerInfo.MinerPower.QualityAdjPower/this.state.minerInfo.TotalPower.QualityAdjPower*100}%)
- }
-
- return {addr}{balance}{actInfo}{nonce}{add20k}{transfer}{minerInfo}
- }
-}
-
-export default Address
diff --git a/lotuspond/front/src/App.css b/lotuspond/front/src/App.css
deleted file mode 100644
index 7c58b720e..000000000
--- a/lotuspond/front/src/App.css
+++ /dev/null
@@ -1,232 +0,0 @@
-.Index {
- width: 100vw;
- height: 100vh;
- background: #1a1a1a;
- color: #f0f0f0;
- font-family: monospace;
-
- display: grid;
- grid-template-columns: auto 40vw auto;
- grid-template-rows: auto auto auto 3em;
- grid-template-areas:
- ". . ."
- ". main ."
- ". . ."
- "footer footer footer";
-}
-
-.Index-footer {
- background: #2a2a2a;
- grid-area: footer;
-}
-
-.Index-footer > div {
- padding-left: 0.7em;
- padding-top: 0.7em;
-}
-
-.Index-nodes {
- grid-area: main;
- background: #2a2a2a;
-}
-
-.Index-node {
- margin: 5px;
- padding: 15px;
- background: #1f1f1f;
-}
-
-.Index-addwrap {
- margin-top: 5px;
-}
-
-/* SingleNode */
-
-
-.SingleNode-connecting {
- width: 100vw;
- height: 100vh;
-
- background: #1a1a1a;
- color: #ffffff;
- font-family: monospace;
-
- display: grid;
- grid-template-columns: auto min-content auto;
- grid-template-rows: auto min-content auto;
- grid-template-areas:
- ". . ."
- ". main ."
- ". . ."
-}
-
-.SingleNode-connecting > div {
- grid-area: main;
- padding: 15px;
- white-space: nowrap;
- background: #2a2a2a;
-}
-
-
-
-/*****/
-
-a:link {
- color: #50f020;
-}
-
-a:visited {
- color: #50f020;
-}
-
-a:hover {
- color: #30a00a;
-}
-
-.Button {
- display: inline-block;
- padding: 15px;
- background: #1f1f1f;
- margin-left: 5px;
-}
-
-.Window {
- background: #2a2a2a !important;
- color: #e0e0e0;
-}
-
-.Window b {
- color: #f0f0f0;
-}
-
-.Window > :first-child > :nth-child(2)::before {
- background: #f0f0f0;
-}
-
-.Window > :first-child > :nth-child(2)::after {
- background: #f0f0f0;
-}
-
-.Window a:link {
- color: #30a015;
-}
-
-.Window a:visited {
- color: #30a015;
-}
-
-/* POND */
-
-.Pond-connecting {
- width: 100vw;
- height: 100vh;
-
- background: #1a1a1a;
- color: #ffffff;
- font-family: monospace;
-
- display: grid;
- grid-template-columns: auto min-content auto;
- grid-template-rows: auto min-content auto;
- grid-template-areas:
- ". . ."
- ". main ."
- ". . ."
-}
-
-.App {
- min-height: 100vh;
- background: #1a1a1a;
- font-family: monospace;
-}
-
-.NodeList {
- user-select: text;
- font-family: monospace;
- min-width: 40em;
- display: inline-block;
-}
-
-.FullNode {
- user-select: text;
- font-family: monospace;
- min-width: 50em;
- display: inline-block;
-}
-
-.FullNode-voucher {
- padding-left: 1em;
-}
-
-.StorageNode {
- user-select: text;
- font-family: monospace;
- min-width: 40em;
- display: inline-block;
-}
-
-.Block {
- user-select: text;
- font-family: monospace;
- min-width: 60em;
- display: inline-block;
-}
-
-.State {
- user-select: text;
- font-family: monospace;
- min-width: 40em;
- display: inline-block;
-}
-
-.Client {
- user-select: text;
- font-family: monospace;
- display: inline-block;
-}
-
-.CristalScroll {
- display: flex;
- min-width: 100%;
- min-height: 100%;
- overflow: auto;
-}
-
-.Consensus {
- font-family: monospace;
-}
-
-.ChainExplorer {
- font-family: monospace;
- color: #d0d0d0;
-}
-
-.ChainExplorer-at {
- min-width: 40em;
- background: #222222;
-}
-
-.ChainExplorer-after {
- background: #440000
-}
-
-.ChainExplorer-after:hover {
- background: #770000
-}
-
-.ChainExplorer-before {
- background: #444400
-}
-
-.ChainExplorer-before:hover {
- background: #777700
-}
-
-.Logs {
- width: 100%;
- height: 100%;
-}
-
-.Logs-window :nth-child(2) {
- height: 100%;
-}
diff --git a/lotuspond/front/src/App.js b/lotuspond/front/src/App.js
deleted file mode 100644
index 475369738..000000000
--- a/lotuspond/front/src/App.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import './App.css';
-import { BrowserRouter as Router, Route, Link } from "react-router-dom";
-import Pond from "./Pond";
-import SingleNode from "./SingleNode";
-import Index from "./NodeIndex";
-
-class App extends React.Component {
- constructor(props) {
- super(props)
- }
-
- render() {
- return (
-
-
-
-
-
- )
- }
-}
-
-export default App
diff --git a/lotuspond/front/src/App.test.js b/lotuspond/front/src/App.test.js
deleted file mode 100644
index b63d6b53a..000000000
--- a/lotuspond/front/src/App.test.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-import ReactDOM from 'react-dom';
-import Pond from './Pond';
-
-it('renders without crashing', () => {
- const div = document.createElement('div');
- ReactDOM.render(, div);
- ReactDOM.unmountComponentAtNode(div);
-});
diff --git a/lotuspond/front/src/Block.js b/lotuspond/front/src/Block.js
deleted file mode 100644
index 4bae57c81..000000000
--- a/lotuspond/front/src/Block.js
+++ /dev/null
@@ -1,89 +0,0 @@
-import React from 'react';
-import {BlockLinks} from "./BlockLink";
-import Address from "./Address";
-import Window from "./Window";
-
-class Block extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {}
-
- this.loadHeader()
- }
-
- async loadHeader() {
- const header = await this.props.conn.call('Filecoin.ChainGetBlock', [this.props.cid])
- let messages = await this.props.conn.call('Filecoin.ChainGetParentMessages', [this.props.cid])
- let receipts = await this.props.conn.call('Filecoin.ChainGetParentReceipts', [this.props.cid])
-
- if (!messages) {
- messages = []
- }
-
-
- messages = messages.map((msg, k) => ({...msg.Message, cid: msg.Cid, receipt: receipts[k]}))
-
- messages = await Promise.all(messages.map(async (msg, i) => {
- if (msg.receipt.ExitCode !== 0) {
- let reply = await this.props.conn.call('Filecoin.StateReplay', [{Cids: [this.props.cid], Blocks: [header], Height: header.Height}, msg.Cid])
- if(!reply.Error) {
- reply.Error = "reply: no error"
- }
- msg.Error = reply.Error
- }
- return msg
- }))
-
- this.setState({header: header, messages: messages})
- }
-
- render() {
- let content = Loading Block Info
- if (this.state.header) {
- let head = this.state.header
-
- const messages = this.state.messages.map((m, k) => (
-
-
-
=>
-
- N{m.Nonce}
- {m.receipt.GasUsed}Gas
- {m.receipt.ExitCode !== 0 ? EXIT:{m.receipt.ExitCode} : }
-
- {m.receipt.ExitCode !== 0 ?
Error: {m.Error}
:
}
-
- ))
-
- content = (
-
-
Height: {head.Height}
-
Parents:
-
Weight: {head.ParentWeight}
-
-
Messages: {head.Messages['/']} {/*TODO: link to message explorer */}
-
Parent Receipts: {head.ParentMessageReceipts['/']}
-
-
Parent State Root: {head.ParentStateRoot['/']}
-
-
-
-
-
-
-
-
-
----
-
{messages}
-
- )
- }
-
- return (
- {content}
- )
- }
-}
-
-export default Block
\ No newline at end of file
diff --git a/lotuspond/front/src/BlockLink.js b/lotuspond/front/src/BlockLink.js
deleted file mode 100644
index 1d524999f..000000000
--- a/lotuspond/front/src/BlockLink.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import React from 'react';
-import Block from "./Block";
-import Address from "./Address";
-
-
-export class BlockLinks extends React.Component {
- render() {
- return this.props.cids.map((c, k) => {
- let block
-
- if(this.props.blocks) {
- block = this.props.blocks[k]
- }
-
- return
- })
- }
-}
-
-class BlockLink extends React.Component {
- constructor(props) {
- super(props)
-
- this.openBlockViewer = this.openBlockViewer.bind(this)
- }
-
- openBlockViewer() {
- this.props.mountWindow((onClose) => )
- }
-
- render() {
- let info =
- if(this.props.block) {
- info = (by )
- }
-
- return {this.props.cid['/'].substr(-8)}{info}
- }
-}
-
-export default BlockLink
\ No newline at end of file
diff --git a/lotuspond/front/src/ChainExplorer.js b/lotuspond/front/src/ChainExplorer.js
deleted file mode 100644
index 8957cb3d0..000000000
--- a/lotuspond/front/src/ChainExplorer.js
+++ /dev/null
@@ -1,178 +0,0 @@
-import React from 'react';
-import {BlockLinks} from "./BlockLink";
-import Window from "./Window";
-
-const rows = 32
-
-class ChainExplorer extends React.Component {
- fetching = []
-
- constructor(props) {
- super(props)
-
- this.update = this.update.bind(this)
- this.scroll = this.scroll.bind(this)
-
- this.state = {
- follow: true,
- at: props.ts.Height,
- highest: props.ts,
-
- cache: {[props.ts.Height]: props.ts},
- messages: {},
- }
- }
-
- viewport() {
- const base = this.state.at - this.state.at % rows
-
- return Array(rows).fill(0)
- .map((_, k) => k + base)
- .map(k => k > this.state.at ? k - rows : k)
- }
-
- async componentDidMount() {
- let msgcache = {}
- await this.updateMessages(this.props.ts.Cids, msgcache)
- this.setState(prev => ({messages: {...prev.messages, ...msgcache}}))
-
- setInterval(this.update, 1000)
- }
-
- async updateMessages(cids, msgcache) {
- const msgs = await Promise.all(cids.map(async cid => [cid['/'], await this.props.client.call('Filecoin.ChainGetParentMessages', [cid])]))
- msgs.forEach(([cid, msg]) => msgcache[cid] = msg)
- }
-
- async update() {
- const tipset = await this.props.client.call("Filecoin.ChainHead", [])
- if(tipset.Height > this.state.highest.Height) {
- let msgcache = {}
- await this.updateMessages(tipset.Cids, msgcache)
-
- this.setState(prev => ({highest: tipset, messages: {...prev.messages, ...msgcache}, cache: {...prev.cache, [tipset.Height]: tipset}}))
- if(this.state.follow) {
- this.setState({at: tipset.Height})
- }
- }
-
- await this.fetchVisible()
- }
-
- async fetch(h, base, cache, msgcache) {
- //console.log(h, base, cache)
-
- if (this.fetching[h]) {
- return cache[h]
- }
- this.fetching[h] = true
-
- if (h < 0) {
- return
- }
- if(!base.Blocks) {
- console.log("base for H is nil blk", h, base)
- return
- }
- let cids = base.Blocks.map(b => (b.Parents || []))
- .reduce((acc, val) => {
- let out = {...acc}
- val.forEach(c => out[c['/']] = 8)
- return out
- }, {})
- cids = Object.keys(cids).map(k => ({'/': k}))
- console.log("parents", cids)
-
- const blocks = await Promise.all(cids.map(cid => this.props.client.call('Filecoin.ChainGetBlock', [cid])))
-
- if (!blocks[0]) {
- return
- }
-
- cache[h] = {
- Height: blocks[0].Height,
- Cids: cids,
- Blocks: blocks,
- }
-
- await this.updateMessages(cids, msgcache)
-
- return cache[h]
- }
-
- async fetchVisible() {
- await this.fetchN(this.state.at)
- }
-
- async fetchN(top) {
- if(!this.state.cache[top]) {
- if(top === this.state.highest.Height) {
- throw "fetchN broke (tipset not fetched)"
- }
- let h = top + rows > this.state.highest.Height ? this.state.highest.Height : top + rows
-
- await this.fetchN(h)
- }
-
- let cache = {...this.state.cache}
- let msgcache = {...this.state.messages}
-
- console.log("top", top)
-
- let parent = cache[top]
- for(let i = 0; i < rows; i++) {
- let newts = await this.fetch(top - i, parent, cache, msgcache)
- parent = newts ? newts : parent
- }
- this.setState({cache: cache, messages: msgcache})
- }
-
- scroll(event) {
- if(event.deltaY < 0 && this.state.at > 0) {
- this.setState(prev => ({at: prev.at - 1, follow: false}))
- }
- if(event.deltaY > 0 && this.state.at < this.state.highest.Height) {
- this.setState(prev => ({at: prev.at + 1, follow: prev.at + 1 === this.state.highest.Height}))
- }
- }
-
- render() {
- const view = this.viewport()
-
- const content = {view.map(row => {
- const base = this.state.at - this.state.at % rows
- const className = row === this.state.at ? 'ChainExplorer-at' : (row < base ? 'ChainExplorer-after' : 'ChainExplorer-before')
- let info =
(fetching)
- let h =
{row}
- if(this.state.cache[row]) {
- const ts = this.state.cache[row]
-
- h = ts.Height
-
- let msgc = -1
- if(ts.Cids[0] && this.state.messages[ts.Cids[0]['/']]) { // TODO: get from all blks
- msgc = this.state.messages[ts.Cids[0]['/']].length
- }
- if(msgc > 0) {
- msgc =
{msgc}
- }
- let time = '?'
- if(this.state.cache[row - 1]){
- time =
{ts.Blocks[0].Timestamp - this.state.cache[row - 1].Blocks[0].Timestamp}s
- }
-
- info =
- Msgs: {msgc} ΔT:{time}
-
- }
-
- return
@{h} {info}
- })}
-
- return (
- {content}
- )
- }
-}
-
-export default ChainExplorer
\ No newline at end of file
diff --git a/lotuspond/front/src/Client.js b/lotuspond/front/src/Client.js
deleted file mode 100644
index 244f07bd8..000000000
--- a/lotuspond/front/src/Client.js
+++ /dev/null
@@ -1,228 +0,0 @@
-import React from 'react'
-import Address from './Address'
-import Window from './Window'
-import Fil from './Fil'
-
-const dealStates = [
- 'Unknown',
- 'ProposalNotFound',
- 'ProposalRejected',
- 'ProposalAccepted',
- 'Staged',
- 'Sealing',
- 'ProposalSigned',
- 'Published',
- 'Committed',
- 'Active',
- 'Failing',
- 'Recovering',
- 'Expired',
- 'NotFound',
-
- 'Validating',
- 'Transferring',
- 'VerifyData',
- 'Publishing',
- 'Error'
-]
-
-class Client extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {
- miners: ['t0101'],
- ask: { Price: '1000000000' }, // 2x min default ask to account for bin packing (could also do the math correctly below, but..)
-
- kbs: 1,
- blocks: 12,
- total: 36000,
- miner: 't0101',
-
- deals: [],
-
- blockDelay: 10
- }
- }
-
- async componentDidMount() {
- let ver = await this.props.client.call('Filecoin.Version', [])
- this.setState({ blockDelay: ver.BlockDelay })
-
- this.getDeals()
- setInterval(this.getDeals, 1325)
- }
-
- getDeals = async () => {
- let miners = await this.props.client.call('Filecoin.StateListMiners', [
- null
- ])
- let deals = await this.props.client.call('Filecoin.ClientListDeals', [])
- miners.sort()
- this.setState({ deals, miners })
- }
-
- update = name => e => this.setState({ [name]: e.target.value })
-
- makeDeal = async () => {
- let perBlk =
- ((this.state.ask.Price * this.state.kbs * 1000) / (1 << 30)) * 2
-
- let file = await this.props.pondClient.call('Pond.CreateRandomFile', [
- this.state.kbs * 1000
- ]) // 1024 won't fit in 1k blocks :(
- let cid = await this.props.client.call('Filecoin.ClientImport', [
- {
- Path: file,
- IsCar: false
- }
- ])
- let dealcid = await this.props.client.call('Filecoin.ClientStartDeal', [
- cid,
- this.state.miner,
- `${Math.round(perBlk)}`,
- Number(this.state.blocks)
- ])
- console.log('deal cid: ', dealcid)
- }
-
- retrieve = deal => async () => {
- console.log(deal)
- let client = await this.props.client.call(
- 'Filecoin.WalletDefaultAddress',
- []
- )
-
- let order = {
- Root: deal.PieceRef,
- Size: deal.Size,
- // TODO: support offset
- Total: String(deal.Size * 2),
-
- Client: client,
- Miner: deal.Miner
- }
-
- await this.props.client.call('Filecoin.ClientRetrieve', [
- order,
- {
- Path: '/dev/null',
- IsCAR: false
- }
- ])
- }
-
- render() {
- let perBlk = this.state.ask.Price * this.state.kbs * 1000
- let total = perBlk * this.state.blocks
- let days = (this.state.blocks * this.state.blockDelay) / 60 / 60 / 24
-
- let dealMaker = (
-
-
- Make Deal:
-
-
- {' '}
- Ask:{' '}
-
- {this.state.ask.Price}
- {' '}
- Fil/Byte/Block
-
-
-
- Data Size:{' '}
-
- KB; Duration:
-
- Blocks
-
-
- Total: {total}; {days} Days
-
-
-
- )
-
- let deals = this.state.deals.map((deal, i) => (
-
-
- -
- {i}. Proposal: {deal.ProposalCid['/'].substr(0, 18)}...{' '}
-
- : {dealStates[deal.State]}
- {dealStates[deal.State] === 'Complete' ? (
-
-
-
- [Retrieve]
-
-
- ) : (
-
- )}
-
- -
- Data: {deal.PieceRef['/']}, {deal.Size}B; Duration:{' '}
- {deal.Duration}Blocks
-
- -
- Total: {deal.TotalPrice}FIL; Per Block:{' '}
-
- {Math.round((deal.TotalPrice / deal.Duration) * 100) / 100}
-
- FIL; PerMbyteByteBlock:{' '}
-
- {Math.round(
- (deal.TotalPrice / deal.Duration / (deal.Size / 1000000)) *
- 100
- ) / 100}
-
- FIL
-
-
-
-
-
- ))
-
- return (
-
-
-
{dealMaker}
-
{deals}
-
-
- )
- }
-}
-
-export default Client
diff --git a/lotuspond/front/src/ConnMgr.js b/lotuspond/front/src/ConnMgr.js
deleted file mode 100644
index 778d717f8..000000000
--- a/lotuspond/front/src/ConnMgr.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import React from 'react';
-import Window from "./Window";
-
-async function awaitReducer(prev, c) {
- return {...await prev, ...await c}
-}
-
-class ConnMgr extends React.Component {
- constructor(props) {
- super(props)
-
- this.connect = this.connect.bind(this)
- this.connectAll = this.connectAll.bind(this)
- this.connect1 = this.connect1.bind(this)
- this.connectChain = this.connectChain.bind(this)
- this.getActualState = this.getActualState.bind(this)
-
- this.state = {conns: {}, lock: true}
-
- this.getActualState()
- setInterval(this.getActualState, 500)
- }
-
- async getActualState() {
- const nodes = this.props.nodes
- let keys = Object.keys(nodes)
-
- const newConns = await keys.filter((_, i) => i > 0).filter(kfrom => this.props.nodes[kfrom].conn !== undefined).map(async (kfrom, i) => {
- return keys.filter((_, j) => i >= j).filter(kto => this.props.nodes[kto].conn !== undefined).map(async kto => {
-
- const fromNd = this.props.nodes[kfrom]
- const toNd = this.props.nodes[kto]
-
- const connectedness = await fromNd.conn.call('Filecoin.NetConnectedness', [toNd.peerid])
-
- return {[`${kfrom},${kto}`]: connectedness === 1}
- }).reduce(awaitReducer, Promise.resolve({}))
- }).reduce(awaitReducer, Promise.resolve({}))
-
- this.setState({conns: newConns, lock: false})
- }
-
- async connect(action, from, to, noupdate) {
- const fromNd = this.props.nodes[from]
- const toNd = this.props.nodes[to]
-
- if (action) {
- const toPeerInfo = await toNd.conn.call('Filecoin.NetAddrsListen', [])
-
- await fromNd.conn.call('Filecoin.NetConnect', [toPeerInfo])
- } else {
- await fromNd.conn.call('Filecoin.NetDisconnect', [toNd.peerid])
- }
-
- if (!noupdate)
- this.setState(prev => ({conns: {...prev.conns, [`${from},${to}`]: action}}))
- }
-
- connectAll(discon) {
- return () => {
- const nodes = this.props.nodes
- let keys = Object.keys(nodes)
-
- keys.filter((_, i) => i > 0).forEach((kfrom, i) => {
- keys.filter((_, j) => i >= j).forEach((kto, i) => {
- this.connect(!discon, kfrom, kto, true)
- })
- })
- }
- }
-
- connect1() {
- const nodes = this.props.nodes
- let keys = Object.keys(nodes)
-
- keys.filter((_, i) => i > 0).forEach((k, i) => {
- this.connect(true, k, keys[0])
- })
- }
-
- connectChain() {
- const nodes = this.props.nodes
- let keys = Object.keys(nodes)
-
- keys.filter((_, i) => i > 0).forEach((k, i) => {
- this.connect(true, k, keys[i])
- })
- }
-
- render() {
- const nodes = this.props.nodes
- let keys = Object.keys(nodes)
-
- const rows = keys.filter((_, i) => i > 0).map((k, i) => {
- const cols = keys.filter((_, j) => i >= j).map((kt, i) => {
- const checked = this.state.conns[`${k},${kt}`] === true
-
- return (
-
- this.connect(e.target.checked, k, kt)}/>
- |
- )
- })
- return (
- {k} | {cols}
- )
- })
-
- return(
-
-
- | {keys.slice(0, -1).map((i) => ({i} | ))}
- {rows}
-
-
-
-
-
-
-
-
- )
- }
-}
-
-export default ConnMgr
\ No newline at end of file
diff --git a/lotuspond/front/src/Consensus.js b/lotuspond/front/src/Consensus.js
deleted file mode 100644
index 14b4dd6e2..000000000
--- a/lotuspond/front/src/Consensus.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import React from 'react';
-import {BlockLinks} from "./BlockLink";
-import Window from "./Window";
-
-function styleForHDiff(max, act) {
- switch (max - act) {
- case 0:
- return {background: '#004400'}
- case 1:
- return {background: '#aaaa00'}
- default:
- return {background: '#aa0000'}
- }
-}
-
-class Consensus extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {
- maxH: -1,
- tipsets: []
- }
-
- this.updateNodes = this.updateNodes.bind(this)
-
- setInterval(this.updateNodes, 333)
- }
-
- async updateNodes() {
- const nodes = this.props.nodes
- let keys = Object.keys(nodes).filter(k => !nodes[k].Storage)
-
- const tipsets = await keys.map(async k => {
- const tipset = await nodes[k].conn.call("Filecoin.ChainHead", [])
- return [k, tipset]
- }).reduce(async(p, i) => ([...await p, await i]), Promise.resolve([]))
-
- const maxH = tipsets.reduce((p, [_, i]) => Math.max(p, i.Height), -1)
-
- this.setState({maxH, tipsets})
- }
-
- render() {
- return (
-
-
Max Height: {this.state.maxH}
-
-
-
- Node | Height | TipSet |
-
-
- {this.state.tipsets.map(([k, ts]) => {
- return (
-
- {k} | {ts.Height} | |
-
- )
- })}
-
-
-
-
- )
- }
-}
-
-export default Consensus
\ No newline at end of file
diff --git a/lotuspond/front/src/Fil.js b/lotuspond/front/src/Fil.js
deleted file mode 100644
index 85b26e9ec..000000000
--- a/lotuspond/front/src/Fil.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from "react";
-
-function filStr(raw) {
- if(typeof raw !== 'string') {
- raw = String(raw)
- }
- if(raw.length < 19) {
- raw = '0'.repeat(19 - raw.length).concat(raw)
- }
-
- let out = raw.substring(0, raw.length - 18).concat('.', raw.substring(raw.length - 18, raw.length)).replace(/\.0+$|0+$/g, '');
- return out ? out : '0'
-}
-
-
-class Fil extends React.Component {
- render() {
- return filStr(this.props.children)
- }
-}
-
-export default Fil
\ No newline at end of file
diff --git a/lotuspond/front/src/FullNode.js b/lotuspond/front/src/FullNode.js
deleted file mode 100644
index c67faba9f..000000000
--- a/lotuspond/front/src/FullNode.js
+++ /dev/null
@@ -1,173 +0,0 @@
-import React from 'react';
-import { BlockLinks } from "./BlockLink";
-import Address from "./Address";
-import ChainExplorer from "./ChainExplorer";
-import Client from "./Client";
-import Window from "./Window";
-
-class FullNode extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {}
-
- this.loadInfo = this.loadInfo.bind(this)
- this.newSecpAddr = this.newSecpAddr.bind(this)
- this.newBLSAddr = this.newBLSAddr.bind(this)
- this.startStorageMiner = this.startStorageMiner.bind(this)
- this.explorer = this.explorer.bind(this)
- this.client = this.client.bind(this)
- this.stop = this.stop.bind(this)
-
- this.loadInfo()
- let updates = setInterval(this.loadInfo, 2050)
- this.props.client.on('close', () => clearInterval(updates))
- }
-
- async loadInfo() {
- const id = await this.props.client.call("Filecoin.ID", [])
-
- const version = await this.props.client.call("Filecoin.Version", [])
-
- const peers = await this.props.client.call("Filecoin.NetPeers", [])
-
- const tipset = await this.props.client.call("Filecoin.ChainHead", [])
-
- let addrs = await this.props.client.call('Filecoin.WalletList', [])
- let defaultAddr = ""
- if (addrs.length > 0) {
- defaultAddr = await this.props.client.call('Filecoin.WalletDefaultAddress', [])
- }
- let paychs = await this.props.client.call('Filecoin.PaychList', [])
- if(!paychs)
- paychs = []
- const vouchers = await Promise.all(paychs.map(paych => {
- return this.props.client.call('Filecoin.PaychVoucherList', [paych])
- }))
-
- let mpoolPending = (await this.props.client.call('Filecoin.MpoolPending', [tipset.Cids])).length
-
- this.setState(() => ({
- id: id,
- version: version,
- peers: peers.length,
- tipset: tipset,
-
- mpoolPending: mpoolPending,
-
- addrs: addrs,
- paychs: paychs,
- vouchers: vouchers,
-
- defaultAddr: defaultAddr,
- }))
- }
-
- async newSecpAddr() {
- const t = 1
- await this.props.client.call("Filecoin.WalletNew", [t])
- this.loadInfo()
- }
-
- async newBLSAddr() {
- const t = 2
- await this.props.client.call("Filecoin.WalletNew", [t])
- this.loadInfo()
- }
-
- startStorageMiner() {
- this.props.spawnStorageNode(this.props.node.Repo, this.props.client)
- }
-
- explorer() {
- this.props.mountWindow((onClose) => )
- }
-
- client() {
- this.props.mountWindow((onClose) => )
- }
-
- async stop() {
- await this.props.stop()
- }
-
- render() {
- let runtime =
-
- if (this.state.id) {
- let chainInfo =
- if (this.state.tipset !== undefined) {
- chainInfo = (
-
- Head: {
-
- } H:{this.state.tipset.Height} Mp:{this.state.mpoolPending}
[Explore] [Client]
-
- )
- }
-
- let storageMine = [Spawn Miner]
-
- let addresses = this.state.addrs.map((addr) => {
- let line =
- if (this.state.defaultAddr === addr) {
- line = {line}
- }
- return {line}
- })
- let paychannels = this.state.paychs.map((addr, ak) => {
- const line =
- const vouchers = this.state.vouchers[ak].map(voucher => {
- let extra =
- if(voucher.Extra) {
- extra = Verif: <>
- }
-
- return
- Voucher Nonce:{voucher.Nonce} Lane:{voucher.Lane} Amt:{voucher.Amount} TL:{voucher.TimeLock} MinCl:{voucher.MinCloseHeight} {extra}
-
- })
- return
- {line}
- {vouchers}
-
- })
-
- runtime = (
-
-
{this.props.node.ID} - v{this.state.version.Version},
{this.state.id.substr(-8)}, {this.state.peers} peers
-
Repo: LOTUS_PATH={this.props.node.Repo}
- {chainInfo}
-
- {storageMine}
-
-
-
-
{addresses}
-
{paychannels}
-
-
-
- )
- }
-
- let nodeID = this.props.node.ID ? this.props.node.ID : ''
- let nodePos = this.props.node.ID ? {x: this.props.node.ID*30, y: this.props.node.ID * 30} : 'center'
-
- return (
-
-
-
- )
- }
-}
-
-export default FullNode
\ No newline at end of file
diff --git a/lotuspond/front/src/Logs.js b/lotuspond/front/src/Logs.js
deleted file mode 100644
index 3bcf2bbaf..000000000
--- a/lotuspond/front/src/Logs.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import React from 'react'
-import { Terminal } from 'xterm';
-import { AttachAddon } from "xterm-addon-attach";
-import 'xterm/dist/xterm.css';
-import * as fit from 'xterm/lib/addons/fit/fit';
-import Window from "./Window";
-
-class Logs extends React.Component {
- constructor(props) {
- super(props);
- this.termRef = React.createRef()
- this.winRef = React.createRef()
- }
-
- async componentDidMount() {
- Terminal.applyAddon(fit);
-
- this.terminal = new Terminal({convertEol: true, fontSize: 11});
- this.terminal.loadAddon(new AttachAddon(new WebSocket(`ws://127.0.0.1:2222/logs/${this.props.node}`), {bidirectional: false, inputUtf8: true}))
- this.terminal.open(this.termRef.current)
- setInterval(() => this.terminal.fit(), 200)
- }
-
- render() {
- return
-
-
- }
-}
-
-export default Logs
diff --git a/lotuspond/front/src/NodeIndex.js b/lotuspond/front/src/NodeIndex.js
deleted file mode 100644
index 059d562f8..000000000
--- a/lotuspond/front/src/NodeIndex.js
+++ /dev/null
@@ -1,110 +0,0 @@
-import React from 'react';
-import {Link} from "react-router-dom";
-import {Client} from "rpc-websockets";
-
-class Index extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {rpcUrl: "ws://127.0.0.1:1234/rpc/v0", rpcToken: '', conns: {}, info: {}}
-
- const initialState = JSON.parse(window.localStorage.getItem('saved-nodes'))
- if (initialState) {
- this.state.nodes = initialState
- } else {
- this.state.nodes = []
- }
- this.state.nodes.forEach((n, i) => this.connTo(i, n))
- }
-
- componentDidUpdate(prevProps, prevState, snapshot) {
- window.localStorage.setItem('saved-nodes', JSON.stringify(this.state.nodes))
- //this.state.nodes.filter(i => [i, this.state.conns[i]]).forEach(([i, n]) => this.connTo(i, n))
- }
-
- componentWillUnmount() {
- Object.keys(this.state.conns).forEach(c => this.state.conns[c].close())
- }
-
- async updateInfo(n) {
- const conn = this.state.conns[n]
- const head = await conn.call('Filecoin.ChainHead', [])
- const peers = await conn.call('Filecoin.NetPeers', [])
-
- this.setState(p => ({info: {...p.info, [n]: {head, peers}}}))
- }
-
- connTo = async (n, node) => {
- const client = new Client(`${node.addr}?token=${node.token}`)
- client.on('open', async () => {
- this.setState(p => ({conns: {...p.conns, [n]: client}}))
- setInterval(() => this.updateInfo(n), 1333)
- })
- }
-
- onAdd = () => {
- this.setState({addingNode: true})
- }
-
- update = (name) => (e) => this.setState({ [name]: e.target.value })
-
- tokenOk = () => {
- let m = this.state.rpcToken.match(/\.(.+)\./)
- // TODO: eww
- if(m && atob(m[1]) === '{"Allow":["read","write","sign","admin"]}') {
- return (
- -Token OK-
-
-
-
-
- )
- }
- return -Expecting valid admin token-
- }
-
- addNode = async () => {
- this.setState(p => ({nodes: [...p.nodes, {addr: this.state.rpcUrl, token: this.state.rpcToken}], addingNode: true}))
- }
-
- render() {
- return (
-
-
-
- {
- this.state.nodes.map((node, i) => {
- let info =
[no conn]
- if (this.state.info[i]) {
- const ni = this.state.info[i]
- info =
H:{ni.head.Height}; Peers:{ni.peers.length}
- }
-
- return
- {i}. {node.addr} [OPEN UI] {info}
-
}
- )
- }
-
-
[Add Node]
-
-
---------------
-
- + RPC:
-
-
- Token (lotus auth create-token --perm admin
): {this.tokenOk()}
-
-
-
-
-
- )
- }
-}
-
-export default Index
diff --git a/lotuspond/front/src/NodeList.js b/lotuspond/front/src/NodeList.js
deleted file mode 100644
index a29d723c0..000000000
--- a/lotuspond/front/src/NodeList.js
+++ /dev/null
@@ -1,198 +0,0 @@
-import React from 'react';
-import FullNode from "./FullNode";
-import ConnMgr from "./ConnMgr";
-import Consensus from "./Consensus";
-import StorageNode from "./StorageNode";
-import {Client} from "rpc-websockets";
-import pushMessage from "./chain/send";
-import Logs from "./Logs";
-import StorageNodeInit from "./StorageNodeInit";
-import Window from "./Window";
-
-const [NodeUnknown, NodeRunning, NodeStopped] = [0, 1, 2]
-
-class NodeList extends React.Component {
- constructor(props) {
- super(props)
- this.state = {
- existingLoaded: false,
- nodes: {},
-
- showConnMgr: false,
- showConsensus: false,
- }
-
- // This binding is necessary to make `this` work in the callback
- this.spawnNode = this.spawnNode.bind(this)
- this.spawnStorageNode = this.spawnStorageNode.bind(this)
- this.connMgr = this.connMgr.bind(this)
- this.consensus = this.consensus.bind(this)
- this.transferNFrom1 = this.transferNFrom1.bind(this)
-
- this.getNodes()
- }
-
- async mountNode(node) {
- const token = await this.props.client.call('Pond.TokenFor', [node.ID])
-
- const client = new Client(`ws://127.0.0.1:${node.APIPort}/rpc/v0?token=${token}`)
- client.on('open', async () => {
- const id = await client.call("Filecoin.ID", [])
-
- this.setState(prev => ({
- nodes: {
- ...prev.nodes,
- [node.ID]: {...node, conn: client, peerid: id}
- }
- }))
-
- if (!node.Storage) {
- this.props.mountWindow((onClose) =>
- )
- } else {
- const fullId = await this.props.client.call('Pond.FullID', [node.ID])
-
- this.props.mountWindow((onClose) =>
- )
- }
- })
- }
-
- async getNodes() {
- const nds = await this.props.client.call('Pond.Nodes')
- const nodes = nds.reduce((o, i) => {o[i.ID] = i; return o}, {})
- console.log('nds', nodes)
-
- Object.keys(nodes).map(n => nodes[n]).filter(n => n.State === NodeRunning).forEach(n => this.mountNode(n))
-
- this.setState({existingLoaded: true, nodes: nodes})
- }
-
- async transferNFrom1(to, n) {
- const addrss = await this.state.nodes[1].conn.call('Filecoin.WalletList', [])
- const [bestaddr, bal] = await addrss.map(async addr => {
- let balance = 0
- try {
- balance = await this.state.nodes[1].conn.call('Filecoin.WalletBalance', [addr])
- } catch {
- balance = -1
- }
- return [addr, balance]
- }).reduce(async (c, n) => (await c)[1] > (await n)[1] ? await c : await n, Promise.resolve(['', -2]))
-
- await pushMessage(this.state.nodes[1].conn, bestaddr, {
- To: to,
- From: bestaddr,
- Value: String(n),
- })
- }
-
- async spawnNode() {
- const node = await this.props.client.call('Pond.Spawn')
- console.log(node)
- await this.mountNode(node)
-
- this.setState(state => ({nodes: {...state.nodes, [node.ID]: node}}))
- }
-
- async spawnStorageNode(fullRepo, fullConn) {
- let nodePromise = this.props.client.call('Pond.SpawnStorage', [fullRepo])
-
- this.props.mountWindow((onClose) => )
- let node = await nodePromise
- await this.mountNode(node)
-
- //this.setState(state => ({nodes: {...state.nodes, [node.ID]: node}}))
- }
-
- stopNode = (id, closeWindow) => async () => {
- this.state.nodes[id].conn.close()
- await this.props.client.call('Pond.Stop', [id])
- closeWindow()
- this.setState(prev => ({
- nodes: {
- ...prev.nodes,
- [id]: {...(prev.nodes[id]), State: NodeStopped, conn: undefined}
- }
- }))
- }
-
- startNode = (id) => async () => {
- let node = await this.props.client.call('Pond.RestartNode', [Number(id)])
- await this.mountNode(node)
- }
-
- connMgr() {
- this.setState({showConnMgr: true})
- }
-
- consensus() {
- this.setState({showConsensus: true})
- }
-
- render() {
- let connMgr
- if (this.state.showConnMgr) {
- connMgr = ()
- }
-
- let consensus
- if (this.state.showConsensus) {
- consensus = ()
- }
-
- return (
-
-
-
-
-
-
-
-
- {Object.keys(this.state.nodes).map(n => {
- const nd = this.state.nodes[n]
- let type = "FULL"
- if (nd.Storage) {
- type = "STOR"
- }
-
- let logs = "[logs]"
- let info = "[CONNECTING..]"
- if (nd.conn) {
- info =
{nd.peerid}
- logs =
this.props.mountWindow(cl => )}>[logs]
- }
- if (nd.State === NodeStopped) {
- info =
[stopped] [START]
- }
-
- return
- {n} {type} {logs} {info}
-
- })}
-
-
-
- {connMgr}
- {consensus}
-
-
- );
- }
-}
-
-export default NodeList
diff --git a/lotuspond/front/src/Pond.js b/lotuspond/front/src/Pond.js
deleted file mode 100644
index 2b58fd40d..000000000
--- a/lotuspond/front/src/Pond.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import React from 'react';
-import './App.css';
-import { Client } from 'rpc-websockets'
-import NodeList from "./NodeList";
-
-
-class Pond extends React.Component {
- constructor(props) {
- super(props)
-
- const client = new Client('ws://127.0.0.1:2222/rpc/v0')
- client.on('open', () => {
- this.setState(() => ({client: client}))
- })
-
- this.state = {
- windows: {},
- nextWindow: 0,
- }
-
- this.mountWindow = this.mountWindow.bind(this)
- }
-
- mountWindow(cb) {
- const id = this.state.nextWindow
- this.setState({nextWindow: id + 1})
-
- const window = cb(() => {
- this.setState(prev => ({windows: {...prev.windows, [id]: undefined}}))
- })
-
- this.setState(prev => ({windows: {...prev.windows, [id]: window}}))
- }
-
- render() {
- if (this.state.client === undefined) {
- return (
-
-
-
Connecting to Pond RPC
-
-
- )
- }
-
- return (
-
-
-
- {Object.keys(this.state.windows).map((w, i) =>
{this.state.windows[w]}
)}
-
-
- )
- }
-}
-
-export default Pond
diff --git a/lotuspond/front/src/SingleNode.js b/lotuspond/front/src/SingleNode.js
deleted file mode 100644
index a9da918f9..000000000
--- a/lotuspond/front/src/SingleNode.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import React from 'react';
-import './App.css';
-import {Client} from "rpc-websockets";
-import FullNode from "./FullNode";
-
-class SingleNode extends React.Component {
- constructor(props) {
- super(props)
-
- const nodes = JSON.parse(window.localStorage.getItem('saved-nodes'))
- const node = nodes[this.props.match.params.node]
-
- const client = new Client(`${node.addr}?token=${node.token}`)
- client.on('open', async () => {
- this.setState(() => ({client: client}))
- })
-
- this.state = {
- windows: {},
- nextWindow: 0,
-
- addr: node.addr
- }
- }
-
- mountWindow = (cb) => {
- const id = this.state.nextWindow
- this.setState({nextWindow: id + 1})
-
- const window = cb(() => {
- this.setState(prev => ({windows: {...prev.windows, [id]: undefined}}))
- })
-
- this.setState(prev => ({windows: {...prev.windows, [id]: window}}))
- }
-
- render() {
- if (this.state.client === undefined) {
- return (
-
-
-
Connecting to Node RPC:
-
{`${this.state.addr}?token=****`}
-
-
- )
- }
-
- let node =
-
- return (
-
- {node}
-
- {Object.keys(this.state.windows).map((w, i) =>
{this.state.windows[w]}
)}
-
-
- )
- }
-}
-
-export default SingleNode;
diff --git a/lotuspond/front/src/State.js b/lotuspond/front/src/State.js
deleted file mode 100644
index 04175d231..000000000
--- a/lotuspond/front/src/State.js
+++ /dev/null
@@ -1,209 +0,0 @@
-import React from 'react'
-import Window from "./Window";
-import CID from "cids";
-import * as multihash from "multihashes";
-import code from "./chain/code";
-import Address from "./Address";
-import Fil from "./Fil";
-
-class State extends React.Component {
- byCode = {
- [code.init]: InitState,
- [code.power]: PowerState,
- [code.market]: MarketState,
- [code.miner]: MinerState,
- }
-
- constructor(props) {
- super(props)
-
- this.state = {Balance: -2, State: {}}
- }
-
- async componentDidMount() {
- const tipset = this.props.tipset || await this.props.client.call("Filecoin.ChainHead", [])
- const actstate = await this.props.client.call('Filecoin.StateReadState', [this.props.addr, tipset.Cids])
-
- const c = new CID(this.props.actor.Code['/'])
- const mh = multihash.decode(c.multihash)
- let code = mh.digest.toString()
-
- this.setState({...actstate, code: code})
- }
-
- render() {
- let state
- if(this.byCode[this.state.code]) {
- const Stelem = this.byCode[this.state.code]
- state =
- } else {
- state = {Object.keys(this.state.State || {}).map(k =>
{k}: {JSON.stringify(this.state.State[k])}
)}
- }
-
- const content =
-
Balance: {this.state.Balance}
-
---
- {state}
-
- return
- {content}
-
- }
-}
-
-class InitState extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {actors: []}
- }
-
- async componentDidMount() {
- const tipset = await this.props.client.call("Filecoin.ChainHead", []) // TODO: from props
- const actors = await this.props.client.call("Filecoin.StateListActors", [tipset.Cids])
- this.setState({actors: actors})
- }
-
- render() {
- return this.state.actors.sort((a, b) => (Number(a.substr(1)) > Number(b.substr(1))))
- .map(addr => )
- }
-}
-
-class PowerState extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {actors: [], state: {State: {}}}
- }
-
- async componentDidMount() {
- const tipset = await this.props.client.call("Filecoin.ChainHead", []) // TODO: from props
- const actors = await this.props.client.call("Filecoin.StateListMiners", [tipset.Cids])
- const state = await this.props.client.call('Filecoin.StateReadState', [this.props.addr, tipset.Cids])
-
- this.setState({actors, state})
- }
-
- render() {
- return
-
-
Total Power: {this.state.state.State.TotalStorage}
-
-
---
-
{this.state.actors.sort((a, b) => (Number(a.substr(1)) > Number(b.substr(1))))
- .map(addr =>
)}
-
- }
-}
-
-class MarketState extends React.Component {
- constructor(props) {
- super(props)
- this.state = {participants: {}, deals: []}
- }
-
- async componentDidMount() {
- const tipset = await this.props.client.call("Filecoin.ChainHead", []) // TODO: from props
- const participants = await this.props.client.call("Filecoin.StateMarketParticipants", [tipset.Cids])
- const deals = await this.props.client.call("Filecoin.StateMarketDeals", [tipset.Cids])
- const state = await this.props.client.call('Filecoin.StateReadState', [this.props.addr, tipset.Cids])
- this.setState({participants, deals, nextDeal: state.State.NextDealID})
- }
-
- render() {
- return
-
-
Participants:
-
- Address | Available | Locked |
- {Object.keys(this.state.participants).map(p =>
- |
- {this.state.participants[p].Available} |
- {this.state.participants[p].Locked} |
-
)}
-
-
-
-
---
-
Deals ({this.state.nextDeal} Total):
-
- id | Started | Client | Provider | Size | Price | Duration |
- {Object.keys(this.state.deals).map(d =>
- {d} |
- {this.state.deals[d].State.SectorStartEpoch || "No"} |
- |
- |
- {this.state.deals[d].Proposal.PieceSize}B |
- {this.state.deals[d].Proposal.StoragePricePerEpoch*(this.state.deals[d].Proposal.EndEpoch-this.state.deals[d].Proposal.StartEpoch)} |
- {this.state.deals[d].Proposal.EndEpoch-this.state.deals[d].Proposal.StartEpoch} |
-
)}
-
-
-
- }
-}
-
-class MinerState extends React.Component {
- constructor(props) {
- super(props)
- this.state = {state: {}, sectorSize: -1, worker: "", networkPower: 0, sectors: {}}
- }
-
- async componentDidMount() {
- const tipset = await this.props.client.call("Filecoin.ChainHead", []) // TODO: from props
-
- const state = await this.props.client.call('Filecoin.StateReadState', [this.props.addr, tipset.Cids])
- const sectorSize = await this.props.client.call("Filecoin.StateMinerSectorSize", [this.props.addr, tipset.Cids])
- const worker = await this.props.client.call("Filecoin.StateMinerWorker", [this.props.addr, tipset.Cids])
-
- const tpow = await this.props.client.call("Filecoin.StateMinerPower", [this.props.addr, tipset.Cids])
- const networkPower = tpow.TotalPower
-
- let sectors = {}
-
- const sset = await this.props.client.call("Filecoin.StateMinerSectors", [this.props.addr, tipset.Cids]) || []
- const pset = await this.props.client.call("Filecoin.StateMinerProvingSet", [this.props.addr, tipset.Cids]) || []
-
- sset.forEach(s => sectors[s.SectorID] = {...s, sectorSet: true})
- pset.forEach(s => sectors[s.SectorID] = {...(sectors[s.SectorID] || s), provingSet: true})
-
- this.setState({state, sectorSize, worker, networkPower, sectors})
- }
-
- render() {
- if (!this.state.worker) {
- return (...)
- }
-
- let state = this.state.state.State
-
- return
-
-
Sector Size: {this.state.sectorSize/1024} KiB
-
Power: todoPower ({1/this.state.networkPower*100}%)
-
Election Period Start: {state.ElectionPeriodStart}
-
Slashed: {state.SlashedAt === 0 ? "NO" : state.SlashedAt}
-
-
----
-
Sectors:
-
-
- ID | CommD | CommR | SectorSet | Proving |
-
-
- {Object.keys(this.state.sectors).map(sid =>
- {sid} |
- {this.state.sectors[sid].CommD} |
- {this.state.sectors[sid].CommR} |
- {this.state.sectors[sid].sectorSet ? 'X' : ' '} |
- {this.state.sectors[sid].provingSet ? 'X' : ' '} |
-
)}
-
-
-
-
- }
-}
-
-export default State
\ No newline at end of file
diff --git a/lotuspond/front/src/StorageNode.js b/lotuspond/front/src/StorageNode.js
deleted file mode 100644
index 9026cdb94..000000000
--- a/lotuspond/front/src/StorageNode.js
+++ /dev/null
@@ -1,161 +0,0 @@
-import React from 'react';
-import { Client } from 'rpc-websockets'
-import Address from "./Address";
-import Window from "./Window";
-
-const stateConnected = 'connected'
-const stateConnecting = 'connecting'
-const stateGettingToken = 'getting-token'
-
-let sealCodes = [
- "UndefinedSectorState",
- "Empty",
- "Packing",
- "Unsealed",
- "PreCommitting",
- "WaitSeed",
- "Committing",
- "CommitWait",
- "FinalizeSector",
- "Proving",
-
- "SealFailed",
- "PreCommitFailed",
- "SealCommitFailed",
- "CommitFailed",
- "PackingFailed",
-
- "FailedUnrecoverable",
- "Faulty",
- "FaultReported",
- "FaultedFinal",
-]
-
-class StorageNode extends React.Component {
- constructor(props) {
- super(props)
-
- this.state = {
- state: stateGettingToken,
- id: "~",
-
- mining: false,
-
- statusCounts: [0, 0, 0, 0, 0]
- }
-
- this.loadInfo = this.loadInfo.bind(this)
- this.pledgeSector = this.pledgeSector.bind(this)
- this.stop = this.stop.bind(this)
-
- this.connect()
- }
-
- async connect() {
- const token = await this.props.pondClient.call('Pond.TokenFor', [this.props.node.ID])
-
- this.setState(() => ({
- state: stateConnecting,
- token: token,
- }))
-
- const client = new Client(`ws://127.0.0.1:${this.props.node.APIPort}/rpc/v0?token=${token}`)
- client.on('open', async () => {
- this.setState(() => ({
- state: stateConnected,
- client: client,
-
- version: {Version: "~version~"},
- id: "~peerid~",
- peers: -1,
- balances: []
- }))
-
- const id = await this.state.client.call("Filecoin.ID", [])
- this.setState(() => ({id: id}))
-
- // this.props.onConnect(client, id) // TODO: dedupe connecting part
-
- let updates = setInterval(this.loadInfo, 1050)
- client.on('close', () => clearInterval(updates))
- })
-
- console.log(token) // todo: use
- }
-
- async loadInfo() {
- const version = await this.state.client.call("Filecoin.Version", [])
- const peers = await this.state.client.call("Filecoin.NetPeers", [])
- const actor = await this.state.client.call("Filecoin.ActorAddress", [])
-
- const actorState = await this.props.fullConn.call('Filecoin.StateReadState', [actor, null])
-
- this.setState({version: version, peers: peers.length, actor: actor, actorState: actorState})
- await this.stagedList()
- }
-
- async stagedList() {
- let stagedList = await this.state.client.call("Filecoin.SectorsList", [])
- let staged = await stagedList
- .map(sector => this.state.client.call("Filecoin.SectorsStatus", [sector, false]))
- .reduce(async (p, n) => [...await p, await n], Promise.resolve([]))
-
- let statusCounts = staged.reduce((p, n) => p.map((e, i) => e + (i === n.State ? 1 : 0) ), [0, 0, 0, 0, 0])
-
- this.setState({staged, statusCounts})
- }
-
- async pledgeSector() {
- await this.state.client.call("Filecoin.PledgeSector", [])
- }
-
- sealStaged = async () => {
- await this.state.client.call("Filecoin.SectorsStagedSeal", [])
- }
-
- async stop() {
- await this.props.stop()
- }
-
- render() {
- let runtime =
- if (this.state.actor) {
- const pledgeSector = [Pledge Sector]
- const sealStaged = [Seal Staged]
-
- runtime = (
-
-
v{this.state.version.Version},
{this.state.id.substr(-8)}, {this.state.peers} peers
-
Repo: LOTUS_MINER_PATH={this.props.node.Repo}
-
- {pledgeSector} {sealStaged}
-
-
-
- EPS: {this.state.actorState.State.ElectionPeriodStart}
-
-
{this.state.statusCounts.map((c, i) => {sealCodes[i]}: {c} | )}
-
- {this.state.staged ? this.state.staged.map((s, i) => (
-
{s.SectorID} {sealCodes[s.State] || `unk ${s.State}`}
- )) :
}
-
-
-
- )
- }
-
- return
-
-
- }
-}
-
-export default StorageNode
\ No newline at end of file
diff --git a/lotuspond/front/src/StorageNodeInit.js b/lotuspond/front/src/StorageNodeInit.js
deleted file mode 100644
index 4ffe7c075..000000000
--- a/lotuspond/front/src/StorageNodeInit.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import React from 'react';
-import Window from "./Window";
-
-class StorageNodeInit extends React.Component {
- async componentDidMount() {
- const info = await this.props.node
-
- this.props.onClose()
- //this.props.mountWindow((onClose) => )
- }
-
- render() {
- return
-
-
- Waiting for init, make sure at least one miner is enabled
-
-
-
- }
-}
-
-export default StorageNodeInit
\ No newline at end of file
diff --git a/lotuspond/front/src/Window.js b/lotuspond/front/src/Window.js
deleted file mode 100644
index b3dd4340f..000000000
--- a/lotuspond/front/src/Window.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import React from 'react'
-import {Cristal} from "react-cristal";
-
-class Window extends React.Component {
- render() {
- let props = {className: '', ...this.props}
- props.className = `${props.className} Window`
-
- return
- {this.props.children}
-
- }
-}
-
-export default Window
diff --git a/lotuspond/front/src/chain/code.json b/lotuspond/front/src/chain/code.json
deleted file mode 100644
index 098b40244..000000000
--- a/lotuspond/front/src/chain/code.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "account": "fil/1/account",
- "cron": "fil/1/cron",
- "init": "fil/1/init",
- "market": "fil/1/storagemarket",
- "miner": "fil/1/storageminer",
- "multisig": "fil/1/multisig",
- "paych": "fil/1/paymentchannel",
- "power": "fil/1/storagepower",
- "reward": "fil/1/reward",
- "system": "fil/1/system",
- "verifreg": "fil/1/verifiedregistry"
-}
\ No newline at end of file
diff --git a/lotuspond/front/src/chain/methodgen.go b/lotuspond/front/src/chain/methodgen.go
deleted file mode 100644
index da174bfaa..000000000
--- a/lotuspond/front/src/chain/methodgen.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "io/ioutil"
- "os"
-
- "github.com/filecoin-project/go-state-types/abi"
-
- "github.com/filecoin-project/lotus/chain/actors/builtin"
- "github.com/filecoin-project/lotus/chain/consensus/filcns"
-)
-
-func main() {
- if _, err := os.Stat("code.json"); err != nil {
- panic(err) // note: must run in lotuspond/front/src/chain
- }
-
- // TODO: ActorUpgrade: this is going to be a problem.
- names := map[string]string{
- "system": "fil/1/system",
- "init": "fil/1/init",
- "cron": "fil/1/cron",
- "account": "fil/1/account",
- "power": "fil/1/storagepower",
- "miner": "fil/1/storageminer",
- "market": "fil/1/storagemarket",
- "paych": "fil/1/paymentchannel",
- "multisig": "fil/1/multisig",
- "reward": "fil/1/reward",
- "verifreg": "fil/1/verifiedregistry",
- }
-
- {
- b, err := json.MarshalIndent(names, "", " ")
- if err != nil {
- panic(err)
- }
-
- if err := ioutil.WriteFile("code.json", b, 0664); err != nil {
- panic(err)
- }
- }
-
- out := map[string][]string{}
-
- for c, methods := range filcns.NewActorRegistry().Methods {
- name := builtin.ActorNameByCode(c)
- remaining := len(methods)
-
- // iterate over actor methods in order.
- for i := abi.MethodNum(0); remaining > 0; i++ {
- m, ok := methods[i]
- if !ok {
- continue
- }
- out[name] = append(out[name], m.Name)
- remaining--
- }
- }
-
- {
- b, err := json.MarshalIndent(out, "", " ")
- if err != nil {
- panic(err)
- }
-
- if err := ioutil.WriteFile("methods.json", b, 0664); err != nil {
- panic(err)
- }
- }
-}
diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json
deleted file mode 100644
index 938105528..000000000
--- a/lotuspond/front/src/chain/methods.json
+++ /dev/null
@@ -1,842 +0,0 @@
-{
- "fil/1/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/1/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/1/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/1/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/1/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/1/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/1/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/1/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "AddLockedFund",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers"
- ],
- "fil/1/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "OnEpochTickEnd",
- "UpdatePledgeTotal",
- "OnConsensusFault",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/1/system": [
- "Send",
- "Constructor"
- ],
- "fil/1/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes"
- ],
- "fil/2/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/2/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/2/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/2/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/2/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/2/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/2/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/2/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "ApplyRewards",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers",
- "ConfirmUpdateWorkerKey",
- "RepayDebt",
- "ChangeOwnerAddress"
- ],
- "fil/2/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "OnEpochTickEnd",
- "UpdatePledgeTotal",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/2/system": [
- "Send",
- "Constructor"
- ],
- "fil/2/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes"
- ],
- "fil/3/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/3/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/3/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/3/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/3/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/3/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/3/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/3/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "ApplyRewards",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers",
- "ConfirmUpdateWorkerKey",
- "RepayDebt",
- "ChangeOwnerAddress",
- "DisputeWindowedPoSt"
- ],
- "fil/3/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "OnEpochTickEnd",
- "UpdatePledgeTotal",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/3/system": [
- "Send",
- "Constructor"
- ],
- "fil/3/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes"
- ],
- "fil/4/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/4/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/4/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/4/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/4/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/4/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/4/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/4/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "ApplyRewards",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers",
- "ConfirmUpdateWorkerKey",
- "RepayDebt",
- "ChangeOwnerAddress",
- "DisputeWindowedPoSt"
- ],
- "fil/4/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "OnEpochTickEnd",
- "UpdatePledgeTotal",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/4/system": [
- "Send",
- "Constructor"
- ],
- "fil/4/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes"
- ],
- "fil/5/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/5/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/5/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/5/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/5/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/5/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/5/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/5/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "ApplyRewards",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers",
- "ConfirmUpdateWorkerKey",
- "RepayDebt",
- "ChangeOwnerAddress",
- "DisputeWindowedPoSt",
- "PreCommitSectorBatch",
- "ProveCommitAggregate"
- ],
- "fil/5/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "OnEpochTickEnd",
- "UpdatePledgeTotal",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/5/system": [
- "Send",
- "Constructor"
- ],
- "fil/5/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes"
- ],
- "fil/6/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/6/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/6/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/6/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/6/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/6/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/6/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/6/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "ApplyRewards",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers",
- "ConfirmUpdateWorkerKey",
- "RepayDebt",
- "ChangeOwnerAddress",
- "DisputeWindowedPoSt",
- "PreCommitSectorBatch",
- "ProveCommitAggregate"
- ],
- "fil/6/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "OnEpochTickEnd",
- "UpdatePledgeTotal",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/6/system": [
- "Send",
- "Constructor"
- ],
- "fil/6/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes"
- ],
- "fil/7/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/7/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/7/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/7/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/7/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/7/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/7/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/7/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "ApplyRewards",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers",
- "ConfirmUpdateWorkerKey",
- "RepayDebt",
- "ChangeOwnerAddress",
- "DisputeWindowedPoSt",
- "PreCommitSectorBatch",
- "ProveCommitAggregate",
- "ProveReplicaUpdates"
- ],
- "fil/7/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "CronTick",
- "UpdatePledgeTotal",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/7/system": [
- "Send",
- "Constructor"
- ],
- "fil/7/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes",
- "RemoveVerifiedClientDataCap"
- ],
- "fil/8/account": [
- "Send",
- "Constructor",
- "PubkeyAddress"
- ],
- "fil/8/cron": [
- "Send",
- "Constructor",
- "EpochTick"
- ],
- "fil/8/init": [
- "Send",
- "Constructor",
- "Exec"
- ],
- "fil/8/multisig": [
- "Send",
- "Constructor",
- "Propose",
- "Approve",
- "Cancel",
- "AddSigner",
- "RemoveSigner",
- "SwapSigner",
- "ChangeNumApprovalsThreshold",
- "LockBalance"
- ],
- "fil/8/paymentchannel": [
- "Send",
- "Constructor",
- "UpdateChannelState",
- "Settle",
- "Collect"
- ],
- "fil/8/reward": [
- "Send",
- "Constructor",
- "AwardBlockReward",
- "ThisEpochReward",
- "UpdateNetworkKPI"
- ],
- "fil/8/storagemarket": [
- "Send",
- "Constructor",
- "AddBalance",
- "WithdrawBalance",
- "PublishStorageDeals",
- "VerifyDealsForActivation",
- "ActivateDeals",
- "OnMinerSectorsTerminate",
- "ComputeDataCommitment",
- "CronTick"
- ],
- "fil/8/storageminer": [
- "Send",
- "Constructor",
- "ControlAddresses",
- "ChangeWorkerAddress",
- "ChangePeerID",
- "SubmitWindowedPoSt",
- "PreCommitSector",
- "ProveCommitSector",
- "ExtendSectorExpiration",
- "TerminateSectors",
- "DeclareFaults",
- "DeclareFaultsRecovered",
- "OnDeferredCronEvent",
- "CheckSectorProven",
- "ApplyRewards",
- "ReportConsensusFault",
- "WithdrawBalance",
- "ConfirmSectorProofsValid",
- "ChangeMultiaddrs",
- "CompactPartitions",
- "CompactSectorNumbers",
- "ConfirmUpdateWorkerKey",
- "RepayDebt",
- "ChangeOwnerAddress",
- "DisputeWindowedPoSt",
- "PreCommitSectorBatch",
- "ProveCommitAggregate",
- "ProveReplicaUpdates"
- ],
- "fil/8/storagepower": [
- "Send",
- "Constructor",
- "CreateMiner",
- "UpdateClaimedPower",
- "EnrollCronEvent",
- "CronTick",
- "UpdatePledgeTotal",
- "SubmitPoRepForBulkVerify",
- "CurrentTotalPower"
- ],
- "fil/8/system": [
- "Send",
- "Constructor"
- ],
- "fil/8/verifiedregistry": [
- "Send",
- "Constructor",
- "AddVerifier",
- "RemoveVerifier",
- "AddVerifiedClient",
- "UseBytes",
- "RestoreBytes",
- "RemoveVerifiedClientDataCap"
- ]
-}
\ No newline at end of file
diff --git a/lotuspond/front/src/chain/send.js b/lotuspond/front/src/chain/send.js
deleted file mode 100644
index c0d36b0a3..000000000
--- a/lotuspond/front/src/chain/send.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import util from 'ipld-dag-cbor'
-import { Buffer } from 'buffer'
-import { Tagged } from 'borc'
-
-async function pushMessage(client, from, inmsg) {
- if(!inmsg.Params) {
- inmsg.Params = "oA==" // 0b101_00000: empty cbor map: {}
- }
- if(!inmsg.Value) {
- inmsg.Value = "0"
- }
- if(!inmsg.Method) {
- inmsg.Method = 0
- }
-
-/* const msg = [
- inmsg.To,
- inmsg.From,
-
- inmsg.Nonce,
-
- inmsg.Value,
-
- inmsg.GasPrice,
- inmsg.GasLimit,
-
- inmsg.Method,
- Buffer.from(inmsg.Params, 'base64'),
- ]*/
-
- console.log(inmsg)
-
- await client.call('Filecoin.MpoolPushMessage', [inmsg, null])
-}
-
-export default pushMessage
diff --git a/lotuspond/front/src/index.css b/lotuspond/front/src/index.css
deleted file mode 100644
index 82ecd1213..000000000
--- a/lotuspond/front/src/index.css
+++ /dev/null
@@ -1,18 +0,0 @@
-body {
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
- "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
- sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
- monospace;
-}
-
-input[type=text] {
- -webkit-appearance: none;
- appearance: none;
-}
diff --git a/lotuspond/front/src/index.js b/lotuspond/front/src/index.js
deleted file mode 100644
index 395b74997..000000000
--- a/lotuspond/front/src/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from 'react';
-import ReactDOM from 'react-dom';
-import './index.css';
-import App from './App';
-
-ReactDOM.render(, document.getElementById('root'));
diff --git a/lotuspond/main.go b/lotuspond/main.go
deleted file mode 100644
index ec01e8b42..000000000
--- a/lotuspond/main.go
+++ /dev/null
@@ -1,162 +0,0 @@
-package main
-
-import (
- "fmt"
- "net/http"
- "os"
- "os/exec"
- "path"
- "strconv"
-
- "github.com/urfave/cli/v2"
-
- "github.com/filecoin-project/go-jsonrpc"
-)
-
-const listenAddr = "127.0.0.1:2222"
-
-type runningNode struct {
- cmd *exec.Cmd
- meta nodeInfo
-
- mux *outmux
- stop func()
-}
-
-var onCmd = &cli.Command{
- Name: "on",
- Usage: "run a command on a given node",
- Action: func(cctx *cli.Context) error {
- client, err := apiClient(cctx.Context)
- if err != nil {
- return err
- }
-
- nd, err := strconv.ParseInt(cctx.Args().Get(0), 10, 32)
- if err != nil {
- return err
- }
-
- node := nodeByID(client.Nodes(), int(nd))
- var cmd *exec.Cmd
- if !node.Storage {
- cmd = exec.Command("./lotus", cctx.Args().Slice()[1:]...)
- cmd.Env = []string{
- "LOTUS_PATH=" + node.Repo,
- }
- } else {
- cmd = exec.Command("./lotus-miner")
- cmd.Env = []string{
- "LOTUS_MINER_PATH=" + node.Repo,
- "LOTUS_PATH=" + node.FullNode,
- }
- }
-
- cmd.Stdin = os.Stdin
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
-
- err = cmd.Run()
- return err
- },
-}
-
-var shCmd = &cli.Command{
- Name: "sh",
- Usage: "spawn shell with node shell variables set",
- Action: func(cctx *cli.Context) error {
- client, err := apiClient(cctx.Context)
- if err != nil {
- return err
- }
-
- nd, err := strconv.ParseInt(cctx.Args().Get(0), 10, 32)
- if err != nil {
- return err
- }
-
- node := nodeByID(client.Nodes(), int(nd))
- shcmd := exec.Command("/bin/bash")
- if !node.Storage {
- shcmd.Env = []string{
- "LOTUS_PATH=" + node.Repo,
- }
- } else {
- shcmd.Env = []string{
- "LOTUS_MINER_PATH=" + node.Repo,
- "LOTUS_PATH=" + node.FullNode,
- }
- }
-
- shcmd.Env = append(os.Environ(), shcmd.Env...)
-
- shcmd.Stdin = os.Stdin
- shcmd.Stdout = os.Stdout
- shcmd.Stderr = os.Stderr
-
- fmt.Printf("Entering shell for Node %d\n", nd)
- err = shcmd.Run()
- fmt.Printf("Closed pond shell\n")
-
- return err
- },
-}
-
-func nodeByID(nodes []nodeInfo, i int) nodeInfo {
- for _, n := range nodes {
- if n.ID == int32(i) {
- return n
- }
- }
- panic("no node with this id")
-}
-
-func logHandler(api *api) func(http.ResponseWriter, *http.Request) {
- return func(w http.ResponseWriter, req *http.Request) {
- id, err := strconv.ParseInt(path.Base(req.URL.Path), 10, 32)
- if err != nil {
- panic(err)
- }
-
- api.runningLk.Lock()
- n := api.running[int32(id)]
- api.runningLk.Unlock()
-
- n.mux.ServeHTTP(w, req)
- }
-}
-
-var runCmd = &cli.Command{
- Name: "run",
- Usage: "run lotuspond daemon",
- Action: func(cctx *cli.Context) error {
- rpcServer := jsonrpc.NewServer()
- a := &api{running: map[int32]*runningNode{}}
- rpcServer.Register("Pond", a)
-
- http.Handle("/", http.FileServer(http.Dir("lotuspond/front/build")))
- http.HandleFunc("/app/", func(w http.ResponseWriter, r *http.Request) {
- http.ServeFile(w, r, "lotuspond/front/build/index.html")
- })
-
- http.Handle("/rpc/v0", rpcServer)
- http.HandleFunc("/logs/", logHandler(a))
-
- fmt.Printf("Listening on http://%s\n", listenAddr)
- return http.ListenAndServe(listenAddr, nil)
- },
-}
-
-func main() {
- app := &cli.App{
- Name: "pond",
- Commands: []*cli.Command{
- runCmd,
- shCmd,
- onCmd,
- },
- }
- if err := app.Run(os.Args); err != nil {
- panic(err)
- }
-}
diff --git a/lotuspond/outmux.go b/lotuspond/outmux.go
deleted file mode 100644
index 199c83ef1..000000000
--- a/lotuspond/outmux.go
+++ /dev/null
@@ -1,127 +0,0 @@
-package main
-
-import (
- "bufio"
- "fmt"
- "io"
- "net/http"
- "strings"
-
- "github.com/gorilla/websocket"
- "github.com/opentracing/opentracing-go/log"
-)
-
-type outmux struct {
- errpw *io.PipeWriter
- outpw *io.PipeWriter
-
- errpr *io.PipeReader
- outpr *io.PipeReader
-
- n uint64
- outs map[uint64]*websocket.Conn
-
- new chan *websocket.Conn
- stop chan struct{}
-}
-
-func newWsMux() *outmux {
- out := &outmux{
- n: 0,
- outs: map[uint64]*websocket.Conn{},
- new: make(chan *websocket.Conn),
- stop: make(chan struct{}),
- }
-
- out.outpr, out.outpw = io.Pipe()
- out.errpr, out.errpw = io.Pipe()
-
- go out.run()
-
- return out
-}
-
-func (m *outmux) msgsToChan(r *io.PipeReader, ch chan []byte) {
- defer close(ch)
- br := bufio.NewReader(r)
-
- for {
- buf, _, err := br.ReadLine()
- if err != nil {
- return
- }
- out := make([]byte, len(buf)+1)
- copy(out, buf)
- out[len(out)-1] = '\n'
-
- select {
- case ch <- out:
- case <-m.stop:
- return
- }
- }
-}
-
-func (m *outmux) run() {
- stdout := make(chan []byte)
- stderr := make(chan []byte)
- go m.msgsToChan(m.outpr, stdout)
- go m.msgsToChan(m.errpr, stderr)
-
- for {
- select {
- case msg := <-stdout:
- for k, out := range m.outs {
- if err := out.WriteMessage(websocket.BinaryMessage, msg); err != nil {
- _ = out.Close()
- fmt.Printf("outmux write failed: %s\n", err)
- delete(m.outs, k)
- }
- }
- case msg := <-stderr:
- for k, out := range m.outs {
- if err := out.WriteMessage(websocket.BinaryMessage, msg); err != nil {
- out.Close()
- fmt.Printf("outmux write failed: %s\n", err)
- delete(m.outs, k)
- }
- }
- case c := <-m.new:
- m.n++
- m.outs[m.n] = c
- case <-m.stop:
- for _, out := range m.outs {
- out.Close()
- }
- return
- }
- }
-}
-
-var upgrader = websocket.Upgrader{
- CheckOrigin: func(r *http.Request) bool {
- return true
- },
-}
-
-func (m *outmux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- if !strings.Contains(r.Header.Get("Connection"), "Upgrade") {
- fmt.Println("noupgrade")
- w.WriteHeader(500)
- return
- }
-
- w.Header().Set("Access-Control-Allow-Origin", "*")
- if r.Header.Get("Sec-WebSocket-Protocol") != "" {
- w.Header().Set("Sec-WebSocket-Protocol", r.Header.Get("Sec-WebSocket-Protocol"))
- }
-
- c, err := upgrader.Upgrade(w, r, nil)
- if err != nil {
- log.Error(err)
- w.WriteHeader(500)
- return
- }
-
- m.new <- c
-}
diff --git a/lotuspond/spawn.go b/lotuspond/spawn.go
deleted file mode 100644
index b38d28140..000000000
--- a/lotuspond/spawn.go
+++ /dev/null
@@ -1,280 +0,0 @@
-package main
-
-import (
- "encoding/json"
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "sync/atomic"
- "time"
-
- "github.com/google/uuid"
- "golang.org/x/xerrors"
-
- "github.com/filecoin-project/go-address"
- "github.com/filecoin-project/go-state-types/abi"
-
- "github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
- "github.com/filecoin-project/lotus/chain/actors/policy"
- "github.com/filecoin-project/lotus/chain/gen"
- genesis2 "github.com/filecoin-project/lotus/chain/gen/genesis"
- "github.com/filecoin-project/lotus/chain/types"
- "github.com/filecoin-project/lotus/cmd/lotus-seed/seed"
- "github.com/filecoin-project/lotus/genesis"
-)
-
-func init() {
- policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg2KiBV1)
-}
-
-func (api *api) Spawn() (nodeInfo, error) {
- dir, err := ioutil.TempDir(os.TempDir(), "lotus-")
- if err != nil {
- return nodeInfo{}, err
- }
-
- params := []string{"daemon", "--bootstrap=false"}
- genParam := "--genesis=" + api.genesis
-
- id := atomic.AddInt32(&api.cmds, 1)
- if id == 1 {
- // preseal
-
- genMiner, err := address.NewIDAddress(genesis2.MinerStart)
- if err != nil {
- return nodeInfo{}, err
- }
-
- sbroot := filepath.Join(dir, "preseal")
- spt, err := miner.SealProofTypeFromSectorSize(2<<10, build.NewestNetworkVersion)
- if err != nil {
- return nodeInfo{}, err
- }
-
- genm, ki, err := seed.PreSeal(genMiner, spt, 0, 2, sbroot, []byte("8"), nil, false)
- if err != nil {
- return nodeInfo{}, xerrors.Errorf("preseal failed: %w", err)
- }
-
- if err := seed.WriteGenesisMiner(genMiner, sbroot, genm, ki); err != nil {
- return nodeInfo{}, xerrors.Errorf("failed to write genminer info: %w", err)
- }
- params = append(params, "--import-key="+filepath.Join(dir, "preseal", "pre-seal-t01000.key"))
- params = append(params, "--genesis-template="+filepath.Join(dir, "preseal", "genesis-template.json"))
-
- // Create template
-
- var template genesis.Template
- template.Miners = append(template.Miners, *genm)
- template.Accounts = append(template.Accounts, genesis.Actor{
- Type: genesis.TAccount,
- Balance: types.FromFil(5000000),
- Meta: (&genesis.AccountMeta{Owner: genm.Owner}).ActorMeta(),
- })
- template.VerifregRootKey = gen.DefaultVerifregRootkeyActor
- template.RemainderAccount = gen.DefaultRemainderAccountActor
- template.NetworkName = "pond-" + uuid.New().String()
- template.NetworkVersion = build.NewestNetworkVersion
-
- tb, err := json.Marshal(&template)
- if err != nil {
- return nodeInfo{}, xerrors.Errorf("marshal genesis template: %w", err)
- }
-
- if err := ioutil.WriteFile(filepath.Join(dir, "preseal", "genesis-template.json"), tb, 0664); err != nil {
- return nodeInfo{}, xerrors.Errorf("write genesis template: %w", err)
- }
-
- // make genesis
- genf, err := ioutil.TempFile(os.TempDir(), "lotus-genesis-")
- if err != nil {
- return nodeInfo{}, err
- }
-
- api.genesis = genf.Name()
- genParam = "--lotus-make-genesis=" + api.genesis
-
- if err := genf.Close(); err != nil {
- return nodeInfo{}, err
- }
-
- }
-
- errlogfile, err := os.OpenFile(dir+".err.log", os.O_CREATE|os.O_WRONLY, 0644)
- if err != nil {
- return nodeInfo{}, err
- }
- logfile, err := os.OpenFile(dir+".out.log", os.O_CREATE|os.O_WRONLY, 0644)
- if err != nil {
- return nodeInfo{}, err
- }
-
- mux := newWsMux()
- confStr := fmt.Sprintf("[API]\nListenAddress = \"/ip4/127.0.0.1/tcp/%d/http\"\n", 2500+id)
-
- err = ioutil.WriteFile(filepath.Join(dir, "config.toml"), []byte(confStr), 0700)
- if err != nil {
- return nodeInfo{}, err
- }
-
- cmd := exec.Command("./lotus", append(params, genParam)...)
-
- cmd.Stderr = io.MultiWriter(os.Stderr, errlogfile, mux.errpw)
- cmd.Stdout = io.MultiWriter(os.Stdout, logfile, mux.outpw)
- cmd.Env = append(os.Environ(), "LOTUS_PATH="+dir)
- if err := cmd.Start(); err != nil {
- return nodeInfo{}, err
- }
-
- info := nodeInfo{
- Repo: dir,
- ID: id,
- APIPort: 2500 + id,
- State: NodeRunning,
- }
-
- api.runningLk.Lock()
- api.running[id] = &runningNode{
- cmd: cmd,
- meta: info,
-
- mux: mux,
- stop: func() {
- cmd.Process.Signal(os.Interrupt)
- cmd.Process.Wait()
-
- api.runningLk.Lock()
- api.running[id].meta.State = NodeStopped
- api.runningLk.Unlock()
- },
- }
- api.runningLk.Unlock()
-
- time.Sleep(time.Millisecond * 750) // TODO: Something less terrible
-
- return info, nil
-}
-
-func (api *api) SpawnStorage(fullNodeRepo string) (nodeInfo, error) {
- dir, err := ioutil.TempDir(os.TempDir(), "lotus-storage-")
- if err != nil {
- return nodeInfo{}, err
- }
-
- errlogfile, err := os.OpenFile(dir+".err.log", os.O_CREATE|os.O_WRONLY, 0644)
- if err != nil {
- return nodeInfo{}, err
- }
- logfile, err := os.OpenFile(dir+".out.log", os.O_CREATE|os.O_WRONLY, 0644)
- if err != nil {
- return nodeInfo{}, err
- }
-
- initArgs := []string{"init", "--nosync"}
- if fullNodeRepo == api.running[1].meta.Repo {
- presealPrefix := filepath.Join(fullNodeRepo, "preseal")
- initArgs = []string{"init", "--actor=t01000", "--genesis-miner", "--pre-sealed-sectors=" + presealPrefix, "--pre-sealed-metadata=" + filepath.Join(presealPrefix, "pre-seal-t01000.json")}
- }
-
- id := atomic.AddInt32(&api.cmds, 1)
- cmd := exec.Command("./lotus-miner", initArgs...)
- cmd.Stderr = io.MultiWriter(os.Stderr, errlogfile)
- cmd.Stdout = io.MultiWriter(os.Stdout, logfile)
- cmd.Env = append(os.Environ(), "LOTUS_MINER_PATH="+dir, "LOTUS_PATH="+fullNodeRepo)
- if err := cmd.Run(); err != nil {
- return nodeInfo{}, err
- }
-
- time.Sleep(time.Millisecond * 300)
-
- mux := newWsMux()
-
- cmd = exec.Command("./lotus-miner", "run", "--miner-api", fmt.Sprintf("%d", 2500+id), "--nosync")
- cmd.Stderr = io.MultiWriter(os.Stderr, errlogfile, mux.errpw)
- cmd.Stdout = io.MultiWriter(os.Stdout, logfile, mux.outpw)
- cmd.Env = append(os.Environ(), "LOTUS_MINER_PATH="+dir, "LOTUS_PATH="+fullNodeRepo)
- if err := cmd.Start(); err != nil {
- return nodeInfo{}, err
- }
-
- info := nodeInfo{
- Repo: dir,
- ID: id,
- APIPort: 2500 + id,
- State: NodeRunning,
-
- FullNode: fullNodeRepo,
- Storage: true,
- }
-
- api.runningLk.Lock()
- api.running[id] = &runningNode{
- cmd: cmd,
- meta: info,
-
- mux: mux,
- stop: func() {
- cmd.Process.Signal(os.Interrupt)
- cmd.Process.Wait()
-
- api.runningLk.Lock()
- api.running[id].meta.State = NodeStopped
- api.runningLk.Unlock()
- },
- }
- api.runningLk.Unlock()
-
- time.Sleep(time.Millisecond * 750) // TODO: Something less terrible
-
- return info, nil
-}
-
-func (api *api) RestartNode(id int32) (nodeInfo, error) {
- api.runningLk.Lock()
- defer api.runningLk.Unlock()
- nd, ok := api.running[id]
-
- if !ok {
- return nodeInfo{}, xerrors.New("node not found")
- }
-
- if nd.meta.State != NodeStopped {
- return nodeInfo{}, xerrors.New("node not stopped")
- }
-
- var cmd *exec.Cmd
- if nd.meta.Storage {
- cmd = exec.Command("./lotus-miner", "run", "--miner-api", fmt.Sprintf("%d", 2500+id), "--nosync")
- } else {
- cmd = exec.Command("./lotus", "daemon", "--api", fmt.Sprintf("%d", 2500+id))
- }
-
- cmd.Stderr = nd.cmd.Stderr // recycle old vars
- cmd.Stdout = nd.cmd.Stdout
- cmd.Env = nd.cmd.Env
-
- if err := cmd.Start(); err != nil {
- return nodeInfo{}, err
- }
-
- nd.cmd = cmd
-
- nd.stop = func() {
- cmd.Process.Signal(os.Interrupt)
- cmd.Process.Wait()
-
- api.runningLk.Lock()
- api.running[id].meta.State = NodeStopped
- api.runningLk.Unlock()
- }
-
- nd.meta.State = NodeRunning
-
- time.Sleep(time.Millisecond * 750) // TODO: Something less terrible
-
- return nd.meta, nil
-}
diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go
index 9c8e08a8c..db2c9768b 100644
--- a/markets/dagstore/wrapper_migration_test.go
+++ b/markets/dagstore/wrapper_migration_test.go
@@ -16,7 +16,7 @@ import (
tut "github.com/filecoin-project/go-fil-markets/shared_testutil"
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
- markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/lotus/node/config"
)
diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go
index 706115a25..e69e213ad 100644
--- a/markets/idxprov/mesh.go
+++ b/markets/idxprov/mesh.go
@@ -38,10 +38,13 @@ func (mc Libp2pMeshCreator) Connect(ctx context.Context) error {
return fmt.Errorf("failed to fetch full node listen addrs, err: %w", err)
}
- // Connect to the full node, ask it to protect the connection and protect the connection on
- // markets end too.
- if err := mc.marketsHost.Connect(ctx, faddrs); err != nil {
- return fmt.Errorf("failed to connect index provider host with the full node: %w", err)
+ // Connect from the full node, ask it to protect the connection and protect the connection on
+ // markets end too. Connection is initiated form full node to avoid the need to expose libp2p port on full node
+ if err := mc.fullnodeApi.NetConnect(ctx, peer.AddrInfo{
+ ID: mc.marketsHost.ID(),
+ Addrs: mc.marketsHost.Addrs(),
+ }); err != nil {
+ return fmt.Errorf("failed to connect to index provider host from full node: %w", err)
}
mc.marketsHost.ConnManager().Protect(faddrs.ID, protectTag)
diff --git a/markets/retrievaladapter/client_blockstore.go b/markets/retrievaladapter/client_blockstore.go
index 84c75fdbd..37a80013a 100644
--- a/markets/retrievaladapter/client_blockstore.go
+++ b/markets/retrievaladapter/client_blockstore.go
@@ -8,8 +8,12 @@ import (
"github.com/ipfs/go-cid"
bstore "github.com/ipfs/go-ipfs-blockstore"
"github.com/ipld/go-car/v2/blockstore"
+ "golang.org/x/xerrors"
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
+
+ "github.com/filecoin-project/lotus/api"
+ lbstore "github.com/filecoin-project/lotus/blockstore"
)
// ProxyBlockstoreAccessor is an accessor that returns a fixed blockstore.
@@ -32,6 +36,85 @@ func (p *ProxyBlockstoreAccessor) Done(_ retrievalmarket.DealID) error {
return nil
}
+func NewAPIBlockstoreAdapter(sub retrievalmarket.BlockstoreAccessor) *APIBlockstoreAccessor {
+ return &APIBlockstoreAccessor{
+ sub: sub,
+ retrStores: map[retrievalmarket.DealID]api.RemoteStoreID{},
+ remoteStores: map[api.RemoteStoreID]bstore.Blockstore{},
+ }
+}
+
+// APIBlockstoreAccessor adds support to API-specified remote blockstores
+type APIBlockstoreAccessor struct {
+ sub retrievalmarket.BlockstoreAccessor
+
+ retrStores map[retrievalmarket.DealID]api.RemoteStoreID
+ remoteStores map[api.RemoteStoreID]bstore.Blockstore
+
+ accessLk sync.Mutex
+}
+
+func (a *APIBlockstoreAccessor) Get(id retrievalmarket.DealID, payloadCID retrievalmarket.PayloadCID) (bstore.Blockstore, error) {
+ a.accessLk.Lock()
+ defer a.accessLk.Unlock()
+
+ as, has := a.retrStores[id]
+ if !has {
+ return a.sub.Get(id, payloadCID)
+ }
+
+ return a.remoteStores[as], nil
+}
+
+func (a *APIBlockstoreAccessor) Done(id retrievalmarket.DealID) error {
+ a.accessLk.Lock()
+ defer a.accessLk.Unlock()
+
+ if _, has := a.retrStores[id]; has {
+ delete(a.retrStores, id)
+ return nil
+ }
+ return a.sub.Done(id)
+}
+
+func (a *APIBlockstoreAccessor) RegisterDealToRetrievalStore(id retrievalmarket.DealID, sid api.RemoteStoreID) error {
+ a.accessLk.Lock()
+ defer a.accessLk.Unlock()
+
+ if _, has := a.retrStores[id]; has {
+ return xerrors.Errorf("apistore for deal %d already registered", id)
+ }
+ if _, has := a.remoteStores[sid]; !has {
+ return xerrors.Errorf("remote store not found")
+ }
+
+ a.retrStores[id] = sid
+ return nil
+}
+
+func (a *APIBlockstoreAccessor) RegisterApiStore(sid api.RemoteStoreID, st *lbstore.NetworkStore) error {
+ a.accessLk.Lock()
+ defer a.accessLk.Unlock()
+
+ if _, has := a.remoteStores[sid]; has {
+ return xerrors.Errorf("remote store already registered with this uuid")
+ }
+
+ a.remoteStores[sid] = st
+
+ st.OnClose(func() {
+ a.accessLk.Lock()
+ defer a.accessLk.Unlock()
+
+ if _, has := a.remoteStores[sid]; has {
+ delete(a.remoteStores, sid)
+ }
+ })
+ return nil
+}
+
+var _ retrievalmarket.BlockstoreAccessor = &APIBlockstoreAccessor{}
+
type CARBlockstoreAccessor struct {
rootdir string
lk sync.Mutex
diff --git a/markets/storageadapter/client.go b/markets/storageadapter/client.go
index dc6aa37b3..eaff4e166 100644
--- a/markets/storageadapter/client.go
+++ b/markets/storageadapter/client.go
@@ -16,7 +16,7 @@ import (
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
@@ -183,7 +183,7 @@ func (c *ClientNodeAdapter) ValidatePublishedDeal(ctx context.Context, deal stor
return 0, xerrors.Errorf("deal publish message called incorrect method (method=%s)", pubmsg.Method)
}
- var params market8.PublishStorageDealsParams
+ var params markettypes.PublishStorageDealsParams
if err := params.UnmarshalCBOR(bytes.NewReader(pubmsg.Params)); err != nil {
return 0, err
}
@@ -268,12 +268,12 @@ func (c *ClientNodeAdapter) DealProviderCollateralBounds(ctx context.Context, si
}
// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer)
-func (c *ClientNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error {
+func (c *ClientNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error {
return c.scMgr.OnDealSectorPreCommitted(ctx, provider, proposal, *publishCid, cb)
}
// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer)
-func (c *ClientNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error {
+func (c *ClientNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error {
return c.scMgr.OnDealSectorCommitted(ctx, provider, sectorNumber, proposal, *publishCid, cb)
}
@@ -367,7 +367,7 @@ func (c *ClientNodeAdapter) OnDealExpiredOrSlashed(ctx context.Context, dealID a
return nil
}
-func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Address, proposal market8.DealProposal) (*market8.ClientDealProposal, error) {
+func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Address, proposal markettypes.DealProposal) (*markettypes.ClientDealProposal, error) {
// TODO: output spec signed proposal
buf, err := cborutil.Dump(&proposal)
if err != nil {
@@ -386,7 +386,7 @@ func (c *ClientNodeAdapter) SignProposal(ctx context.Context, signer address.Add
return nil, err
}
- return &market8.ClientDealProposal{
+ return &markettypes.ClientDealProposal{
Proposal: proposal,
ClientSignature: *sig,
}, nil
diff --git a/markets/storageadapter/dealpublisher.go b/markets/storageadapter/dealpublisher.go
index c2864bdf9..6a274e593 100644
--- a/markets/storageadapter/dealpublisher.go
+++ b/markets/storageadapter/dealpublisher.go
@@ -15,7 +15,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/lotus/api"
@@ -204,6 +204,26 @@ func (p *DealPublisher) processNewDeal(pdeal *pendingDeal) {
return
}
+ pdealPropCid, err := pdeal.deal.Proposal.Cid()
+ if err != nil {
+ log.Warn("failed to calculate proposal CID for new pending Deal with piece cid %s", pdeal.deal.Proposal.PieceCID)
+ return
+ }
+
+ // Sanity check that new deal isn't already in the queue
+ for _, pd := range p.pending {
+ pdPropCid, err := pd.deal.Proposal.Cid()
+ if err != nil {
+ log.Warn("failed to calculate proposal CID for pending Deal already in publish queue with piece cid %s", pd.deal.Proposal.PieceCID)
+ return
+ }
+
+ if pdPropCid.Equals(pdealPropCid) {
+ log.Warn("tried to process new pending deal with piece CID %s that is already in publish queue; returning", pdeal.deal.Proposal.PieceCID)
+ return
+ }
+ }
+
// Add the new deal to the queue
p.pending = append(p.pending, pdeal)
log.Infof("add deal with piece CID %s to publish deals queue - %d deals in queue (max queue size %d)",
diff --git a/markets/storageadapter/dealpublisher_test.go b/markets/storageadapter/dealpublisher_test.go
index b7280842c..35169bf41 100644
--- a/markets/storageadapter/dealpublisher_test.go
+++ b/markets/storageadapter/dealpublisher_test.go
@@ -14,7 +14,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
tutils "github.com/filecoin-project/specs-actors/v2/support/testing"
diff --git a/markets/storageadapter/ondealsectorcommitted.go b/markets/storageadapter/ondealsectorcommitted.go
index 3c3f28824..a8b22c62a 100644
--- a/markets/storageadapter/ondealsectorcommitted.go
+++ b/markets/storageadapter/ondealsectorcommitted.go
@@ -13,8 +13,8 @@ import (
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/market"
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/lotus/build"
lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
@@ -72,7 +72,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context,
// Note: the error returned from here will end up being returned
// from OnDealSectorPreCommitted so no need to call the callback
// with the error
- return false, false, err
+ return false, false, xerrors.Errorf("failed to check deal activity: %w", err)
}
if isActive {
@@ -89,7 +89,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context,
diff, err := mgr.dpc.diffPreCommits(ctx, provider, dealInfo.PublishMsgTipSet, ts.Key())
if err != nil {
- return false, false, err
+ return false, false, xerrors.Errorf("failed to diff precommits: %w", err)
}
for _, info := range diff.Added {
@@ -139,7 +139,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context,
// current deal ID from the publish message CID
res, err := mgr.dealInfo.GetCurrentDealInfo(ctx, ts.Key(), &proposal, publishCid)
if err != nil {
- return false, err
+ return false, xerrors.Errorf("failed to get dealinfo: %w", err)
}
// If this is a replica update method that succeeded the deal is active
@@ -159,7 +159,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context,
// Extract the message parameters
sn, err := dealSectorInPreCommitMsg(msg, res)
if err != nil {
- return false, err
+ return false, xerrors.Errorf("failed to extract message params: %w", err)
}
if sn != nil {
diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go
index 624cf84ae..1d7519ff9 100644
--- a/markets/storageadapter/ondealsectorcommitted_test.go
+++ b/markets/storageadapter/ondealsectorcommitted_test.go
@@ -18,8 +18,8 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
- markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/cbor"
tutils "github.com/filecoin-project/specs-actors/v2/support/testing"
@@ -96,7 +96,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) {
},
matchStates: []matchState{
{
- msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.SectorPreCommitInfo{
+ msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{
SectorNumber: sectorNumber,
SealedCID: sealedCid,
DealIDs: []abi.DealID{dealID},
@@ -114,7 +114,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) {
},
matchStates: []matchState{
{
- msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.SectorPreCommitInfo{
+ msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{
SectorNumber: sectorNumber,
SealedCID: sealedCid,
DealIDs: []abi.DealID{dealID},
@@ -145,7 +145,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) {
"error getting current deal info in check func": {
currentDealInfoErr: errors.New("something went wrong"),
expectedCBCallCount: 0,
- expectedError: xerrors.Errorf("failed to set up called handler: failed to look up deal on chain: something went wrong"),
+ expectedError: xerrors.Errorf("failed to set up called handler: failed to check deal activity: failed to look up deal on chain: something went wrong"),
},
"sector already active": {
currentDealInfo: pipeline.CurrentDealInfo{
@@ -162,7 +162,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) {
PublishMsgTipSet: types.EmptyTSK,
},
expectedCBCallCount: 0,
- expectedError: xerrors.Errorf("failed to set up called handler: deal %d was slashed at epoch %d", dealID, slashedDeal.State.SlashEpoch),
+ expectedError: xerrors.Errorf("failed to set up called handler: failed to check deal activity: deal %d was slashed at epoch %d", dealID, slashedDeal.State.SlashEpoch),
},
"error getting current deal info in called func": {
currentDealInfo: pipeline.CurrentDealInfo{
@@ -172,7 +172,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) {
currentDealInfoErr2: errors.New("something went wrong"),
matchStates: []matchState{
{
- msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.SectorPreCommitInfo{
+ msg: makeMessage(t, provider, builtin.MethodsMiner.PreCommitSector, &minertypes.PreCommitSectorParams{
SectorNumber: sectorNumber,
SealedCID: sealedCid,
DealIDs: []abi.DealID{dealID},
@@ -180,7 +180,7 @@ func TestOnDealSectorPreCommitted(t *testing.T) {
},
},
expectedCBCallCount: 1,
- expectedCBError: errors.New("handling applied event: something went wrong"),
+ expectedCBError: errors.New("handling applied event: failed to get dealinfo: something went wrong"),
},
"proposed deal epoch timeout": {
currentDealInfo: pipeline.CurrentDealInfo{
diff --git a/markets/storageadapter/provider.go b/markets/storageadapter/provider.go
index 37b6515eb..a5022613b 100644
--- a/markets/storageadapter/provider.go
+++ b/markets/storageadapter/provider.go
@@ -15,7 +15,7 @@ import (
"github.com/filecoin-project/go-fil-markets/shared"
"github.com/filecoin-project/go-fil-markets/storagemarket"
"github.com/filecoin-project/go-state-types/abi"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
@@ -284,12 +284,12 @@ func (n *ProviderNodeAdapter) DealProviderCollateralBounds(ctx context.Context,
}
// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer)
-func (n *ProviderNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error {
+func (n *ProviderNodeAdapter) OnDealSectorPreCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorPreCommittedCallback) error {
return n.scMgr.OnDealSectorPreCommitted(ctx, provider, proposal, *publishCid, cb)
}
// TODO: Remove dealID parameter, change publishCid to be cid.Cid (instead of pointer)
-func (n *ProviderNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal market8.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error {
+func (n *ProviderNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider address.Address, dealID abi.DealID, sectorNumber abi.SectorNumber, proposal markettypes.DealProposal, publishCid *cid.Cid, cb storagemarket.DealSectorCommittedCallback) error {
return n.scMgr.OnDealSectorCommitted(ctx, provider, sectorNumber, proposal, *publishCid, cb)
}
@@ -310,7 +310,7 @@ func (n *ProviderNodeAdapter) WaitForMessage(ctx context.Context, mcid cid.Cid,
return cb(receipt.Receipt.ExitCode, receipt.Receipt.Return, receipt.Message, nil)
}
-func (n *ProviderNodeAdapter) WaitForPublishDeals(ctx context.Context, publishCid cid.Cid, proposal market8.DealProposal) (*storagemarket.PublishDealsWaitResult, error) {
+func (n *ProviderNodeAdapter) WaitForPublishDeals(ctx context.Context, publishCid cid.Cid, proposal markettypes.DealProposal) (*storagemarket.PublishDealsWaitResult, error) {
// Wait for deal to be published (plus additional time for confidence)
receipt, err := n.StateWaitMsg(ctx, publishCid, 2*build.MessageConfidence, api.LookbackNoLimit, true)
if err != nil {
diff --git a/markets/utils/selectors.go b/markets/utils/selectors.go
index e1009d1ff..1b8a62401 100644
--- a/markets/utils/selectors.go
+++ b/markets/utils/selectors.go
@@ -26,6 +26,7 @@ func TraverseDag(
ds mdagipld.DAGService,
startFrom cid.Cid,
optionalSelector ipld.Node,
+ onOpen func(node mdagipld.Node) error,
visitCallback traversal.AdvVisitFn,
) error {
@@ -61,6 +62,12 @@ func TraverseDag(
return nil, err
}
+ if onOpen != nil {
+ if err := onOpen(node); err != nil {
+ return nil, err
+ }
+ }
+
return bytes.NewBuffer(node.RawData()), nil
}
unixfsnode.AddUnixFSReificationToLinkSystem(&linkSystem)
diff --git a/metrics/metrics.go b/metrics/metrics.go
index 8a4c3aa31..149195faf 100644
--- a/metrics/metrics.go
+++ b/metrics/metrics.go
@@ -14,7 +14,7 @@ import (
)
// Distribution
-var defaultMillisecondsDistribution = view.Distribution(0.01, 0.05, 0.1, 0.3, 0.6, 0.8, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 3000, 4000, 5000, 7500, 10000, 20000, 50000, 100000)
+var defaultMillisecondsDistribution = view.Distribution(0.01, 0.05, 0.1, 0.3, 0.6, 0.8, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 3000, 4000, 5000, 7500, 10000, 20000, 50000, 100_000, 250_000, 500_000, 1000_000)
var workMillisecondsDistribution = view.Distribution(
250, 500, 1000, 2000, 5000, 10_000, 30_000, 60_000, 2*60_000, 5*60_000, 10*60_000, 15*60_000, 30*60_000, // short sealing tasks
40*60_000, 45*60_000, 50*60_000, 55*60_000, 60*60_000, 65*60_000, 70*60_000, 75*60_000, 80*60_000, 85*60_000, 100*60_000, 120*60_000, // PC2 / C2 range
@@ -22,6 +22,8 @@ var workMillisecondsDistribution = view.Distribution(
350*60_000, 400*60_000, 600*60_000, 800*60_000, 1000*60_000, 1300*60_000, 1800*60_000, 4000*60_000, 10000*60_000, // intel PC1 range
)
+var queueSizeDistribution = view.Distribution(0, 1, 2, 3, 5, 7, 10, 15, 25, 35, 50, 70, 90, 130, 200, 300, 500, 1000, 2000, 5000, 10000)
+
// Global Tags
var (
// common
@@ -48,6 +50,9 @@ var (
StorageID, _ = tag.NewKey("storage_id")
SectorState, _ = tag.NewKey("sector_state")
+ PathSeal, _ = tag.NewKey("path_seal")
+ PathStorage, _ = tag.NewKey("path_storage")
+
// rcmgr
ServiceID, _ = tag.NewKey("svc")
ProtocolID, _ = tag.NewKey("proto")
@@ -136,6 +141,13 @@ var (
StorageLimitUsedBytes = stats.Int64("storage/path_limit_used_bytes", "used optional storage limit bytes", stats.UnitBytes)
StorageLimitMaxBytes = stats.Int64("storage/path_limit_max_bytes", "optional storage limit", stats.UnitBytes)
+ SchedAssignerCycleDuration = stats.Float64("sched/assigner_cycle_ms", "Duration of scheduler assigner cycle", stats.UnitMilliseconds)
+ SchedAssignerCandidatesDuration = stats.Float64("sched/assigner_cycle_candidates_ms", "Duration of scheduler assigner candidate matching step", stats.UnitMilliseconds)
+ SchedAssignerWindowSelectionDuration = stats.Float64("sched/assigner_cycle_window_select_ms", "Duration of scheduler window selection step", stats.UnitMilliseconds)
+ SchedAssignerSubmitDuration = stats.Float64("sched/assigner_cycle_submit_ms", "Duration of scheduler window submit step", stats.UnitMilliseconds)
+ SchedCycleOpenWindows = stats.Int64("sched/assigner_cycle_open_window", "Number of open windows in scheduling cycles", stats.UnitDimensionless)
+ SchedCycleQueueSize = stats.Int64("sched/assigner_cycle_task_queue_entry", "Number of task queue entries in scheduling cycles", stats.UnitDimensionless)
+
DagStorePRInitCount = stats.Int64("dagstore/pr_init_count", "PieceReader init count", stats.UnitDimensionless)
DagStorePRBytesRequested = stats.Int64("dagstore/pr_requested_bytes", "PieceReader requested bytes", stats.UnitBytes)
DagStorePRBytesDiscarded = stats.Int64("dagstore/pr_discarded_bytes", "PieceReader discarded bytes", stats.UnitBytes)
@@ -380,52 +392,77 @@ var (
StorageFSAvailableView = &view.View{
Measure: StorageFSAvailable,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageAvailableView = &view.View{
Measure: StorageAvailable,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageReservedView = &view.View{
Measure: StorageReserved,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageLimitUsedView = &view.View{
Measure: StorageLimitUsed,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageCapacityBytesView = &view.View{
Measure: StorageCapacityBytes,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageFSAvailableBytesView = &view.View{
Measure: StorageFSAvailableBytes,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageAvailableBytesView = &view.View{
Measure: StorageAvailableBytes,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageReservedBytesView = &view.View{
Measure: StorageReservedBytes,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageLimitUsedBytesView = &view.View{
Measure: StorageLimitUsedBytes,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
}
StorageLimitMaxBytesView = &view.View{
Measure: StorageLimitMaxBytes,
Aggregation: view.LastValue(),
- TagKeys: []tag.Key{StorageID},
+ TagKeys: []tag.Key{StorageID, PathStorage, PathSeal},
+ }
+
+ SchedAssignerCycleDurationView = &view.View{
+ Measure: SchedAssignerCycleDuration,
+ Aggregation: defaultMillisecondsDistribution,
+ }
+ SchedAssignerCandidatesDurationView = &view.View{
+ Measure: SchedAssignerCandidatesDuration,
+ Aggregation: defaultMillisecondsDistribution,
+ }
+ SchedAssignerWindowSelectionDurationView = &view.View{
+ Measure: SchedAssignerWindowSelectionDuration,
+ Aggregation: defaultMillisecondsDistribution,
+ }
+ SchedAssignerSubmitDurationView = &view.View{
+ Measure: SchedAssignerSubmitDuration,
+ Aggregation: defaultMillisecondsDistribution,
+ }
+ SchedCycleOpenWindowsView = &view.View{
+ Measure: SchedCycleOpenWindows,
+ Aggregation: queueSizeDistribution,
+ }
+ SchedCycleQueueSizeView = &view.View{
+ Measure: SchedCycleQueueSize,
+ Aggregation: queueSizeDistribution,
}
DagStorePRInitCountView = &view.View{
@@ -697,6 +734,7 @@ var MinerNodeViews = append([]*view.View{
WorkerCallsReturnedCountView,
WorkerUntrackedCallsReturnedView,
WorkerCallsReturnedDurationView,
+
SectorStatesView,
StorageFSAvailableView,
StorageAvailableView,
@@ -708,6 +746,14 @@ var MinerNodeViews = append([]*view.View{
StorageReservedBytesView,
StorageLimitUsedBytesView,
StorageLimitMaxBytesView,
+
+ SchedAssignerCycleDurationView,
+ SchedAssignerCandidatesDurationView,
+ SchedAssignerWindowSelectionDurationView,
+ SchedAssignerSubmitDurationView,
+ SchedCycleOpenWindowsView,
+ SchedCycleQueueSizeView,
+
DagStorePRInitCountView,
DagStorePRBytesRequestedView,
DagStorePRBytesDiscardedView,
diff --git a/miner/miner.go b/miner/miner.go
index 4952f95fb..f954352ae 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -30,6 +30,7 @@ import (
"github.com/filecoin-project/lotus/chain/gen/slashfilter"
lrand "github.com/filecoin-project/lotus/chain/rand"
"github.com/filecoin-project/lotus/chain/types"
+ cliutil "github.com/filecoin-project/lotus/cli/util"
"github.com/filecoin-project/lotus/journal"
)
@@ -208,6 +209,8 @@ func (m *Miner) mine(ctx context.Context) {
var lastBase MiningBase
minerLoop:
for {
+ ctx := cliutil.OnSingleNode(ctx)
+
select {
case <-m.stop:
stopping := m.stopping
diff --git a/miner/warmup.go b/miner/warmup.go
index 3b73afbc9..46236784a 100644
--- a/miner/warmup.go
+++ b/miner/warmup.go
@@ -59,6 +59,9 @@ out:
if err != nil {
return xerrors.Errorf("getting sector info: %w", err)
}
+ if si == nil {
+ return xerrors.Errorf("sector not found %d", sector)
+ }
ts, err := m.api.ChainHead(ctx)
if err != nil {
diff --git a/node/builder.go b/node/builder.go
index ca31a2c91..eaf932e2e 100644
--- a/node/builder.go
+++ b/node/builder.go
@@ -121,6 +121,7 @@ const (
SettlePaymentChannelsKey
RunPeerTaggerKey
SetupFallbackBlockstoresKey
+ GoRPCServer
SetApiEndpointKey
@@ -155,6 +156,7 @@ func defaults() []Option {
Override(new(journal.DisabledEvents), journal.EnvDisabledEvents),
Override(new(journal.Journal), modules.OpenFilesystemJournal),
Override(new(*alerting.Alerting), alerting.NewAlertingSystem),
+ Override(new(dtypes.NodeStartTime), FromVal(dtypes.NodeStartTime(time.Now()))),
Override(CheckFDLimit, modules.CheckFdLimit(build.DefaultFDLimit)),
diff --git a/node/builder_chain.go b/node/builder_chain.go
index e24b26097..2201be2e6 100644
--- a/node/builder_chain.go
+++ b/node/builder_chain.go
@@ -3,6 +3,7 @@ package node
import (
"os"
+ gorpc "github.com/libp2p/go-libp2p-gorpc"
"go.uber.org/fx"
"golang.org/x/xerrors"
@@ -28,7 +29,9 @@ import (
"github.com/filecoin-project/lotus/chain/wallet"
ledgerwallet "github.com/filecoin-project/lotus/chain/wallet/ledger"
"github.com/filecoin-project/lotus/chain/wallet/remotewallet"
+ raftcns "github.com/filecoin-project/lotus/lib/consensus/raft"
"github.com/filecoin-project/lotus/lib/peermgr"
+ "github.com/filecoin-project/lotus/markets/retrievaladapter"
"github.com/filecoin-project/lotus/markets/storageadapter"
"github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/node/hello"
@@ -105,6 +108,7 @@ var ChainNode = Options(
// Service: Wallet
Override(new(*messagesigner.MessageSigner), messagesigner.NewMessageSigner),
+ Override(new(messagesigner.MsgSigner), func(ms *messagesigner.MessageSigner) *messagesigner.MessageSigner { return ms }),
Override(new(*wallet.LocalWallet), wallet.NewWallet),
Override(new(wallet.Default), From(new(*wallet.LocalWallet))),
Override(new(api.Wallet), From(new(wallet.MultiWallet))),
@@ -129,6 +133,7 @@ var ChainNode = Options(
Override(new(*market.FundManager), market.NewFundManager),
Override(new(dtypes.ClientDatastore), modules.NewClientDatastore),
Override(new(storagemarket.BlockstoreAccessor), modules.StorageBlockstoreAccessor),
+ Override(new(*retrievaladapter.APIBlockstoreAccessor), retrievaladapter.NewAPIBlockstoreAdapter),
Override(new(storagemarket.StorageClient), modules.StorageClient),
Override(new(storagemarket.StorageClientNode), storageadapter.NewClientNodeAdapter),
Override(HandleMigrateClientFundsKey, modules.HandleMigrateClientFunds),
@@ -140,7 +145,7 @@ var ChainNode = Options(
// Lite node API
ApplyIf(isLiteNode,
Override(new(messagepool.Provider), messagepool.NewProviderLite),
- Override(new(messagesigner.MpoolNonceAPI), From(new(modules.MpoolNonceAPI))),
+ Override(new(messagepool.MpoolNonceAPI), From(new(modules.MpoolNonceAPI))),
Override(new(full.ChainModuleAPI), From(new(api.Gateway))),
Override(new(full.GasModuleAPI), From(new(api.Gateway))),
Override(new(full.MpoolModuleAPI), From(new(api.Gateway))),
@@ -151,7 +156,7 @@ var ChainNode = Options(
// Full node API / service startup
ApplyIf(isFullNode,
Override(new(messagepool.Provider), messagepool.NewProvider),
- Override(new(messagesigner.MpoolNonceAPI), From(new(*messagepool.MessagePool))),
+ Override(new(messagepool.MpoolNonceAPI), From(new(*messagepool.MessagePool))),
Override(new(full.ChainModuleAPI), From(new(full.ChainModule))),
Override(new(full.GasModuleAPI), From(new(full.GasModule))),
Override(new(full.MpoolModuleAPI), From(new(full.MpoolModule))),
@@ -181,7 +186,7 @@ func ConfigFullNode(c interface{}) Option {
Override(new(dtypes.UniversalBlockstore), modules.UniversalBlockstore),
If(cfg.Chainstore.EnableSplitstore,
- If(cfg.Chainstore.Splitstore.ColdStoreType == "universal",
+ If(cfg.Chainstore.Splitstore.ColdStoreType == "universal" || cfg.Chainstore.Splitstore.ColdStoreType == "messages",
Override(new(dtypes.ColdBlockstore), From(new(dtypes.UniversalBlockstore)))),
If(cfg.Chainstore.Splitstore.ColdStoreType == "discard",
Override(new(dtypes.ColdBlockstore), modules.DiscardColdBlockstore)),
@@ -236,6 +241,16 @@ func ConfigFullNode(c interface{}) Option {
Unset(new(*wallet.LocalWallet)),
Override(new(wallet.Default), wallet.NilDefault),
),
+ // Chain node cluster enabled
+ If(cfg.Cluster.ClusterModeEnabled,
+ Override(new(*gorpc.Client), modules.NewRPCClient),
+ Override(new(*raftcns.ClusterRaftConfig), raftcns.NewClusterRaftConfig(&cfg.Cluster)),
+ Override(new(*raftcns.Consensus), raftcns.NewConsensusWithRPCClient(false)),
+ Override(new(*messagesigner.MessageSignerConsensus), messagesigner.NewMessageSignerConsensus),
+ Override(new(messagesigner.MsgSigner), From(new(*messagesigner.MessageSignerConsensus))),
+ Override(new(*modules.RPCHandler), modules.NewRPCHandler),
+ Override(GoRPCServer, modules.NewRPCServer),
+ ),
)
}
diff --git a/node/builder_miner.go b/node/builder_miner.go
index a3eb9a7ec..2d33727f8 100644
--- a/node/builder_miner.go
+++ b/node/builder_miner.go
@@ -94,6 +94,10 @@ func ConfigStorageMiner(c interface{}) Option {
Override(new(paths.Store), From(new(*paths.Remote))),
Override(new(dtypes.RetrievalPricingFunc), modules.RetrievalPricingFunc(cfg.Dealmaking)),
+ If(cfg.Subsystems.EnableMining || cfg.Subsystems.EnableSealing,
+ Override(GetParamsKey, modules.GetParams(!cfg.Proving.DisableBuiltinWindowPoSt || !cfg.Proving.DisableBuiltinWinningPoSt || cfg.Storage.AllowCommit || cfg.Storage.AllowProveReplicaUpdate2)),
+ ),
+
If(!cfg.Subsystems.EnableMining,
If(cfg.Subsystems.EnableSealing, Error(xerrors.Errorf("sealing can only be enabled on a mining node"))),
If(cfg.Subsystems.EnableSectorStorage, Error(xerrors.Errorf("sealing can only be enabled on a mining node"))),
@@ -107,9 +111,6 @@ func ConfigStorageMiner(c interface{}) Option {
Override(new(storiface.Prover), ffiwrapper.ProofProver),
Override(new(storiface.ProverPoSt), From(new(sectorstorage.SectorManager))),
- // Sealing (todo should be under EnableSealing, but storagefsm is currently bundled with storage.Miner)
- Override(GetParamsKey, modules.GetParams),
-
Override(new(dtypes.SetSealingConfigFunc), modules.NewSetSealConfigFunc),
Override(new(dtypes.GetSealingConfigFunc), modules.NewGetSealConfigFunc),
@@ -223,7 +224,8 @@ func ConfigStorageMiner(c interface{}) Option {
Override(new(storagemarket.StorageProviderNode), storageadapter.NewProviderNodeAdapter(&cfg.Fees, &cfg.Dealmaking)),
),
- Override(new(sectorstorage.Config), cfg.StorageManager()),
+ Override(new(config.SealerConfig), cfg.Storage),
+ Override(new(config.ProvingConfig), cfg.Proving),
Override(new(*ctladdr.AddressSelector), modules.AddressSelector(&cfg.Addresses)),
)
}
diff --git a/node/bundle/bundle.go b/node/bundle/bundle.go
index cb97838f5..abdb34e69 100644
--- a/node/bundle/bundle.go
+++ b/node/bundle/bundle.go
@@ -10,6 +10,8 @@ import (
"github.com/ipld/go-car"
"golang.org/x/xerrors"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
+
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors"
@@ -39,10 +41,10 @@ func LoadBundle(ctx context.Context, bs blockstore.Blockstore, r io.Reader) (cid
// LoadBundles loads the bundles for the specified actor versions into the passed blockstore, if and
// only if the bundle's manifest is not already present in the blockstore.
-func LoadBundles(ctx context.Context, bs blockstore.Blockstore, versions ...actors.Version) error {
+func LoadBundles(ctx context.Context, bs blockstore.Blockstore, versions ...actorstypes.Version) error {
for _, av := range versions {
// No bundles before version 8.
- if av < actors.Version8 {
+ if av < actorstypes.Version8 {
continue
}
diff --git a/node/config/def.go b/node/config/def.go
index ad2150af3..dc26f1661 100644
--- a/node/config/def.go
+++ b/node/config/def.go
@@ -15,7 +15,6 @@ import (
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/types"
- "github.com/filecoin-project/lotus/storage/sealer"
)
const (
@@ -91,14 +90,14 @@ func DefaultFullNode() *FullNode {
Chainstore: Chainstore{
EnableSplitstore: false,
Splitstore: Splitstore{
- ColdStoreType: "universal",
+ ColdStoreType: "messages",
HotStoreType: "badger",
MarkSetType: "badger",
- HotStoreFullGCFrequency: 20,
- ColdStoreFullGCFrequency: 7,
+ HotStoreFullGCFrequency: 20,
},
},
+ Cluster: *DefaultUserRaftConfig(),
}
}
@@ -142,10 +141,13 @@ func DefaultStorageMiner() *StorageMiner {
},
Proving: ProvingConfig{
- ParallelCheckLimit: 128,
+ ParallelCheckLimit: 128,
+ PartitionCheckTimeout: Duration(20 * time.Minute),
+ SingleCheckTimeout: Duration(10 * time.Minute),
},
Storage: SealerConfig{
+ AllowSectorDownload: true,
AllowAddPiece: true,
AllowPreCommit1: true,
AllowPreCommit2: true,
@@ -162,7 +164,7 @@ func DefaultStorageMiner() *StorageMiner {
Assigner: "utilization",
// By default use the hardware resource filtering strategy.
- ResourceFiltering: sealer.ResourceFilteringHardware,
+ ResourceFiltering: ResourceFilteringHardware,
},
Dealmaking: DealmakingConfig{
@@ -274,3 +276,39 @@ func (dur Duration) MarshalText() ([]byte, error) {
d := time.Duration(dur)
return []byte(d.String()), nil
}
+
+// ResourceFilteringStrategy is an enum indicating the kinds of resource
+// filtering strategies that can be configured for workers.
+type ResourceFilteringStrategy string
+
+const (
+ // ResourceFilteringHardware specifies that available hardware resources
+ // should be evaluated when scheduling a task against the worker.
+ ResourceFilteringHardware = ResourceFilteringStrategy("hardware")
+
+ // ResourceFilteringDisabled disables resource filtering against this
+ // worker. The scheduler may assign any task to this worker.
+ ResourceFilteringDisabled = ResourceFilteringStrategy("disabled")
+)
+
+var (
+ DefaultDataSubFolder = "raft"
+ DefaultWaitForLeaderTimeout = 15 * time.Second
+ DefaultCommitRetries = 1
+ DefaultNetworkTimeout = 100 * time.Second
+ DefaultCommitRetryDelay = 200 * time.Millisecond
+ DefaultBackupsRotate = 6
+)
+
+func DefaultUserRaftConfig() *UserRaftConfig {
+ var cfg UserRaftConfig
+ cfg.DataFolder = "" // empty so it gets omitted
+ cfg.InitPeersetMultiAddr = []string{}
+ cfg.WaitForLeaderTimeout = Duration(DefaultWaitForLeaderTimeout)
+ cfg.NetworkTimeout = Duration(DefaultNetworkTimeout)
+ cfg.CommitRetries = DefaultCommitRetries
+ cfg.CommitRetryDelay = Duration(DefaultCommitRetryDelay)
+ cfg.BackupsRotate = DefaultBackupsRotate
+
+ return &cfg
+}
diff --git a/node/config/dep_test.go b/node/config/dep_test.go
new file mode 100644
index 000000000..91167e690
--- /dev/null
+++ b/node/config/dep_test.go
@@ -0,0 +1,34 @@
+package config
+
+import (
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+)
+
+func goCmd() string {
+ var exeSuffix string
+ if runtime.GOOS == "windows" {
+ exeSuffix = ".exe"
+ }
+ path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix)
+ if _, err := os.Stat(path); err == nil {
+ return path
+ }
+ return "go"
+}
+
+func TestDoesntDependOnFFI(t *testing.T) {
+ deps, err := exec.Command(goCmd(), "list", "-deps", "github.com/filecoin-project/lotus/node/config").Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ for _, pkg := range strings.Fields(string(deps)) {
+ if pkg == "github.com/filecoin-project/filecoin-ffi" {
+ t.Fatal("config depends on filecoin-ffi")
+ }
+ }
+}
diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go
index 7f08c8cce..4723cc59f 100644
--- a/node/config/doc_gen.go
+++ b/node/config/doc_gen.go
@@ -325,14 +325,14 @@ regardless of this number.`,
Type: "string",
Comment: `A command used for fine-grained evaluation of storage deals
-see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`,
+see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`,
},
{
Name: "RetrievalFilter",
Type: "string",
Comment: `A command used for fine-grained evaluation of retrieval deals
-see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`,
+see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details`,
},
{
Name: "RetrievalPricing",
@@ -372,6 +372,12 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f
Name: "Chainstore",
Type: "Chainstore",
+ Comment: ``,
+ },
+ {
+ Name: "Cluster",
+ Type: "UserRaftConfig",
+
Comment: ``,
},
},
@@ -638,6 +644,29 @@ to late submission.
After changing this option, confirm that the new value works in your setup by invoking
'lotus-miner proving compute window-post 0'`,
+ },
+ {
+ Name: "SingleCheckTimeout",
+ Type: "Duration",
+
+ Comment: `Maximum amount of time a proving pre-check can take for a sector. If the check times out the sector will be skipped
+
+WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the
+test challenge took longer than this timeout
+WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this sector are
+blocked (e.g. in case of disconnected NFS mount)`,
+ },
+ {
+ Name: "PartitionCheckTimeout",
+ Type: "Duration",
+
+ Comment: `Maximum amount of time a proving pre-check can take for an entire partition. If the check times out, sectors in
+the partition which didn't get checked on time will be skipped
+
+WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the
+test challenge took longer than this timeout
+WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this partition are
+blocked or slow`,
},
{
Name: "DisableBuiltinWindowPoSt",
@@ -698,11 +727,9 @@ After changing this option, confirm that the new value works in your setup by in
A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors.
The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which
-means that a single message can prove at most 10 partinions
+means that a single message can prove at most 10 partitions
-In some cases when submitting PoSt messages which are recovering sectors, the default network limit may still be
-too high to fit in the block gas limit; In those cases it may be necessary to set this value to something lower
-than 10; Note that setting this value lower may result in less efficient gas use - more messages will be sent,
+Note that setting this value lower may result in less efficient gas use - more messages will be sent,
to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)
Setting this value above the network limit has no effect`,
@@ -717,6 +744,19 @@ In those cases it may be necessary to set this value to something low (eg 1);
Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed,
resulting in more total gas use (but each message will have lower gas limit)`,
},
+ {
+ Name: "SingleRecoveringPartitionPerPostMessage",
+ Type: "bool",
+
+ Comment: `Enable single partition per PoSt Message for partitions containing recovery sectors
+
+In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be
+too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition
+with recovering sectors in the post message
+
+Note that setting this value lower may result in less efficient gas use - more messages will be sent,
+to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)`,
+ },
},
"Pubsub": []DocField{
{
@@ -748,6 +788,35 @@ Type: Array of multiaddress peerinfo strings, must include peerid (/p2p/12D3K...
Comment: ``,
},
+ {
+ Name: "JsonTracer",
+ Type: "string",
+
+ Comment: `Path to file that will be used to output tracer content in JSON format.
+If present tracer will save data to defined file.
+Format: file path`,
+ },
+ {
+ Name: "ElasticSearchTracer",
+ Type: "string",
+
+ Comment: `Connection string for elasticsearch instance.
+If present tracer will save data to elasticsearch.
+Format: https://:@:/`,
+ },
+ {
+ Name: "ElasticSearchIndex",
+ Type: "string",
+
+ Comment: `Name of elasticsearch index that will be used to save tracer data.
+This property is used only if ElasticSearchTracer propery is set.`,
+ },
+ {
+ Name: "TracerSourceAuth",
+ Type: "string",
+
+ Comment: `Auth token that will be passed with logs to elasticsearch - used for weighted peers score.`,
+ },
},
"RetrievalPricing": []DocField{
{
@@ -796,11 +865,17 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b
Comment: ``,
},
+ {
+ Name: "AllowSectorDownload",
+ Type: "bool",
+
+ Comment: ``,
+ },
{
Name: "AllowAddPiece",
Type: "bool",
- Comment: `Local worker config`,
+ Comment: ``,
},
{
Name: "AllowPreCommit1",
@@ -877,7 +952,7 @@ If you see stuck Finalize tasks after enabling this setting, check
},
{
Name: "ResourceFiltering",
- Type: "sealer.ResourceFilteringStrategy",
+ Type: "ResourceFilteringStrategy",
Comment: `ResourceFiltering instructs the system which resource filtering strategy
to use when evaluating tasks against this worker. An empty value defaults
@@ -922,6 +997,30 @@ flow when the volume of storage deals is lower.`,
Comment: `Upper bound on how many sectors can be sealing+upgrading at the same time when upgrading CC sectors with deals (0 = MaxSealingSectorsForDeals)`,
},
+ {
+ Name: "MinUpgradeSectorExpiration",
+ Type: "uint64",
+
+ Comment: `When set to a non-zero value, minimum number of epochs until sector expiration required for sectors to be considered
+for upgrades (0 = DealMinDuration = 180 days = 518400 epochs)
+
+Note that if all deals waiting in the input queue have lifetimes longer than this value, upgrade sectors will be
+required to have expiration of at least the soonest-ending deal`,
+ },
+ {
+ Name: "MinTargetUpgradeSectorExpiration",
+ Type: "uint64",
+
+ Comment: `When set to a non-zero value, minimum number of epochs until sector expiration above which upgrade candidates will
+be selected based on lowest initial pledge.
+
+Target sector expiration is calculated by looking at the input deal queue, sorting it by deal expiration, and
+selecting N deals from the queue up to sector size. The target expiration will be Nth deal end epoch, or in case
+where there weren't enough deals to fill a sector, DealMaxDuration (540 days = 1555200 epochs)
+
+Setting this to a high value (for example to maximum deal duration - 1555200) will disable selection based on
+initial pledge - upgrade sectors will always be chosen based on longest expiration`,
+ },
{
Name: "CommittedCapacitySectorLifetime",
Type: "Duration",
@@ -1075,7 +1174,7 @@ submitting proofs to the chain individually`,
Type: "string",
Comment: `ColdStoreType specifies the type of the coldstore.
-It can be "universal" (default) or "discard" for discarding cold blocks.`,
+It can be "messages" (default) to store only messages, "universal" to store all chain state or "discard" for discarding cold blocks.`,
},
{
Name: "HotStoreType",
@@ -1106,30 +1205,6 @@ the compaction boundary; default is 0.`,
A value of 0 disables, while a value 1 will do full GC in every compaction.
Default is 20 (about once a week).`,
},
- {
- Name: "EnableColdStoreAutoPrune",
- Type: "bool",
-
- Comment: `EnableColdStoreAutoPrune turns on compaction of the cold store i.e. pruning
-where hotstore compaction occurs every finality epochs pruning happens every 3 finalities
-Default is false`,
- },
- {
- Name: "ColdStoreFullGCFrequency",
- Type: "uint64",
-
- Comment: `ColdStoreFullGCFrequency specifies how often to performa a full (moving) GC on the coldstore.
-Only applies if auto prune is enabled. A value of 0 disables while a value of 1 will do
-full GC in every prune.
-Default is 7 (about once every a week)`,
- },
- {
- Name: "ColdStoreRetention",
- Type: "int64",
-
- Comment: `ColdStoreRetention specifies the retention policy for data reachable from the chain, in
-finalities beyond the compaction boundary, default is 0, -1 retains everything`,
- },
},
"StorageMiner": []DocField{
{
@@ -1187,6 +1262,68 @@ finalities beyond the compaction boundary, default is 0, -1 retains everything`,
Comment: ``,
},
},
+ "UserRaftConfig": []DocField{
+ {
+ Name: "ClusterModeEnabled",
+ Type: "bool",
+
+ Comment: `EXPERIMENTAL. config to enabled node cluster with raft consensus`,
+ },
+ {
+ Name: "DataFolder",
+ Type: "string",
+
+ Comment: `A folder to store Raft's data.`,
+ },
+ {
+ Name: "InitPeersetMultiAddr",
+ Type: "[]string",
+
+ Comment: `InitPeersetMultiAddr provides the list of initial cluster peers for new Raft
+peers (with no prior state). It is ignored when Raft was already
+initialized or when starting in staging mode.`,
+ },
+ {
+ Name: "WaitForLeaderTimeout",
+ Type: "Duration",
+
+ Comment: `LeaderTimeout specifies how long to wait for a leader before
+failing an operation.`,
+ },
+ {
+ Name: "NetworkTimeout",
+ Type: "Duration",
+
+ Comment: `NetworkTimeout specifies how long before a Raft network
+operation is timed out`,
+ },
+ {
+ Name: "CommitRetries",
+ Type: "int",
+
+ Comment: `CommitRetries specifies how many times we retry a failed commit until
+we give up.`,
+ },
+ {
+ Name: "CommitRetryDelay",
+ Type: "Duration",
+
+ Comment: `How long to wait between retries`,
+ },
+ {
+ Name: "BackupsRotate",
+ Type: "int",
+
+ Comment: `BackupsRotate specifies the maximum number of Raft's DataFolder
+copies that we keep as backups (renaming) after cleanup.`,
+ },
+ {
+ Name: "Tracing",
+ Type: "bool",
+
+ Comment: `Tracing enables propagation of contexts across binary boundaries.`,
+ },
+ },
"Wallet": []DocField{
{
Name: "RemoteBackend",
diff --git a/node/config/storage.go b/node/config/storage.go
index 20f1791e6..2c9d880f9 100644
--- a/node/config/storage.go
+++ b/node/config/storage.go
@@ -8,11 +8,10 @@ import (
"golang.org/x/xerrors"
- "github.com/filecoin-project/lotus/storage/paths"
- "github.com/filecoin-project/lotus/storage/sealer"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
-func StorageFromFile(path string, def *paths.StorageConfig) (*paths.StorageConfig, error) {
+func StorageFromFile(path string, def *storiface.StorageConfig) (*storiface.StorageConfig, error) {
file, err := os.Open(path)
switch {
case os.IsNotExist(err):
@@ -28,8 +27,8 @@ func StorageFromFile(path string, def *paths.StorageConfig) (*paths.StorageConfi
return StorageFromReader(file)
}
-func StorageFromReader(reader io.Reader) (*paths.StorageConfig, error) {
- var cfg paths.StorageConfig
+func StorageFromReader(reader io.Reader) (*storiface.StorageConfig, error) {
+ var cfg storiface.StorageConfig
err := json.NewDecoder(reader).Decode(&cfg)
if err != nil {
return nil, err
@@ -38,7 +37,7 @@ func StorageFromReader(reader io.Reader) (*paths.StorageConfig, error) {
return &cfg, nil
}
-func WriteStorageFile(path string, config paths.StorageConfig) error {
+func WriteStorageFile(path string, config storiface.StorageConfig) error {
b, err := json.MarshalIndent(config, "", " ")
if err != nil {
return xerrors.Errorf("marshaling storage config: %w", err)
@@ -50,27 +49,3 @@ func WriteStorageFile(path string, config paths.StorageConfig) error {
return nil
}
-
-func (c *StorageMiner) StorageManager() sealer.Config {
- return sealer.Config{
- ParallelFetchLimit: c.Storage.ParallelFetchLimit,
- AllowAddPiece: c.Storage.AllowAddPiece,
- AllowPreCommit1: c.Storage.AllowPreCommit1,
- AllowPreCommit2: c.Storage.AllowPreCommit2,
- AllowCommit: c.Storage.AllowCommit,
- AllowUnseal: c.Storage.AllowUnseal,
- AllowReplicaUpdate: c.Storage.AllowReplicaUpdate,
- AllowProveReplicaUpdate2: c.Storage.AllowProveReplicaUpdate2,
- AllowRegenSectorKey: c.Storage.AllowRegenSectorKey,
- ResourceFiltering: c.Storage.ResourceFiltering,
- DisallowRemoteFinalize: c.Storage.DisallowRemoteFinalize,
-
- LocalWorkerName: c.Storage.LocalWorkerName,
-
- Assigner: c.Storage.Assigner,
-
- ParallelCheckLimit: c.Proving.ParallelCheckLimit,
- DisableBuiltinWindowPoSt: c.Proving.DisableBuiltinWindowPoSt,
- DisableBuiltinWinningPoSt: c.Proving.DisableBuiltinWinningPoSt,
- }
-}
diff --git a/node/config/types.go b/node/config/types.go
index ddc574efb..cc1a943f4 100644
--- a/node/config/types.go
+++ b/node/config/types.go
@@ -4,7 +4,6 @@ import (
"github.com/ipfs/go-cid"
"github.com/filecoin-project/lotus/chain/types"
- "github.com/filecoin-project/lotus/storage/sealer"
)
// // NOTE: ONLY PUT STRUCT DEFINITIONS IN THIS FILE
@@ -27,6 +26,7 @@ type FullNode struct {
Wallet Wallet
Fees FeeConfig
Chainstore Chainstore
+ Cluster UserRaftConfig
}
// // Common
@@ -158,10 +158,10 @@ type DealmakingConfig struct {
StartEpochSealingBuffer uint64
// A command used for fine-grained evaluation of storage deals
- // see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
+ // see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
Filter string
// A command used for fine-grained evaluation of retrieval deals
- // see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
+ // see https://lotus.filecoin.io/storage-providers/advanced-configurations/market/#using-filters-for-fine-grained-storage-and-retrieval-deal-acceptance for more details
RetrievalFilter string
RetrievalPricing *RetrievalPricing
@@ -230,6 +230,23 @@ type ProvingConfig struct {
// 'lotus-miner proving compute window-post 0'
ParallelCheckLimit int
+ // Maximum amount of time a proving pre-check can take for a sector. If the check times out the sector will be skipped
+ //
+ // WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the
+ // test challenge took longer than this timeout
+ // WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this sector are
+ // blocked (e.g. in case of disconnected NFS mount)
+ SingleCheckTimeout Duration
+
+ // Maximum amount of time a proving pre-check can take for an entire partition. If the check times out, sectors in
+ // the partition which didn't get checked on time will be skipped
+ //
+ // WARNING: Setting this value too low risks in sectors being skipped even though they are accessible, just reading the
+ // test challenge took longer than this timeout
+ // WARNING: Setting this value too high risks missing PoSt deadline in case IO operations related to this partition are
+ // blocked or slow
+ PartitionCheckTimeout Duration
+
// Disable Window PoSt computation on the lotus-miner process even if no window PoSt workers are present.
//
// WARNING: If no windowPoSt workers are connected, window PoSt WILL FAIL resulting in faulty sectors which will need
@@ -276,11 +293,9 @@ type ProvingConfig struct {
// A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors.
//
// The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which
- // means that a single message can prove at most 10 partinions
+ // means that a single message can prove at most 10 partitions
//
- // In some cases when submitting PoSt messages which are recovering sectors, the default network limit may still be
- // too high to fit in the block gas limit; In those cases it may be necessary to set this value to something lower
- // than 10; Note that setting this value lower may result in less efficient gas use - more messages will be sent,
+ // Note that setting this value lower may result in less efficient gas use - more messages will be sent,
// to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)
//
// Setting this value above the network limit has no effect
@@ -294,6 +309,16 @@ type ProvingConfig struct {
// Note that setting this value lower may result in less efficient gas use - more messages will be sent than needed,
// resulting in more total gas use (but each message will have lower gas limit)
MaxPartitionsPerRecoveryMessage int
+
+ // Enable single partition per PoSt Message for partitions containing recovery sectors
+ //
+ // In cases when submitting PoSt messages which contain recovering sectors, the default network limit may still be
+ // too high to fit in the block gas limit. In those cases, it becomes useful to only house the single partition
+ // with recovering sectors in the post message
+ //
+ // Note that setting this value lower may result in less efficient gas use - more messages will be sent,
+ // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit)
+ SingleRecoveringPartitionPerPostMessage bool
}
type SealingConfig struct {
@@ -319,6 +344,24 @@ type SealingConfig struct {
// Upper bound on how many sectors can be sealing+upgrading at the same time when upgrading CC sectors with deals (0 = MaxSealingSectorsForDeals)
MaxUpgradingSectors uint64
+ // When set to a non-zero value, minimum number of epochs until sector expiration required for sectors to be considered
+ // for upgrades (0 = DealMinDuration = 180 days = 518400 epochs)
+ //
+ // Note that if all deals waiting in the input queue have lifetimes longer than this value, upgrade sectors will be
+ // required to have expiration of at least the soonest-ending deal
+ MinUpgradeSectorExpiration uint64
+
+ // When set to a non-zero value, minimum number of epochs until sector expiration above which upgrade candidates will
+ // be selected based on lowest initial pledge.
+ //
+ // Target sector expiration is calculated by looking at the input deal queue, sorting it by deal expiration, and
+ // selecting N deals from the queue up to sector size. The target expiration will be Nth deal end epoch, or in case
+ // where there weren't enough deals to fill a sector, DealMaxDuration (540 days = 1555200 epochs)
+ //
+ // Setting this to a high value (for example to maximum deal duration - 1555200) will disable selection based on
+ // initial pledge - upgrade sectors will always be chosen based on longest expiration
+ MinTargetUpgradeSectorExpiration uint64
+
// CommittedCapacitySectorLifetime is the duration a Committed Capacity (CC) sector will
// live before it must be extended or converted into sector containing deals before it is
// terminated. Value must be between 180-540 days inclusive
@@ -391,7 +434,7 @@ type SealingConfig struct {
type SealerConfig struct {
ParallelFetchLimit int
- // Local worker config
+ AllowSectorDownload bool
AllowAddPiece bool
AllowPreCommit1 bool
AllowPreCommit2 bool
@@ -426,7 +469,7 @@ type SealerConfig struct {
// ResourceFiltering instructs the system which resource filtering strategy
// to use when evaluating tasks against this worker. An empty value defaults
// to "hardware".
- ResourceFiltering sealer.ResourceFilteringStrategy
+ ResourceFiltering ResourceFilteringStrategy
}
type BatchFeeConfig struct {
@@ -520,6 +563,19 @@ type Pubsub struct {
DirectPeers []string
IPColocationWhitelist []string
RemoteTracer string
+ // Path to file that will be used to output tracer content in JSON format.
+ // If present tracer will save data to defined file.
+ // Format: file path
+ JsonTracer string
+ // Connection string for elasticsearch instance.
+ // If present tracer will save data to elasticsearch.
+ // Format: https://:@:/
+ ElasticSearchTracer string
+ // Name of elasticsearch index that will be used to save tracer data.
+ // This property is used only if ElasticSearchTracer propery is set.
+ ElasticSearchIndex string
+ // Auth token that will be passed with logs to elasticsearch - used for weighted peers score.
+ TracerSourceAuth string
}
type Chainstore struct {
@@ -529,7 +585,7 @@ type Chainstore struct {
type Splitstore struct {
// ColdStoreType specifies the type of the coldstore.
- // It can be "universal" (default) or "discard" for discarding cold blocks.
+ // It can be "messages" (default) to store only messages, "universal" to store all chain state or "discard" for discarding cold blocks.
ColdStoreType string
// HotStoreType specifies the type of the hotstore.
// Only currently supported value is "badger".
@@ -545,21 +601,6 @@ type Splitstore struct {
// A value of 0 disables, while a value 1 will do full GC in every compaction.
// Default is 20 (about once a week).
HotStoreFullGCFrequency uint64
-
- // EnableColdStoreAutoPrune turns on compaction of the cold store i.e. pruning
- // where hotstore compaction occurs every finality epochs pruning happens every 3 finalities
- // Default is false
- EnableColdStoreAutoPrune bool
-
- // ColdStoreFullGCFrequency specifies how often to performa a full (moving) GC on the coldstore.
- // Only applies if auto prune is enabled. A value of 0 disables while a value of 1 will do
- // full GC in every prune.
- // Default is 7 (about once every a week)
- ColdStoreFullGCFrequency uint64
-
- // ColdStoreRetention specifies the retention policy for data reachable from the chain, in
- // finalities beyond the compaction boundary, default is 0, -1 retains everything
- ColdStoreRetention int64
}
// // Full Node
@@ -590,3 +631,30 @@ type Wallet struct {
type FeeConfig struct {
DefaultMaxFee types.FIL
}
+
+type UserRaftConfig struct {
+ // EXPERIMENTAL. config to enabled node cluster with raft consensus
+ ClusterModeEnabled bool
+ // A folder to store Raft's data.
+ DataFolder string
+ // InitPeersetMultiAddr provides the list of initial cluster peers for new Raft
+ // peers (with no prior state). It is ignored when Raft was already
+ // initialized or when starting in staging mode.
+ InitPeersetMultiAddr []string
+ // LeaderTimeout specifies how long to wait for a leader before
+ // failing an operation.
+ WaitForLeaderTimeout Duration
+ // NetworkTimeout specifies how long before a Raft network
+ // operation is timed out
+ NetworkTimeout Duration
+ // CommitRetries specifies how many times we retry a failed commit until
+ // we give up.
+ CommitRetries int
+ // How long to wait between retries
+ CommitRetryDelay Duration
+ // BackupsRotate specifies the maximum number of Raft's DataFolder
+ // copies that we keep as backups (renaming) after cleanup.
+ BackupsRotate int
+ // Tracing enables propagation of contexts across binary boundaries.
+ Tracing bool
+}
diff --git a/node/impl/client/client.go b/node/impl/client/client.go
index cefdfbc82..fef4d91e3 100644
--- a/node/impl/client/client.go
+++ b/node/impl/client/client.go
@@ -10,6 +10,7 @@ import (
"os"
"sort"
"strings"
+ "sync"
"time"
"github.com/ipfs/go-blockservice"
@@ -52,7 +53,7 @@ import (
"github.com/filecoin-project/go-padreader"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/lotus/api"
@@ -97,6 +98,7 @@ type API struct {
Imports dtypes.ClientImportMgr
StorageBlockstoreAccessor storagemarket.BlockstoreAccessor
RtvlBlockstoreAccessor rm.BlockstoreAccessor
+ ApiBlockstoreAccessor *retrievaladapter.APIBlockstoreAccessor
DataTransfer dtypes.ClientDataTransfer
Host host.Host
@@ -228,12 +230,12 @@ func (a *API) dealStarter(ctx context.Context, params *api.StartDealParams, isSt
// stateless flow from here to the end
//
- label, err := market8.NewLabelFromString(params.Data.Root.Encode(multibase.MustNewEncoder('u')))
+ label, err := markettypes.NewLabelFromString(params.Data.Root.Encode(multibase.MustNewEncoder('u')))
if err != nil {
return nil, xerrors.Errorf("failed to encode label: %w", err)
}
- dealProposal := &market8.DealProposal{
+ dealProposal := &markettypes.DealProposal{
PieceCID: *params.Data.PieceCid,
PieceSize: params.Data.PieceSize.Padded(),
Client: walletKey,
@@ -265,7 +267,7 @@ func (a *API) dealStarter(ctx context.Context, params *api.StartDealParams, isSt
return nil, xerrors.Errorf("failed to sign proposal : %w", err)
}
- dealProposalSigned := &market8.ClientDealProposal{
+ dealProposalSigned := &markettypes.ClientDealProposal{
Proposal: *dealProposal,
ClientSignature: *dealProposalSig,
}
@@ -837,7 +839,7 @@ func (a *API) doRetrieval(ctx context.Context, order api.RetrievalOrder, sel dat
return 0, xerrors.Errorf("cannot make retrieval deal for zero bytes")
}
- ppb := types.BigDiv(order.Total, types.NewInt(order.Size))
+ ppb := types.BigDiv(big.Sub(order.Total, order.UnsealPrice), types.NewInt(order.Size))
params, err := rm.NewParamsV1(ppb, order.PaymentInterval, order.PaymentIntervalIncrease, sel, order.Piece, order.UnsealPrice)
if err != nil {
@@ -845,6 +847,13 @@ func (a *API) doRetrieval(ctx context.Context, order api.RetrievalOrder, sel dat
}
id := a.Retrieval.NextID()
+
+ if order.RemoteStore != nil {
+ if err := a.ApiBlockstoreAccessor.RegisterDealToRetrievalStore(id, *order.RemoteStore); err != nil {
+ return 0, xerrors.Errorf("registering api store: %w", err)
+ }
+ }
+
id, err = a.Retrieval.Retrieve(
ctx,
id,
@@ -999,6 +1008,8 @@ func (a *API) outputCAR(ctx context.Context, ds format.DAGService, bs bstore.Blo
roots[i] = dag.root
}
+ var lk sync.Mutex
+
return dest.doWrite(func(w io.Writer) error {
if err := car.WriteHeader(&car.CarHeader{
@@ -1011,13 +1022,29 @@ func (a *API) outputCAR(ctx context.Context, ds format.DAGService, bs bstore.Blo
cs := cid.NewSet()
for _, dagSpec := range dags {
+ dagSpec := dagSpec
+
if err := utils.TraverseDag(
ctx,
ds,
root,
dagSpec.selector,
+ func(node format.Node) error {
+ // if we're exporting merkle proofs for this dag, export all nodes read by the traversal
+ if dagSpec.exportAll {
+ lk.Lock()
+ defer lk.Unlock()
+ if cs.Visit(node.Cid()) {
+ err := util.LdWrite(w, node.Cid().Bytes(), node.RawData())
+ if err != nil {
+ return xerrors.Errorf("writing block data: %w", err)
+ }
+ }
+ }
+ return nil
+ },
func(p traversal.Progress, n ipld.Node, r traversal.VisitReason) error {
- if r == traversal.VisitReason_SelectionMatch {
+ if !dagSpec.exportAll && r == traversal.VisitReason_SelectionMatch {
var c cid.Cid
if p.LastBlock.Link == nil {
c = root
@@ -1082,8 +1109,9 @@ func (a *API) outputUnixFS(ctx context.Context, root cid.Cid, ds format.DAGServi
}
type dagSpec struct {
- root cid.Cid
- selector ipld.Node
+ root cid.Cid
+ selector ipld.Node
+ exportAll bool
}
func parseDagSpec(ctx context.Context, root cid.Cid, dsp []api.DagSpec, ds format.DAGService, car bool) ([]dagSpec, error) {
@@ -1098,6 +1126,7 @@ func parseDagSpec(ctx context.Context, root cid.Cid, dsp []api.DagSpec, ds forma
out := make([]dagSpec, len(dsp))
for i, spec := range dsp {
+ out[i].exportAll = spec.ExportMerkleProof
if spec.DataSelector == nil {
return nil, xerrors.Errorf("invalid DagSpec at position %d: `DataSelector` can not be nil", i)
@@ -1131,6 +1160,7 @@ func parseDagSpec(ctx context.Context, root cid.Cid, dsp []api.DagSpec, ds forma
ds,
root,
rsn,
+ nil,
func(p traversal.Progress, n ipld.Node, r traversal.VisitReason) error {
if r == traversal.VisitReason_SelectionMatch {
if !car && p.LastBlock.Path.String() != p.Path.String() {
diff --git a/node/impl/common/common.go b/node/impl/common/common.go
index 182b74989..eff6b58b8 100644
--- a/node/impl/common/common.go
+++ b/node/impl/common/common.go
@@ -2,6 +2,7 @@ package common
import (
"context"
+ "time"
"github.com/gbrlsnchs/jwt/v3"
"github.com/google/uuid"
@@ -26,6 +27,8 @@ type CommonAPI struct {
Alerting *alerting.Alerting
APISecret *dtypes.APIAlg
ShutdownChan dtypes.ShutdownChan
+
+ Start dtypes.NodeStartTime
}
type jwtPayload struct {
@@ -91,3 +94,7 @@ func (a *CommonAPI) Session(ctx context.Context) (uuid.UUID, error) {
func (a *CommonAPI) Closing(ctx context.Context) (<-chan struct{}, error) {
return make(chan struct{}), nil // relies on jsonrpc closing
}
+
+func (a *CommonAPI) StartTime(context.Context) (time.Time, error) {
+ return time.Time(a.Start), nil
+}
diff --git a/node/impl/full.go b/node/impl/full.go
index e1e7ac7a0..03a28eb75 100644
--- a/node/impl/full.go
+++ b/node/impl/full.go
@@ -34,6 +34,7 @@ type FullNodeAPI struct {
full.MsigAPI
full.WalletAPI
full.SyncAPI
+ full.RaftAPI
DS dtypes.MetadataDS
NetworkName dtypes.NetworkName
@@ -117,4 +118,12 @@ func (n *FullNodeAPI) NodeStatus(ctx context.Context, inclChainStatus bool) (sta
return status, nil
}
+func (n *FullNodeAPI) RaftState(ctx context.Context) (*api.RaftStateData, error) {
+ return n.RaftAPI.GetRaftState(ctx)
+}
+
+func (n *FullNodeAPI) RaftLeader(ctx context.Context) (peer.ID, error) {
+ return n.RaftAPI.Leader(ctx)
+}
+
var _ api.FullNode = &FullNodeAPI{}
diff --git a/node/impl/full/gas.go b/node/impl/full/gas.go
index c179c27d6..8cbe9ea1c 100644
--- a/node/impl/full/gas.go
+++ b/node/impl/full/gas.go
@@ -290,6 +290,10 @@ func gasEstimateGasLimit(
if err != nil {
return -1, xerrors.Errorf("CallWithGas failed: %w", err)
}
+ if res.MsgRct.ExitCode == exitcode.SysErrOutOfGas {
+ return -1, &api.ErrOutOfGas{}
+ }
+
if res.MsgRct.ExitCode != exitcode.Ok {
return -1, xerrors.Errorf("message execution failed: exit %s, reason: %s", res.MsgRct.ExitCode, res.Error)
}
@@ -356,7 +360,7 @@ func (m *GasModule) GasEstimateMessageGas(ctx context.Context, msg *types.Messag
if msg.GasLimit == 0 {
gasLimit, err := m.GasEstimateGasLimit(ctx, msg, types.EmptyTSK)
if err != nil {
- return nil, xerrors.Errorf("estimating gas used: %w", err)
+ return nil, err
}
msg.GasLimit = int64(float64(gasLimit) * m.Mpool.GetConfig().GasLimitOverestimation)
}
diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go
index 98b2ac8a6..31d134dac 100644
--- a/node/impl/full/mpool.go
+++ b/node/impl/full/mpool.go
@@ -4,6 +4,7 @@ import (
"context"
"encoding/json"
+ "github.com/google/uuid"
"github.com/ipfs/go-cid"
"go.uber.org/fx"
"golang.org/x/xerrors"
@@ -43,7 +44,9 @@ type MpoolAPI struct {
WalletAPI
GasAPI
- MessageSigner *messagesigner.MessageSigner
+ RaftAPI
+
+ MessageSigner messagesigner.MsgSigner
PushLocks *dtypes.MpoolLocker
}
@@ -130,7 +133,7 @@ func (a *MpoolAPI) MpoolClear(ctx context.Context, local bool) error {
}
func (m *MpoolModule) MpoolPush(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) {
- return m.Mpool.Push(ctx, smsg)
+ return m.Mpool.Push(ctx, smsg, true)
}
func (a *MpoolAPI) MpoolPushUntrusted(ctx context.Context, smsg *types.SignedMessage) (cid.Cid, error) {
@@ -142,8 +145,29 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe
msg = &cp
inMsg := *msg
- // Check if this uuid has already been processed
- if spec != nil {
+ // Redirect to leader if current node is not leader. A single non raft based node is always the leader
+ if !a.RaftAPI.IsLeader(ctx) {
+ var signedMsg types.SignedMessage
+ redirected, err := a.RaftAPI.RedirectToLeader(ctx, "MpoolPushMessage", api.MpoolMessageWhole{Msg: msg, Spec: spec}, &signedMsg)
+ if err != nil {
+ return nil, err
+ }
+ // It's possible that the current node became the leader between the check and the redirect
+ // In that case, continue with rest of execution and only return signedMsg if something was redirected
+ if redirected {
+ return &signedMsg, nil
+ }
+ }
+
+ // Generate spec and uuid if not available in the message
+ if spec == nil {
+ spec = &api.MessageSendSpec{
+ MsgUuid: uuid.New(),
+ }
+ } else if (spec.MsgUuid == uuid.UUID{}) {
+ spec.MsgUuid = uuid.New()
+ } else {
+ // Check if this uuid has already been processed. Ignore if uuid is not populated
signedMessage, err := a.MessageSigner.GetSignedMessage(ctx, spec.MsgUuid)
if err == nil {
log.Warnf("Message already processed. cid=%s", signedMessage.Cid())
@@ -195,7 +219,7 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe
}
// Sign and push the message
- signedMsg, err := a.MessageSigner.SignMessage(ctx, msg, func(smsg *types.SignedMessage) error {
+ signedMsg, err := a.MessageSigner.SignMessage(ctx, msg, spec, func(smsg *types.SignedMessage) error {
if _, err := a.MpoolModuleAPI.MpoolPush(ctx, smsg); err != nil {
return xerrors.Errorf("mpool push: failed to push message: %w", err)
}
@@ -206,11 +230,9 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe
}
// Store uuid->signed message in datastore
- if spec != nil {
- err = a.MessageSigner.StoreSignedMessage(ctx, spec.MsgUuid, signedMsg)
- if err != nil {
- return nil, err
- }
+ err = a.MessageSigner.StoreSignedMessage(ctx, spec.MsgUuid, signedMsg)
+ if err != nil {
+ return nil, err
}
return signedMsg, nil
@@ -219,7 +241,7 @@ func (a *MpoolAPI) MpoolPushMessage(ctx context.Context, msg *types.Message, spe
func (a *MpoolAPI) MpoolBatchPush(ctx context.Context, smsgs []*types.SignedMessage) ([]cid.Cid, error) {
var messageCids []cid.Cid
for _, smsg := range smsgs {
- smsgCid, err := a.Mpool.Push(ctx, smsg)
+ smsgCid, err := a.Mpool.Push(ctx, smsg, true)
if err != nil {
return messageCids, err
}
diff --git a/node/impl/full/multisig.go b/node/impl/full/multisig.go
index 8438f7419..886d66d5e 100644
--- a/node/impl/full/multisig.go
+++ b/node/impl/full/multisig.go
@@ -8,6 +8,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
multisig2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig"
@@ -29,7 +30,7 @@ func (a *MsigAPI) messageBuilder(ctx context.Context, from address.Address) (mul
if err != nil {
return nil, err
}
- av, err := actors.VersionForNetwork(nver)
+ av, err := actorstypes.VersionForNetwork(nver)
if err != nil {
return nil, err
}
diff --git a/node/impl/full/raft.go b/node/impl/full/raft.go
new file mode 100644
index 000000000..8d665ddd5
--- /dev/null
+++ b/node/impl/full/raft.go
@@ -0,0 +1,50 @@
+package full
+
+import (
+ "context"
+
+ "github.com/libp2p/go-libp2p/core/peer"
+ "go.uber.org/fx"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/messagesigner"
+)
+
+type RaftAPI struct {
+ fx.In
+
+ MessageSigner *messagesigner.MessageSignerConsensus `optional:"true"`
+}
+
+func (r *RaftAPI) GetRaftState(ctx context.Context) (*api.RaftStateData, error) {
+ if r.MessageSigner == nil {
+ return nil, xerrors.Errorf("raft consensus not enabled. Please check your configuration")
+ }
+ raftState, err := r.MessageSigner.GetRaftState(ctx)
+ if err != nil {
+ return nil, err
+ }
+ return &api.RaftStateData{NonceMap: raftState.NonceMap, MsgUuids: raftState.MsgUuids}, nil
+}
+
+func (r *RaftAPI) Leader(ctx context.Context) (peer.ID, error) {
+ if r.MessageSigner == nil {
+ return "", xerrors.Errorf("raft consensus not enabled. Please check your configuration")
+ }
+ return r.MessageSigner.Leader(ctx)
+}
+
+func (r *RaftAPI) IsLeader(ctx context.Context) bool {
+ if r.MessageSigner == nil {
+ return true
+ }
+ return r.MessageSigner.IsLeader(ctx)
+}
+
+func (r *RaftAPI) RedirectToLeader(ctx context.Context, method string, arg interface{}, ret interface{}) (bool, error) {
+ if r.MessageSigner == nil {
+ return false, xerrors.Errorf("raft consensus not enabled. Please check your configuration")
+ }
+ return r.MessageSigner.RedirectToLeader(ctx, method, arg, ret)
+}
diff --git a/node/impl/full/state.go b/node/impl/full/state.go
index 08800ba10..91ffd3b9e 100644
--- a/node/impl/full/state.go
+++ b/node/impl/full/state.go
@@ -16,8 +16,10 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
@@ -29,6 +31,7 @@ import (
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/builtin"
+ "github.com/filecoin-project/lotus/chain/actors/builtin/datacap"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
"github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
@@ -176,6 +179,9 @@ func (m *StateModule) StateMinerInfo(ctx context.Context, actor address.Address,
SectorSize: info.SectorSize,
WindowPoStPartitionSectors: info.WindowPoStPartitionSectors,
ConsensusFaultElapsed: info.ConsensusFaultElapsed,
+ Beneficiary: info.Beneficiary,
+ BeneficiaryTerm: &info.BeneficiaryTerm,
+ PendingBeneficiaryTerm: info.PendingBeneficiaryTerm,
}
if info.PendingWorkerKey != nil {
@@ -478,7 +484,12 @@ func (m *StateModule) StateLookupID(ctx context.Context, addr address.Address, t
return address.Undef, xerrors.Errorf("loading tipset %s: %w", tsk, err)
}
- return m.StateManager.LookupID(ctx, addr, ts)
+ ret, err := m.StateManager.LookupID(ctx, addr, ts)
+ if err != nil && xerrors.Is(err, types.ErrActorNotFound) {
+ return address.Undef, &api.ErrActorNotFound{}
+ }
+
+ return ret, err
}
func (a *StateAPI) StateLookupRobustAddress(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) {
@@ -760,6 +771,135 @@ func (m *StateModule) StateMarketStorageDeal(ctx context.Context, dealId abi.Dea
return stmgr.GetStorageDeal(ctx, m.StateManager, dealId, ts)
}
+func (a *StateAPI) StateGetAllocationForPendingDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*verifreg.Allocation, error) {
+ ts, err := a.Chain.GetTipSetFromKey(ctx, tsk)
+ if err != nil {
+ return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err)
+ }
+
+ st, err := a.StateManager.GetMarketState(ctx, ts)
+ if err != nil {
+ return nil, err
+ }
+
+ allocationId, err := st.GetAllocationIdForPendingDeal(dealId)
+ if err != nil {
+ return nil, err
+ }
+ if allocationId == verifregtypes.NoAllocationID {
+ return nil, nil
+ }
+
+ dealState, err := a.StateMarketStorageDeal(ctx, dealId, tsk)
+ if err != nil {
+ return nil, err
+ }
+
+ return a.StateGetAllocation(ctx, dealState.Proposal.Client, allocationId, tsk)
+}
+
+func (a *StateAPI) StateGetAllocation(ctx context.Context, clientAddr address.Address, allocationId verifreg.AllocationId, tsk types.TipSetKey) (*verifreg.Allocation, error) {
+ idAddr, err := a.StateLookupID(ctx, clientAddr, tsk)
+ if err != nil {
+ return nil, err
+ }
+
+ ts, err := a.Chain.GetTipSetFromKey(ctx, tsk)
+ if err != nil {
+ return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err)
+ }
+
+ st, err := a.StateManager.GetVerifregState(ctx, ts)
+ if err != nil {
+ return nil, err
+ }
+
+ allocation, found, err := st.GetAllocation(idAddr, allocationId)
+ if err != nil {
+ return nil, xerrors.Errorf("getting allocation: %w", err)
+ }
+ if !found {
+ return nil, nil
+ }
+
+ return allocation, nil
+}
+
+func (a *StateAPI) StateGetAllocations(ctx context.Context, clientAddr address.Address, tsk types.TipSetKey) (map[verifreg.AllocationId]verifreg.Allocation, error) {
+ idAddr, err := a.StateLookupID(ctx, clientAddr, tsk)
+ if err != nil {
+ return nil, err
+ }
+
+ ts, err := a.Chain.GetTipSetFromKey(ctx, tsk)
+ if err != nil {
+ return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err)
+ }
+
+ st, err := a.StateManager.GetVerifregState(ctx, ts)
+ if err != nil {
+ return nil, xerrors.Errorf("loading verifreg state: %w", err)
+ }
+
+ allocations, err := st.GetAllocations(idAddr)
+ if err != nil {
+ return nil, xerrors.Errorf("getting allocations: %w", err)
+ }
+
+ return allocations, nil
+}
+
+func (a *StateAPI) StateGetClaim(ctx context.Context, providerAddr address.Address, claimId verifreg.ClaimId, tsk types.TipSetKey) (*verifreg.Claim, error) {
+ idAddr, err := a.StateLookupID(ctx, providerAddr, tsk)
+ if err != nil {
+ return nil, err
+ }
+
+ ts, err := a.Chain.GetTipSetFromKey(ctx, tsk)
+ if err != nil {
+ return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err)
+ }
+
+ st, err := a.StateManager.GetVerifregState(ctx, ts)
+ if err != nil {
+ return nil, err
+ }
+
+ claim, found, err := st.GetClaim(idAddr, claimId)
+ if err != nil {
+ return nil, xerrors.Errorf("getting claim: %w", err)
+ }
+ if !found {
+ return nil, nil
+ }
+
+ return claim, nil
+}
+
+func (a *StateAPI) StateGetClaims(ctx context.Context, providerAddr address.Address, tsk types.TipSetKey) (map[verifreg.ClaimId]verifreg.Claim, error) {
+ idAddr, err := a.StateLookupID(ctx, providerAddr, tsk)
+ if err != nil {
+ return nil, err
+ }
+
+ ts, err := a.Chain.GetTipSetFromKey(ctx, tsk)
+ if err != nil {
+ return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err)
+ }
+
+ st, err := a.StateManager.GetVerifregState(ctx, ts)
+ if err != nil {
+ return nil, xerrors.Errorf("loading verifreg state: %w", err)
+ }
+
+ claims, err := st.GetClaims(idAddr)
+ if err != nil {
+ return nil, xerrors.Errorf("getting claims: %w", err)
+ }
+
+ return claims, nil
+}
+
func (a *StateAPI) StateComputeDataCID(ctx context.Context, maddr address.Address, sectorType abi.RegisteredSealProof, deals []abi.DealID, tsk types.TipSetKey) (cid.Cid, error) {
nv, err := a.StateNetworkVersion(ctx, tsk)
if err != nil {
@@ -906,6 +1046,7 @@ func (a *StateAPI) StateSectorPreCommitInfo(ctx context.Context, maddr address.A
return pci, err
}
+// Returns nil, nil if sector is not found
func (m *StateModule) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) {
ts, err := m.Chain.GetTipSetFromKey(ctx, tsk)
if err != nil {
@@ -953,7 +1094,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc
_, err := a.StateLookupID(ctx, match.To, tsk)
// if the recipient doesn't exist at the start point, we're not gonna find any matches
- if xerrors.Is(err, types.ErrActorNotFound) {
+ if xerrors.Is(err, &api.ErrActorNotFound{}) {
return nil, nil
}
@@ -964,7 +1105,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc
_, err := a.StateLookupID(ctx, match.From, tsk)
// if the sender doesn't exist at the start point, we're not gonna find any matches
- if xerrors.Is(err, types.ErrActorNotFound) {
+ if xerrors.Is(err, &api.ErrActorNotFound{}) {
return nil, nil
}
@@ -1185,16 +1326,20 @@ func (a *StateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr
store := a.Chain.ActorStore(ctx)
var sectorWeight abi.StoragePower
- if act, err := state.GetActor(market.Address); err != nil {
- return types.EmptyInt, xerrors.Errorf("loading market actor %s: %w", maddr, err)
- } else if s, err := market.Load(store, act); err != nil {
- return types.EmptyInt, xerrors.Errorf("loading market actor state %s: %w", maddr, err)
- } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil {
- return types.EmptyInt, xerrors.Errorf("verifying deals for activation: %w", err)
+ if a.StateManager.GetNetworkVersion(ctx, ts.Height()) <= network.Version16 {
+ if act, err := state.GetActor(market.Address); err != nil {
+ return types.EmptyInt, xerrors.Errorf("loading market actor %s: %w", maddr, err)
+ } else if s, err := market.Load(store, act); err != nil {
+ return types.EmptyInt, xerrors.Errorf("loading market actor state %s: %w", maddr, err)
+ } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil {
+ return types.EmptyInt, xerrors.Errorf("verifying deals for activation: %w", err)
+ } else {
+ // NB: not exactly accurate, but should always lead us to *over* estimate, not under
+ duration := pci.Expiration - ts.Height()
+ sectorWeight = builtin.QAPowerForWeight(ssize, duration, w, vw)
+ }
} else {
- // NB: not exactly accurate, but should always lead us to *over* estimate, not under
- duration := pci.Expiration - ts.Height()
- sectorWeight = builtin.QAPowerForWeight(ssize, duration, w, vw)
+ sectorWeight = minertypes.QAPowerMax(ssize)
}
var powerSmoothed builtin.FilterEstimate
@@ -1386,26 +1531,56 @@ func (a *StateAPI) StateVerifierStatus(ctx context.Context, addr address.Address
// Returns zero if there is no entry in the data cap table for the
// address.
func (m *StateModule) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) {
- act, err := m.StateGetActor(ctx, verifreg.Address, tsk)
- if err != nil {
- return nil, err
- }
-
aid, err := m.StateLookupID(ctx, addr, tsk)
if err != nil {
log.Warnf("lookup failure %v", err)
return nil, err
}
- vrs, err := verifreg.Load(m.StateManager.ChainStore().ActorStore(ctx), act)
+ nv, err := m.StateNetworkVersion(ctx, tsk)
if err != nil {
- return nil, xerrors.Errorf("failed to load verified registry state: %w", err)
+ return nil, err
}
- verified, dcap, err := vrs.VerifiedClientDataCap(aid)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
- return nil, xerrors.Errorf("looking up verified client: %w", err)
+ return nil, err
}
+
+ var dcap abi.StoragePower
+ var verified bool
+ if av <= 8 {
+ act, err := m.StateGetActor(ctx, verifreg.Address, tsk)
+ if err != nil {
+ return nil, err
+ }
+
+ vrs, err := verifreg.Load(m.StateManager.ChainStore().ActorStore(ctx), act)
+ if err != nil {
+ return nil, xerrors.Errorf("failed to load verified registry state: %w", err)
+ }
+
+ verified, dcap, err = vrs.VerifiedClientDataCap(aid)
+ if err != nil {
+ return nil, xerrors.Errorf("looking up verified client: %w", err)
+ }
+ } else {
+ act, err := m.StateGetActor(ctx, datacap.Address, tsk)
+ if err != nil {
+ return nil, err
+ }
+
+ dcs, err := datacap.Load(m.StateManager.ChainStore().ActorStore(ctx), act)
+ if err != nil {
+ return nil, xerrors.Errorf("failed to load datacap actor state: %w", err)
+ }
+
+ verified, dcap, err = dcs.VerifiedClientDataCap(aid)
+ if err != nil {
+ return nil, xerrors.Errorf("looking up verified client: %w", err)
+ }
+ }
+
if !verified {
return nil, nil
}
@@ -1536,7 +1711,7 @@ func (m *StateModule) StateNetworkVersion(ctx context.Context, tsk types.TipSetK
}
func (a *StateAPI) StateActorCodeCIDs(ctx context.Context, nv network.Version) (map[string]cid.Cid, error) {
- actorVersion, err := actors.VersionForNetwork(nv)
+ actorVersion, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return nil, xerrors.Errorf("invalid network version %d: %w", nv, err)
}
@@ -1550,7 +1725,7 @@ func (a *StateAPI) StateActorCodeCIDs(ctx context.Context, nv network.Version) (
}
func (a *StateAPI) StateActorManifestCID(ctx context.Context, nv network.Version) (cid.Cid, error) {
- actorVersion, err := actors.VersionForNetwork(nv)
+ actorVersion, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return cid.Undef, xerrors.Errorf("invalid network version")
}
@@ -1623,6 +1798,8 @@ func (a *StateAPI) StateGetNetworkParams(ctx context.Context) (*api.NetworkParam
UpgradeHyperdriveHeight: build.UpgradeHyperdriveHeight,
UpgradeChocolateHeight: build.UpgradeChocolateHeight,
UpgradeOhSnapHeight: build.UpgradeOhSnapHeight,
+ UpgradeSkyrHeight: build.UpgradeSkyrHeight,
+ UpgradeSharkHeight: build.UpgradeSharkHeight,
},
}, nil
}
diff --git a/node/impl/full/sync.go b/node/impl/full/sync.go
index 2809d41dc..fda55def1 100644
--- a/node/impl/full/sync.go
+++ b/node/impl/full/sync.go
@@ -2,6 +2,7 @@ package full
import (
"context"
+ "os"
"sync/atomic"
"github.com/ipfs/go-cid"
@@ -56,7 +57,7 @@ func (a *SyncAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) erro
return xerrors.Errorf("loading parent block: %w", err)
}
- if a.SlashFilter != nil {
+ if a.SlashFilter != nil && os.Getenv("LOTUS_NO_SLASHFILTER") != "_yes_i_know_i_can_and_probably_will_lose_all_my_fil_and_power_" {
if err := a.SlashFilter.MinedBlock(ctx, blk.Header, parent.Height); err != nil {
log.Errorf(" SLASH FILTER ERROR: %s", err)
return xerrors.Errorf(" SLASH FILTER ERROR: %w", err)
diff --git a/node/impl/storminer.go b/node/impl/storminer.go
index f054f627e..56aa7afde 100644
--- a/node/impl/storminer.go
+++ b/node/impl/storminer.go
@@ -35,7 +35,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
builtintypes "github.com/filecoin-project/go-state-types/builtin"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/api"
@@ -182,16 +182,20 @@ func (sm *StorageMinerAPI) PledgeSector(ctx context.Context) (abi.SectorID, erro
return abi.SectorID{}, err
}
+ return sm.waitSectorStarted(ctx, sr.ID)
+}
+
+func (sm *StorageMinerAPI) waitSectorStarted(ctx context.Context, si abi.SectorID) (abi.SectorID, error) {
// wait for the sector to enter the Packing state
// TODO: instead of polling implement some pubsub-type thing in storagefsm
for {
- info, err := sm.Miner.SectorsStatus(ctx, sr.ID.Number, false)
+ info, err := sm.Miner.SectorsStatus(ctx, si.Number, false)
if err != nil {
return abi.SectorID{}, xerrors.Errorf("getting pledged sector info: %w", err)
}
if info.State != api.SectorState(sealing.UndefinedSectorState) {
- return sr.ID, nil
+ return si, nil
}
select {
@@ -448,6 +452,15 @@ func (sm *StorageMinerAPI) SectorNumFree(ctx context.Context, name string) error
return sm.Miner.NumFree(ctx, name)
}
+func (sm *StorageMinerAPI) SectorReceive(ctx context.Context, meta api.RemoteSectorMeta) error {
+ if err := sm.Miner.Receive(ctx, meta); err != nil {
+ return err
+ }
+
+ _, err := sm.waitSectorStarted(ctx, meta.Sector)
+ return err
+}
+
func (sm *StorageMinerAPI) ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]minertypes.SubmitWindowedPoStParams, error) {
var ts *types.TipSet
var err error
@@ -1282,20 +1295,17 @@ func (sm *StorageMinerAPI) CreateBackup(ctx context.Context, fpath string) error
return backup(ctx, sm.DS, fpath)
}
-func (sm *StorageMinerAPI) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) {
- var rg storiface.RGetter
- if expensive {
- rg = func(ctx context.Context, id abi.SectorID) (cid.Cid, bool, error) {
- si, err := sm.Miner.SectorsStatus(ctx, id.Number, false)
- if err != nil {
- return cid.Undef, false, err
- }
- if si.CommR == nil {
- return cid.Undef, false, xerrors.Errorf("commr is nil")
- }
-
- return *si.CommR, si.ReplicaUpdateMessage != nil, nil
+func (sm *StorageMinerAPI) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef) (map[abi.SectorNumber]string, error) {
+ rg := func(ctx context.Context, id abi.SectorID) (cid.Cid, bool, error) {
+ si, err := sm.Miner.SectorsStatus(ctx, id.Number, false)
+ if err != nil {
+ return cid.Undef, false, err
}
+ if si.CommR == nil {
+ return cid.Undef, false, xerrors.Errorf("commr is nil")
+ }
+
+ return *si.CommR, si.ReplicaUpdateMessage != nil, nil
}
bad, err := sm.StorageMgr.CheckProvable(ctx, pp, sectors, rg)
@@ -1349,6 +1359,14 @@ func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubs
}
func (sm *StorageMinerAPI) ActorWithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) {
+ return sm.withdrawBalance(ctx, amount, true)
+}
+
+func (sm *StorageMinerAPI) BeneficiaryWithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) {
+ return sm.withdrawBalance(ctx, amount, false)
+}
+
+func (sm *StorageMinerAPI) withdrawBalance(ctx context.Context, amount abi.TokenAmount, fromOwner bool) (cid.Cid, error) {
available, err := sm.Full.StateMinerAvailableBalance(ctx, sm.Miner.Address(), types.EmptyTSK)
if err != nil {
return cid.Undef, xerrors.Errorf("Error getting miner balance: %w", err)
@@ -1374,9 +1392,16 @@ func (sm *StorageMinerAPI) ActorWithdrawBalance(ctx context.Context, amount abi.
return cid.Undef, xerrors.Errorf("Error getting miner's owner address: %w", err)
}
+ var sender address.Address
+ if fromOwner {
+ sender = mi.Owner
+ } else {
+ sender = mi.Beneficiary
+ }
+
smsg, err := sm.Full.MpoolPushMessage(ctx, &types.Message{
To: sm.Miner.Address(),
- From: mi.Owner,
+ From: sender,
Value: types.NewInt(0),
Method: builtintypes.MethodsMiner.WithdrawBalance,
Params: params,
diff --git a/node/modules/blockstore.go b/node/modules/blockstore.go
index 21ce41875..90b7b6183 100644
--- a/node/modules/blockstore.go
+++ b/node/modules/blockstore.go
@@ -84,11 +84,9 @@ func SplitBlockstore(cfg *config.Chainstore) func(lc fx.Lifecycle, r repo.Locked
cfg := &splitstore.Config{
MarkSetType: cfg.Splitstore.MarkSetType,
DiscardColdBlocks: cfg.Splitstore.ColdStoreType == "discard",
+ UniversalColdBlocks: cfg.Splitstore.ColdStoreType == "universal",
HotStoreMessageRetention: cfg.Splitstore.HotStoreMessageRetention,
HotStoreFullGCFrequency: cfg.Splitstore.HotStoreFullGCFrequency,
- EnableColdStoreAutoPrune: cfg.Splitstore.EnableColdStoreAutoPrune,
- ColdStoreFullGCFrequency: cfg.Splitstore.ColdStoreFullGCFrequency,
- ColdStoreRetention: cfg.Splitstore.ColdStoreRetention,
}
ss, err := splitstore.Open(path, ds, hot, cold, cfg)
if err != nil {
diff --git a/node/modules/client.go b/node/modules/client.go
index 22fcbb00d..69f8db559 100644
--- a/node/modules/client.go
+++ b/node/modules/client.go
@@ -202,9 +202,9 @@ func StorageClient(lc fx.Lifecycle, h host.Host, dataTransfer dtypes.ClientDataT
// RetrievalClient creates a new retrieval client attached to the client blockstore
func RetrievalClient(forceOffChain bool) func(lc fx.Lifecycle, h host.Host, r repo.LockedRepo, dt dtypes.ClientDataTransfer, payAPI payapi.PaychAPI, resolver discovery.PeerResolver,
- ds dtypes.MetadataDS, chainAPI full.ChainAPI, stateAPI full.StateAPI, accessor retrievalmarket.BlockstoreAccessor, j journal.Journal) (retrievalmarket.RetrievalClient, error) {
+ ds dtypes.MetadataDS, chainAPI full.ChainAPI, stateAPI full.StateAPI, accessor *retrievaladapter.APIBlockstoreAccessor, j journal.Journal) (retrievalmarket.RetrievalClient, error) {
return func(lc fx.Lifecycle, h host.Host, r repo.LockedRepo, dt dtypes.ClientDataTransfer, payAPI payapi.PaychAPI, resolver discovery.PeerResolver,
- ds dtypes.MetadataDS, chainAPI full.ChainAPI, stateAPI full.StateAPI, accessor retrievalmarket.BlockstoreAccessor, j journal.Journal) (retrievalmarket.RetrievalClient, error) {
+ ds dtypes.MetadataDS, chainAPI full.ChainAPI, stateAPI full.StateAPI, accessor *retrievaladapter.APIBlockstoreAccessor, j journal.Journal) (retrievalmarket.RetrievalClient, error) {
adapter := retrievaladapter.NewRetrievalClientNode(forceOffChain, payAPI, chainAPI, stateAPI)
network := rmnet.NewFromLibp2pHost(h)
ds = namespace.Wrap(ds, datastore.NewKey("/retrievals/client"))
diff --git a/node/modules/dtypes/api.go b/node/modules/dtypes/api.go
index d57b05cfa..6de511b9d 100644
--- a/node/modules/dtypes/api.go
+++ b/node/modules/dtypes/api.go
@@ -1,6 +1,8 @@
package dtypes
import (
+ "time"
+
"github.com/gbrlsnchs/jwt/v3"
"github.com/multiformats/go-multiaddr"
)
@@ -8,3 +10,5 @@ import (
type APIAlg jwt.HMACSHA
type APIEndpoint multiaddr.Multiaddr
+
+type NodeStartTime time.Time
diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go
index 6ba9cdb79..2d441eb3f 100644
--- a/node/modules/lp2p/host.go
+++ b/node/modules/lp2p/host.go
@@ -7,11 +7,11 @@ import (
nilrouting "github.com/ipfs/go-ipfs-routing/none"
"github.com/libp2p/go-libp2p"
dht "github.com/libp2p/go-libp2p-kad-dht"
- "github.com/libp2p/go-libp2p-peerstore/pstoremem"
record "github.com/libp2p/go-libp2p-record"
"github.com/libp2p/go-libp2p/core/host"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/core/peerstore"
+ "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem"
routedhost "github.com/libp2p/go-libp2p/p2p/host/routed"
mocknet "github.com/libp2p/go-libp2p/p2p/net/mock"
"go.uber.org/fx"
diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go
index 9f1b58c2b..5376d93c8 100644
--- a/node/modules/lp2p/pubsub.go
+++ b/node/modules/lp2p/pubsub.go
@@ -21,6 +21,7 @@ import (
"github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/node/modules/dtypes"
"github.com/filecoin-project/lotus/node/modules/helpers"
+ "github.com/filecoin-project/lotus/node/modules/tracer"
)
func init() {
@@ -49,6 +50,30 @@ func ScoreKeeper() *dtypes.ScoreKeeper {
return new(dtypes.ScoreKeeper)
}
+type PeerScoreTracker interface {
+ UpdatePeerScore(scores map[peer.ID]*pubsub.PeerScoreSnapshot)
+}
+
+type peerScoreTracker struct {
+ sk *dtypes.ScoreKeeper
+ lt tracer.LotusTracer
+}
+
+func newPeerScoreTracker(lt tracer.LotusTracer, sk *dtypes.ScoreKeeper) PeerScoreTracker {
+ return &peerScoreTracker{
+ sk: sk,
+ lt: lt,
+ }
+}
+
+func (pst *peerScoreTracker) UpdatePeerScore(scores map[peer.ID]*pubsub.PeerScoreSnapshot) {
+ if pst.lt != nil {
+ pst.lt.PeerScores(scores)
+ }
+
+ pst.sk.Update(scores)
+}
+
type GossipIn struct {
fx.In
Mctx helpers.MetricsCtx
@@ -291,7 +316,6 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) {
OpportunisticGraftThreshold: OpportunisticGraftScoreThreshold,
},
),
- pubsub.WithPeerScoreInspect(in.Sk.Update, 10*time.Second),
}
// enable Peer eXchange on bootstrappers
@@ -361,6 +385,27 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) {
pubsub.NewAllowlistSubscriptionFilter(allowTopics...),
100)))
+ var transports []tracer.TracerTransport
+ if in.Cfg.JsonTracer != "" {
+ jsonTransport, err := tracer.NewJsonTracerTransport(in.Cfg.JsonTracer)
+ if err != nil {
+ return nil, err
+ }
+
+ transports = append(transports, jsonTransport)
+ }
+ if in.Cfg.ElasticSearchTracer != "" {
+ elasticSearchTransport, err := tracer.NewElasticSearchTransport(
+ in.Cfg.ElasticSearchTracer,
+ in.Cfg.ElasticSearchIndex,
+ )
+ if err != nil {
+ return nil, err
+ }
+ transports = append(transports, elasticSearchTransport)
+ }
+ lt := tracer.NewLotusTracer(transports, in.Host.ID(), in.Cfg.TracerSourceAuth)
+
// tracer
if in.Cfg.RemoteTracer != "" {
a, err := ma.NewMultiaddr(in.Cfg.RemoteTracer)
@@ -378,12 +423,18 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) {
return nil, err
}
- trw := newTracerWrapper(tr, build.BlocksTopic(in.Nn))
+ pst := newPeerScoreTracker(lt, in.Sk)
+ trw := newTracerWrapper(tr, lt, build.BlocksTopic(in.Nn))
+
options = append(options, pubsub.WithEventTracer(trw))
+ options = append(options, pubsub.WithPeerScoreInspect(pst.UpdatePeerScore, 10*time.Second))
} else {
// still instantiate a tracer for collecting metrics
- trw := newTracerWrapper(nil)
+ trw := newTracerWrapper(nil, lt)
options = append(options, pubsub.WithEventTracer(trw))
+
+ pst := newPeerScoreTracker(lt, in.Sk)
+ options = append(options, pubsub.WithPeerScoreInspect(pst.UpdatePeerScore, 10*time.Second))
}
return pubsub.NewGossipSub(helpers.LifecycleCtx(in.Mctx, in.Lc), in.Host, options...)
@@ -394,7 +445,11 @@ func HashMsgId(m *pubsub_pb.Message) string {
return string(hash[:])
}
-func newTracerWrapper(tr pubsub.EventTracer, topics ...string) pubsub.EventTracer {
+func newTracerWrapper(
+ lp2pTracer pubsub.EventTracer,
+ lotusTracer pubsub.EventTracer,
+ topics ...string,
+) pubsub.EventTracer {
var topicsMap map[string]struct{}
if len(topics) > 0 {
topicsMap = make(map[string]struct{})
@@ -403,12 +458,13 @@ func newTracerWrapper(tr pubsub.EventTracer, topics ...string) pubsub.EventTrace
}
}
- return &tracerWrapper{tr: tr, topics: topicsMap}
+ return &tracerWrapper{lp2pTracer: lp2pTracer, lotusTracer: lotusTracer, topics: topicsMap}
}
type tracerWrapper struct {
- tr pubsub.EventTracer
- topics map[string]struct{}
+ lp2pTracer pubsub.EventTracer
+ lotusTracer pubsub.EventTracer
+ topics map[string]struct{}
}
func (trw *tracerWrapper) traceMessage(topic string) bool {
@@ -426,33 +482,70 @@ func (trw *tracerWrapper) Trace(evt *pubsub_pb.TraceEvent) {
switch evt.GetType() {
case pubsub_pb.TraceEvent_PUBLISH_MESSAGE:
stats.Record(context.TODO(), metrics.PubsubPublishMessage.M(1))
- if trw.tr != nil && trw.traceMessage(evt.GetPublishMessage().GetTopic()) {
- trw.tr.Trace(evt)
+ if trw.traceMessage(evt.GetPublishMessage().GetTopic()) {
+ if trw.lp2pTracer != nil {
+ trw.lp2pTracer.Trace(evt)
+ }
+
+ if trw.lotusTracer != nil {
+ trw.lotusTracer.Trace(evt)
+ }
}
case pubsub_pb.TraceEvent_DELIVER_MESSAGE:
stats.Record(context.TODO(), metrics.PubsubDeliverMessage.M(1))
- if trw.tr != nil && trw.traceMessage(evt.GetDeliverMessage().GetTopic()) {
- trw.tr.Trace(evt)
+ if trw.traceMessage(evt.GetDeliverMessage().GetTopic()) {
+ if trw.lp2pTracer != nil {
+ trw.lp2pTracer.Trace(evt)
+ }
+
+ if trw.lotusTracer != nil {
+ trw.lotusTracer.Trace(evt)
+ }
}
case pubsub_pb.TraceEvent_REJECT_MESSAGE:
stats.Record(context.TODO(), metrics.PubsubRejectMessage.M(1))
+ if trw.traceMessage(evt.GetRejectMessage().GetTopic()) {
+ if trw.lp2pTracer != nil {
+ trw.lp2pTracer.Trace(evt)
+ }
+
+ if trw.lotusTracer != nil {
+ trw.lotusTracer.Trace(evt)
+ }
+ }
case pubsub_pb.TraceEvent_DUPLICATE_MESSAGE:
stats.Record(context.TODO(), metrics.PubsubDuplicateMessage.M(1))
case pubsub_pb.TraceEvent_JOIN:
- if trw.tr != nil {
- trw.tr.Trace(evt)
+ if trw.lp2pTracer != nil {
+ trw.lp2pTracer.Trace(evt)
+ }
+
+ if trw.lotusTracer != nil {
+ trw.lotusTracer.Trace(evt)
}
case pubsub_pb.TraceEvent_LEAVE:
- if trw.tr != nil {
- trw.tr.Trace(evt)
+ if trw.lp2pTracer != nil {
+ trw.lp2pTracer.Trace(evt)
+ }
+
+ if trw.lotusTracer != nil {
+ trw.lotusTracer.Trace(evt)
}
case pubsub_pb.TraceEvent_GRAFT:
- if trw.tr != nil {
- trw.tr.Trace(evt)
+ if trw.lp2pTracer != nil {
+ trw.lp2pTracer.Trace(evt)
+ }
+
+ if trw.lotusTracer != nil {
+ trw.lotusTracer.Trace(evt)
}
case pubsub_pb.TraceEvent_PRUNE:
- if trw.tr != nil {
- trw.tr.Trace(evt)
+ if trw.lp2pTracer != nil {
+ trw.lp2pTracer.Trace(evt)
+ }
+
+ if trw.lotusTracer != nil {
+ trw.lotusTracer.Trace(evt)
}
case pubsub_pb.TraceEvent_RECV_RPC:
stats.Record(context.TODO(), metrics.PubsubRecvRPC.M(1))
diff --git a/node/modules/mpoolnonceapi.go b/node/modules/mpoolnonceapi.go
index 00e704727..393bee32f 100644
--- a/node/modules/mpoolnonceapi.go
+++ b/node/modules/mpoolnonceapi.go
@@ -9,7 +9,7 @@ import (
"github.com/filecoin-project/go-address"
- "github.com/filecoin-project/lotus/chain/messagesigner"
+ "github.com/filecoin-project/lotus/chain/messagepool"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/impl/full"
)
@@ -104,4 +104,4 @@ func (a *MpoolNonceAPI) GetActor(ctx context.Context, addr address.Address, tsk
return act, nil
}
-var _ messagesigner.MpoolNonceAPI = (*MpoolNonceAPI)(nil)
+var _ messagepool.MpoolNonceAPI = (*MpoolNonceAPI)(nil)
diff --git a/node/modules/rpc.go b/node/modules/rpc.go
new file mode 100644
index 000000000..d76949737
--- /dev/null
+++ b/node/modules/rpc.go
@@ -0,0 +1,55 @@
+package modules
+
+import (
+ "context"
+
+ rpc "github.com/libp2p/go-libp2p-gorpc"
+ "github.com/libp2p/go-libp2p/core/host"
+ "github.com/libp2p/go-libp2p/core/peer"
+ "github.com/libp2p/go-libp2p/core/protocol"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/chain/types"
+ consensus "github.com/filecoin-project/lotus/lib/consensus/raft"
+ "github.com/filecoin-project/lotus/node/impl/full"
+)
+
+type RPCHandler struct {
+ mpoolAPI full.MpoolAPI
+ cons *consensus.Consensus
+}
+
+func NewRPCHandler(mpoolAPI full.MpoolAPI, cons *consensus.Consensus) *RPCHandler {
+ return &RPCHandler{mpoolAPI, cons}
+}
+
+func (h *RPCHandler) MpoolPushMessage(ctx context.Context, msgWhole *api.MpoolMessageWhole, ret *types.SignedMessage) error {
+ signedMsg, err := h.mpoolAPI.MpoolPushMessage(ctx, msgWhole.Msg, msgWhole.Spec)
+ if err != nil {
+ return err
+ }
+ *ret = *signedMsg
+ return nil
+}
+
+func (h *RPCHandler) AddPeer(ctx context.Context, pid peer.ID, ret *struct{}) error {
+ return h.cons.AddPeer(ctx, pid)
+}
+
+// Add other consensus RPC calls here
+
+func NewRPCClient(host host.Host) *rpc.Client {
+ protocolID := protocol.ID("/rpc/lotus-chain/v0")
+ return rpc.NewClient(host, protocolID)
+}
+
+func NewRPCServer(ctx context.Context, host host.Host, rpcHandler *RPCHandler) error {
+
+ authF := func(pid peer.ID, svc, method string) bool {
+ return rpcHandler.cons.IsTrustedPeer(ctx, pid)
+ }
+
+ protocolID := protocol.ID("/rpc/lotus-chain/v0")
+ rpcServer := rpc.NewServer(host, protocolID, rpc.WithAuthorizeFunc(authF))
+ return rpcServer.RegisterName("Consensus", rpcHandler)
+}
diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go
index 2ea733605..dff9c1415 100644
--- a/node/modules/storageminer.go
+++ b/node/modules/storageminer.go
@@ -37,7 +37,6 @@ import (
storageimpl "github.com/filecoin-project/go-fil-markets/storagemarket/impl"
"github.com/filecoin-project/go-fil-markets/storagemarket/impl/storedask"
smnet "github.com/filecoin-project/go-fil-markets/storagemarket/network"
- "github.com/filecoin-project/go-jsonrpc"
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/go-paramfetch"
"github.com/filecoin-project/go-state-types/abi"
@@ -56,7 +55,6 @@ import (
"github.com/filecoin-project/lotus/chain/gen/slashfilter"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/journal"
- "github.com/filecoin-project/lotus/lib/retry"
"github.com/filecoin-project/lotus/markets"
"github.com/filecoin-project/lotus/markets/dagstore"
"github.com/filecoin-project/lotus/markets/idxprov"
@@ -89,12 +87,7 @@ func (a *UuidWrapper) MpoolPushMessage(ctx context.Context, msg *types.Message,
spec = new(api.MessageSendSpec)
}
spec.MsgUuid = uuid.New()
- errorsToRetry := []error{&jsonrpc.RPCConnectionError{}}
- initialBackoff, err := time.ParseDuration("1s")
- if err != nil {
- return nil, err
- }
- return retry.Retry(5, initialBackoff, errorsToRetry, func() (*types.SignedMessage, error) { return a.FullNode.MpoolPushMessage(ctx, msg, spec) })
+ return a.FullNode.MpoolPushMessage(ctx, msg, spec)
}
func MakeUuidWrapper(a v1api.RawFullNodeAPI) v1api.FullNode {
@@ -110,24 +103,31 @@ func minerAddrFromDS(ds dtypes.MetadataDS) (address.Address, error) {
return address.NewFromBytes(maddrb)
}
-func GetParams(spt abi.RegisteredSealProof) error {
- ssize, err := spt.SectorSize()
- if err != nil {
- return err
- }
+func GetParams(prover bool) func(spt abi.RegisteredSealProof) error {
+ return func(spt abi.RegisteredSealProof) error {
+ ssize, err := spt.SectorSize()
+ if err != nil {
+ return err
+ }
+
+ // If built-in assets are disabled, we expect the user to have placed the right
+ // parameters in the right location on the filesystem (/var/tmp/filecoin-proof-parameters).
+ if build.DisableBuiltinAssets {
+ return nil
+ }
+
+ var provingSize uint64
+ if prover {
+ provingSize = uint64(ssize)
+ }
+
+ // TODO: We should fetch the params for the actual proof type, not just based on the size.
+ if err := paramfetch.GetParams(context.TODO(), build.ParametersJSON(), build.SrsJSON(), provingSize); err != nil {
+ return xerrors.Errorf("fetching proof parameters: %w", err)
+ }
- // If built-in assets are disabled, we expect the user to have placed the right
- // parameters in the right location on the filesystem (/var/tmp/filecoin-proof-parameters).
- if build.DisableBuiltinAssets {
return nil
}
-
- // TODO: We should fetch the params for the actual proof type, not just based on the size.
- if err := paramfetch.GetParams(context.TODO(), build.ParametersJSON(), build.SrsJSON(), uint64(ssize)); err != nil {
- return xerrors.Errorf("fetching proof parameters: %w", err)
- }
-
- return nil
}
func MinerAddress(ds dtypes.MetadataDS) (dtypes.MinerAddress, error) {
@@ -233,7 +233,7 @@ func PreflightChecks(mctx helpers.MetricsCtx, lc fx.Lifecycle, api v1api.FullNod
return xerrors.New("key for worker not found in local wallet")
}
- log.Infof("starting up miner %s, worker addr %s", maddr, workerKey)
+ log.Infof("starting up miner %s, worker addr %s", address.Address(maddr), workerKey)
return nil
}})
@@ -787,17 +787,17 @@ func LocalStorage(mctx helpers.MetricsCtx, lc fx.Lifecycle, ls paths.LocalStorag
return paths.NewLocal(ctx, ls, si, urls)
}
-func RemoteStorage(lstor *paths.Local, si paths.SectorIndex, sa sealer.StorageAuth, sc sealer.Config) *paths.Remote {
+func RemoteStorage(lstor *paths.Local, si paths.SectorIndex, sa sealer.StorageAuth, sc config.SealerConfig) *paths.Remote {
return paths.NewRemote(lstor, si, http.Header(sa), sc.ParallelFetchLimit, &paths.DefaultPartialFileHandler{})
}
-func SectorStorage(mctx helpers.MetricsCtx, lc fx.Lifecycle, lstor *paths.Local, stor paths.Store, ls paths.LocalStorage, si paths.SectorIndex, sc sealer.Config, ds dtypes.MetadataDS) (*sealer.Manager, error) {
+func SectorStorage(mctx helpers.MetricsCtx, lc fx.Lifecycle, lstor *paths.Local, stor paths.Store, ls paths.LocalStorage, si paths.SectorIndex, sc config.SealerConfig, pc config.ProvingConfig, ds dtypes.MetadataDS) (*sealer.Manager, error) {
ctx := helpers.LifecycleCtx(mctx, lc)
wsts := statestore.New(namespace.Wrap(ds, WorkerCallsPrefix))
smsts := statestore.New(namespace.Wrap(ds, ManagerWorkPrefix))
- sst, err := sealer.New(ctx, lstor, stor, ls, si, sc, wsts, smsts)
+ sst, err := sealer.New(ctx, lstor, stor, ls, si, sc, pc, wsts, smsts)
if err != nil {
return nil, err
}
@@ -983,17 +983,19 @@ func NewSetSealConfigFunc(r repo.LockedRepo) (dtypes.SetSealingConfigFunc, error
return func(cfg sealiface.Config) (err error) {
err = mutateSealingCfg(r, func(c config.SealingConfiger) {
newCfg := config.SealingConfig{
- MaxWaitDealsSectors: cfg.MaxWaitDealsSectors,
- MaxSealingSectors: cfg.MaxSealingSectors,
- MaxSealingSectorsForDeals: cfg.MaxSealingSectorsForDeals,
- PreferNewSectorsForDeals: cfg.PreferNewSectorsForDeals,
- MaxUpgradingSectors: cfg.MaxUpgradingSectors,
- CommittedCapacitySectorLifetime: config.Duration(cfg.CommittedCapacitySectorLifetime),
- WaitDealsDelay: config.Duration(cfg.WaitDealsDelay),
- MakeNewSectorForDeals: cfg.MakeNewSectorForDeals,
- MakeCCSectorsAvailable: cfg.MakeCCSectorsAvailable,
- AlwaysKeepUnsealedCopy: cfg.AlwaysKeepUnsealedCopy,
- FinalizeEarly: cfg.FinalizeEarly,
+ MaxWaitDealsSectors: cfg.MaxWaitDealsSectors,
+ MaxSealingSectors: cfg.MaxSealingSectors,
+ MaxSealingSectorsForDeals: cfg.MaxSealingSectorsForDeals,
+ PreferNewSectorsForDeals: cfg.PreferNewSectorsForDeals,
+ MaxUpgradingSectors: cfg.MaxUpgradingSectors,
+ CommittedCapacitySectorLifetime: config.Duration(cfg.CommittedCapacitySectorLifetime),
+ WaitDealsDelay: config.Duration(cfg.WaitDealsDelay),
+ MakeNewSectorForDeals: cfg.MakeNewSectorForDeals,
+ MinUpgradeSectorExpiration: cfg.MinUpgradeSectorExpiration,
+ MinTargetUpgradeSectorExpiration: cfg.MinTargetUpgradeSectorExpiration,
+ MakeCCSectorsAvailable: cfg.MakeCCSectorsAvailable,
+ AlwaysKeepUnsealedCopy: cfg.AlwaysKeepUnsealedCopy,
+ FinalizeEarly: cfg.FinalizeEarly,
CollateralFromMinerBalance: cfg.CollateralFromMinerBalance,
AvailableBalanceBuffer: types.FIL(cfg.AvailableBalanceBuffer),
@@ -1024,11 +1026,14 @@ func NewSetSealConfigFunc(r repo.LockedRepo) (dtypes.SetSealingConfigFunc, error
func ToSealingConfig(dealmakingCfg config.DealmakingConfig, sealingCfg config.SealingConfig) sealiface.Config {
return sealiface.Config{
- MaxWaitDealsSectors: sealingCfg.MaxWaitDealsSectors,
- MaxSealingSectors: sealingCfg.MaxSealingSectors,
- MaxSealingSectorsForDeals: sealingCfg.MaxSealingSectorsForDeals,
- PreferNewSectorsForDeals: sealingCfg.PreferNewSectorsForDeals,
- MaxUpgradingSectors: sealingCfg.MaxUpgradingSectors,
+ MaxWaitDealsSectors: sealingCfg.MaxWaitDealsSectors,
+ MaxSealingSectors: sealingCfg.MaxSealingSectors,
+ MaxSealingSectorsForDeals: sealingCfg.MaxSealingSectorsForDeals,
+ PreferNewSectorsForDeals: sealingCfg.PreferNewSectorsForDeals,
+ MinUpgradeSectorExpiration: sealingCfg.MinUpgradeSectorExpiration,
+ MinTargetUpgradeSectorExpiration: sealingCfg.MinTargetUpgradeSectorExpiration,
+ MaxUpgradingSectors: sealingCfg.MaxUpgradingSectors,
+
StartEpochSealingBuffer: abi.ChainEpoch(dealmakingCfg.StartEpochSealingBuffer),
MakeNewSectorForDeals: sealingCfg.MakeNewSectorForDeals,
CommittedCapacitySectorLifetime: time.Duration(sealingCfg.CommittedCapacitySectorLifetime),
diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go
index 5f6cf69f0..92a6a6a54 100644
--- a/node/modules/storageminer_idxprov.go
+++ b/node/modules/storageminer_idxprov.go
@@ -46,7 +46,7 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo
engine.WithHost(marketHost),
engine.WithRetrievalAddrs(marketHost.Addrs()...),
engine.WithEntriesCacheCapacity(cfg.EntriesCacheCapacity),
- engine.WithEntriesChunkSize(cfg.EntriesChunkSize),
+ engine.WithChainedEntries(cfg.EntriesChunkSize),
engine.WithTopicName(topicName),
engine.WithPurgeCacheOnStart(cfg.PurgeCacheOnStart),
}
diff --git a/node/modules/storageminer_idxprov_test.go b/node/modules/storageminer_idxprov_test.go
index 125d5b82c..8d5717b66 100644
--- a/node/modules/storageminer_idxprov_test.go
+++ b/node/modules/storageminer_idxprov_test.go
@@ -78,8 +78,9 @@ func Test_IndexProviderTopic(t *testing.T) {
func() *pubsub.PubSub { return ps },
func() dtypes.MetadataDS { return datastore.NewMapDatastore() },
modules.IndexProvider(config.IndexProviderConfig{
- Enable: true,
- TopicName: test.givenConfiguredTopic,
+ Enable: true,
+ TopicName: test.givenConfiguredTopic,
+ EntriesChunkSize: 16384,
}),
),
fx.Invoke(func(p provider.Interface) {}),
diff --git a/node/modules/tracer/elasticsearch_transport.go b/node/modules/tracer/elasticsearch_transport.go
new file mode 100644
index 000000000..1f6f9a157
--- /dev/null
+++ b/node/modules/tracer/elasticsearch_transport.go
@@ -0,0 +1,97 @@
+package tracer
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/url"
+ "strings"
+
+ "github.com/elastic/go-elasticsearch/v7"
+ "github.com/elastic/go-elasticsearch/v7/esapi"
+)
+
+const (
+ ElasticSearchDefaultIndex = "lotus-pubsub"
+)
+
+func NewElasticSearchTransport(connectionString string, elasticsearchIndex string) (TracerTransport, error) {
+ conUrl, err := url.Parse(connectionString)
+
+ if err != nil {
+ return nil, err
+ }
+
+ username := conUrl.User.Username()
+ password, _ := conUrl.User.Password()
+ cfg := elasticsearch.Config{
+ Addresses: []string{
+ conUrl.Scheme + "://" + conUrl.Host,
+ },
+ Username: username,
+ Password: password,
+ }
+
+ es, err := elasticsearch.NewClient(cfg)
+
+ if err != nil {
+ return nil, err
+ }
+
+ var esIndex string
+ if elasticsearchIndex != "" {
+ esIndex = elasticsearchIndex
+ } else {
+ esIndex = ElasticSearchDefaultIndex
+ }
+
+ return &elasticSearchTransport{
+ cl: es,
+ esIndex: esIndex,
+ }, nil
+}
+
+type elasticSearchTransport struct {
+ cl *elasticsearch.Client
+ esIndex string
+}
+
+func (est *elasticSearchTransport) Transport(evt TracerTransportEvent) error {
+ var e interface{}
+
+ if evt.lotusTraceEvent != nil {
+ e = *evt.lotusTraceEvent
+ } else if evt.pubsubTraceEvent != nil {
+ e = *evt.pubsubTraceEvent
+ } else {
+ return nil
+ }
+
+ jsonEvt, err := json.Marshal(e)
+ if err != nil {
+ return fmt.Errorf("error while marshaling event: %s", err)
+ }
+
+ req := esapi.IndexRequest{
+ Index: est.esIndex,
+ Body: strings.NewReader(string(jsonEvt)),
+ Refresh: "true",
+ }
+
+ // Perform the request with the client.
+ res, err := req.Do(context.Background(), est.cl)
+ if err != nil {
+ return err
+ }
+
+ err = res.Body.Close()
+ if err != nil {
+ return err
+ }
+
+ if res.IsError() {
+ return fmt.Errorf("[%s] Error indexing document ID=%s", res.Status(), req.DocumentID)
+ }
+
+ return nil
+}
diff --git a/node/modules/tracer/json_transport.go b/node/modules/tracer/json_transport.go
new file mode 100644
index 000000000..ca8535f4b
--- /dev/null
+++ b/node/modules/tracer/json_transport.go
@@ -0,0 +1,41 @@
+package tracer
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+)
+
+type jsonTracerTransport struct {
+ out *os.File
+}
+
+func NewJsonTracerTransport(file string) (TracerTransport, error) {
+ out, err := os.OpenFile(file, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0660)
+ if err != nil {
+ return nil, err
+ }
+
+ return &jsonTracerTransport{
+ out: out,
+ }, nil
+}
+
+func (jtt *jsonTracerTransport) Transport(evt TracerTransportEvent) error {
+ var e interface{}
+ if evt.lotusTraceEvent != nil {
+ e = *evt.lotusTraceEvent
+ } else if evt.pubsubTraceEvent != nil {
+ e = *evt.pubsubTraceEvent
+ } else {
+ return nil
+ }
+
+ jsonEvt, err := json.Marshal(e)
+ if err != nil {
+ return fmt.Errorf("error while marshaling event: %s", err)
+ }
+
+ _, err = jtt.out.WriteString(string(jsonEvt) + "\n")
+ return err
+}
diff --git a/node/modules/tracer/tracer.go b/node/modules/tracer/tracer.go
new file mode 100644
index 000000000..0d0a156d9
--- /dev/null
+++ b/node/modules/tracer/tracer.go
@@ -0,0 +1,120 @@
+package tracer
+
+import (
+ "time"
+
+ logging "github.com/ipfs/go-log/v2"
+ pubsub "github.com/libp2p/go-libp2p-pubsub"
+ pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb"
+ "github.com/libp2p/go-libp2p/core/peer"
+)
+
+var log = logging.Logger("lotus-tracer")
+
+func NewLotusTracer(tt []TracerTransport, pid peer.ID, sourceAuth string) LotusTracer {
+ return &lotusTracer{
+ tt: tt,
+ pid: pid,
+ sa: sourceAuth,
+ }
+}
+
+type lotusTracer struct {
+ tt []TracerTransport
+ pid peer.ID
+ sa string
+}
+
+const (
+ TraceEventPeerScores pubsub_pb.TraceEvent_Type = 100
+)
+
+type LotusTraceEvent struct {
+ Type pubsub_pb.TraceEvent_Type `json:"type,omitempty"`
+ PeerID string `json:"peerID,omitempty"`
+ Timestamp *int64 `json:"timestamp,omitempty"`
+ PeerScore TraceEventPeerScore `json:"peerScore,omitempty"`
+ SourceAuth string `json:"sourceAuth,omitempty"`
+}
+
+type TopicScore struct {
+ Topic string `json:"topic"`
+ TimeInMesh time.Duration `json:"timeInMesh"`
+ FirstMessageDeliveries float64 `json:"firstMessageDeliveries"`
+ MeshMessageDeliveries float64 `json:"meshMessageDeliveries"`
+ InvalidMessageDeliveries float64 `json:"invalidMessageDeliveries"`
+}
+
+type TraceEventPeerScore struct {
+ PeerID string `json:"peerID"`
+ Score float64 `json:"score"`
+ AppSpecificScore float64 `json:"appSpecificScore"`
+ IPColocationFactor float64 `json:"ipColocationFactor"`
+ BehaviourPenalty float64 `json:"behaviourPenalty"`
+ Topics []TopicScore `json:"topics"`
+}
+
+type LotusTracer interface {
+ Trace(evt *pubsub_pb.TraceEvent)
+ TraceLotusEvent(evt *LotusTraceEvent)
+
+ PeerScores(scores map[peer.ID]*pubsub.PeerScoreSnapshot)
+}
+
+func (lt *lotusTracer) PeerScores(scores map[peer.ID]*pubsub.PeerScoreSnapshot) {
+ now := time.Now().UnixNano()
+ for pid, score := range scores {
+ var topics []TopicScore
+ for topic, snapshot := range score.Topics {
+ topics = append(topics, TopicScore{
+ Topic: topic,
+ TimeInMesh: snapshot.TimeInMesh,
+ FirstMessageDeliveries: snapshot.FirstMessageDeliveries,
+ MeshMessageDeliveries: snapshot.MeshMessageDeliveries,
+ InvalidMessageDeliveries: snapshot.InvalidMessageDeliveries,
+ })
+ }
+
+ evt := &LotusTraceEvent{
+ Type: *TraceEventPeerScores.Enum(),
+ PeerID: lt.pid.Pretty(),
+ Timestamp: &now,
+ SourceAuth: lt.sa,
+ PeerScore: TraceEventPeerScore{
+ PeerID: pid.Pretty(),
+ Score: score.Score,
+ AppSpecificScore: score.AppSpecificScore,
+ IPColocationFactor: score.IPColocationFactor,
+ BehaviourPenalty: score.BehaviourPenalty,
+ Topics: topics,
+ },
+ }
+
+ lt.TraceLotusEvent(evt)
+ }
+}
+
+func (lt *lotusTracer) TraceLotusEvent(evt *LotusTraceEvent) {
+ for _, t := range lt.tt {
+ err := t.Transport(TracerTransportEvent{
+ lotusTraceEvent: evt,
+ pubsubTraceEvent: nil,
+ })
+ if err != nil {
+ log.Errorf("error while transporting peer scores: %s", err)
+ }
+ }
+
+}
+
+func (lt *lotusTracer) Trace(evt *pubsub_pb.TraceEvent) {
+ for _, t := range lt.tt {
+ err := t.Transport(TracerTransportEvent{
+ lotusTraceEvent: nil,
+ pubsubTraceEvent: evt,
+ })
+ if err != nil {
+ log.Errorf("error while transporting trace event: %s", err)
+ }
+ }
+}
diff --git a/node/modules/tracer/tracer_test.go b/node/modules/tracer/tracer_test.go
new file mode 100644
index 000000000..7ade67861
--- /dev/null
+++ b/node/modules/tracer/tracer_test.go
@@ -0,0 +1,109 @@
+package tracer
+
+import (
+ "testing"
+ "time"
+
+ pubsub "github.com/libp2p/go-libp2p-pubsub"
+ pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb"
+ "github.com/libp2p/go-libp2p/core/peer"
+ "github.com/stretchr/testify/require"
+)
+
+type testTracerTransport struct {
+ t *testing.T
+ executeTest func(t *testing.T, evt TracerTransportEvent)
+}
+
+const peerIDA peer.ID = "12D3KooWAbSVMgRejb6ECg6fRTkCPGCfu8396msZVryu8ivcz44G"
+
+func NewTestTraceTransport(t *testing.T, executeTest func(t *testing.T, evt TracerTransportEvent)) TracerTransport {
+ return &testTracerTransport{
+ t: t,
+ executeTest: executeTest,
+ }
+}
+
+func (ttt *testTracerTransport) Transport(evt TracerTransportEvent) error {
+ ttt.executeTest(ttt.t, evt)
+ return nil
+}
+
+func TestTracer_PeerScores(t *testing.T) {
+
+ testTransport := NewTestTraceTransport(t, func(t *testing.T, evt TracerTransportEvent) {
+ require.Equal(t, peerIDA.Pretty(), evt.lotusTraceEvent.PeerID)
+ require.Equal(t, "source-auth-token-test", evt.lotusTraceEvent.SourceAuth)
+ require.Equal(t, float64(32), evt.lotusTraceEvent.PeerScore.Score)
+
+ n := time.Now().UnixNano()
+ require.LessOrEqual(t, *evt.lotusTraceEvent.Timestamp, n)
+
+ require.Equal(t, peerIDA.Pretty(), evt.lotusTraceEvent.PeerScore.PeerID)
+ require.Equal(t, 1, len(evt.lotusTraceEvent.PeerScore.Topics))
+
+ topic := evt.lotusTraceEvent.PeerScore.Topics[0]
+ require.Equal(t, "topicA", topic.Topic)
+ require.Equal(t, float64(100), topic.FirstMessageDeliveries)
+ })
+
+ lt := NewLotusTracer(
+ []TracerTransport{testTransport},
+ peerIDA,
+ "source-auth-token-test",
+ )
+
+ topics := make(map[string]*pubsub.TopicScoreSnapshot)
+ topics["topicA"] = &pubsub.TopicScoreSnapshot{
+ FirstMessageDeliveries: float64(100),
+ }
+
+ m := make(map[peer.ID]*pubsub.PeerScoreSnapshot)
+ m[peerIDA] = &pubsub.PeerScoreSnapshot{
+ Score: float64(32),
+ Topics: topics,
+ }
+
+ lt.PeerScores(m)
+}
+
+func TestTracer_PubSubTrace(t *testing.T) {
+ n := time.Now().Unix()
+
+ testTransport := NewTestTraceTransport(t, func(t *testing.T, evt TracerTransportEvent) {
+ require.Equal(t, []byte(peerIDA), evt.pubsubTraceEvent.PeerID)
+ require.Equal(t, &n, evt.pubsubTraceEvent.Timestamp)
+ })
+
+ lt := NewLotusTracer(
+ []TracerTransport{testTransport},
+ "pid",
+ "source-auth",
+ )
+
+ lt.Trace(&pubsub_pb.TraceEvent{
+ PeerID: []byte(peerIDA),
+ Timestamp: &n,
+ })
+
+}
+
+func TestTracer_MultipleTransports(t *testing.T) {
+ testTransportA := NewTestTraceTransport(t, func(t *testing.T, evt TracerTransportEvent) {
+ require.Equal(t, []byte(peerIDA), evt.pubsubTraceEvent.PeerID)
+ })
+
+ testTransportB := NewTestTraceTransport(t, func(t *testing.T, evt TracerTransportEvent) {
+ require.Equal(t, []byte(peerIDA), evt.pubsubTraceEvent.PeerID)
+ })
+
+ executeTest := NewLotusTracer(
+ []TracerTransport{testTransportA, testTransportB},
+ "pid",
+ "source-auth",
+ )
+
+ executeTest.Trace(&pubsub_pb.TraceEvent{
+ PeerID: []byte(peerIDA),
+ })
+}
diff --git a/node/modules/tracer/transport.go b/node/modules/tracer/transport.go
new file mode 100644
index 000000000..56d926afc
--- /dev/null
+++ b/node/modules/tracer/transport.go
@@ -0,0 +1,12 @@
+package tracer
+
+import pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb"
+
+type TracerTransport interface {
+ Transport(evt TracerTransportEvent) error
+}
+
+type TracerTransportEvent struct {
+ lotusTraceEvent *LotusTraceEvent
+ pubsubTraceEvent *pubsub_pb.TraceEvent
+}
diff --git a/node/options.go b/node/options.go
index 0793a150f..26c2c247f 100644
--- a/node/options.go
+++ b/node/options.go
@@ -93,6 +93,12 @@ func From(typ interface{}) interface{} {
}).Interface()
}
+func FromVal[T any](v T) func() T {
+ return func() T {
+ return v
+ }
+}
+
// from go-ipfs
// as casts input constructor to a given interface (if a value is given, it
// wraps it into a constructor).
diff --git a/node/repo/fsrepo.go b/node/repo/fsrepo.go
index 9327575dd..68550e389 100644
--- a/node/repo/fsrepo.go
+++ b/node/repo/fsrepo.go
@@ -25,8 +25,8 @@ import (
badgerbs "github.com/filecoin-project/lotus/blockstore/badger"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/config"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
const (
@@ -572,26 +572,26 @@ func (fsr *fsLockedRepo) SetConfig(c func(interface{})) error {
return nil
}
-func (fsr *fsLockedRepo) GetStorage() (paths.StorageConfig, error) {
+func (fsr *fsLockedRepo) GetStorage() (storiface.StorageConfig, error) {
fsr.storageLk.Lock()
defer fsr.storageLk.Unlock()
return fsr.getStorage(nil)
}
-func (fsr *fsLockedRepo) getStorage(def *paths.StorageConfig) (paths.StorageConfig, error) {
+func (fsr *fsLockedRepo) getStorage(def *storiface.StorageConfig) (storiface.StorageConfig, error) {
c, err := config.StorageFromFile(fsr.join(fsStorageConfig), def)
if err != nil {
- return paths.StorageConfig{}, err
+ return storiface.StorageConfig{}, err
}
return *c, nil
}
-func (fsr *fsLockedRepo) SetStorage(c func(*paths.StorageConfig)) error {
+func (fsr *fsLockedRepo) SetStorage(c func(*storiface.StorageConfig)) error {
fsr.storageLk.Lock()
defer fsr.storageLk.Unlock()
- sc, err := fsr.getStorage(&paths.StorageConfig{})
+ sc, err := fsr.getStorage(&storiface.StorageConfig{})
if err != nil {
return xerrors.Errorf("get storage: %w", err)
}
diff --git a/node/repo/interface.go b/node/repo/interface.go
index 4f0294713..dd0839559 100644
--- a/node/repo/interface.go
+++ b/node/repo/interface.go
@@ -9,8 +9,8 @@ import (
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/chain/types"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
// BlockstoreDomain represents the domain of a blockstore.
@@ -73,8 +73,8 @@ type LockedRepo interface {
Config() (interface{}, error)
SetConfig(func(interface{})) error
- GetStorage() (paths.StorageConfig, error)
- SetStorage(func(*paths.StorageConfig)) error
+ GetStorage() (storiface.StorageConfig, error)
+ SetStorage(func(*storiface.StorageConfig)) error
Stat(path string) (fsutil.FsStat, error)
DiskUsage(path string) (int64, error)
diff --git a/node/repo/memrepo.go b/node/repo/memrepo.go
index 53fd1eeee..61d960872 100644
--- a/node/repo/memrepo.go
+++ b/node/repo/memrepo.go
@@ -18,7 +18,6 @@ import (
"github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/config"
- "github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -37,7 +36,7 @@ type MemRepo struct {
keystore map[string]types.KeyInfo
blockstore blockstore.Blockstore
- sc *paths.StorageConfig
+ sc *storiface.StorageConfig
tempDir string
// holds the current config value
@@ -59,13 +58,13 @@ func (lmem *lockedMemRepo) RepoType() RepoType {
return lmem.t
}
-func (lmem *lockedMemRepo) GetStorage() (paths.StorageConfig, error) {
+func (lmem *lockedMemRepo) GetStorage() (storiface.StorageConfig, error) {
if err := lmem.checkToken(); err != nil {
- return paths.StorageConfig{}, err
+ return storiface.StorageConfig{}, err
}
if lmem.mem.sc == nil {
- lmem.mem.sc = &paths.StorageConfig{StoragePaths: []paths.LocalPath{
+ lmem.mem.sc = &storiface.StorageConfig{StoragePaths: []storiface.LocalPath{
{Path: lmem.Path()},
}}
}
@@ -73,7 +72,7 @@ func (lmem *lockedMemRepo) GetStorage() (paths.StorageConfig, error) {
return *lmem.mem.sc, nil
}
-func (lmem *lockedMemRepo) SetStorage(c func(*paths.StorageConfig)) error {
+func (lmem *lockedMemRepo) SetStorage(c func(*storiface.StorageConfig)) error {
if err := lmem.checkToken(); err != nil {
return err
}
@@ -126,14 +125,14 @@ func (lmem *lockedMemRepo) Path() string {
}
func (lmem *lockedMemRepo) initSectorStore(t string) {
- if err := config.WriteStorageFile(filepath.Join(t, fsStorageConfig), paths.StorageConfig{
- StoragePaths: []paths.LocalPath{
+ if err := config.WriteStorageFile(filepath.Join(t, fsStorageConfig), storiface.StorageConfig{
+ StoragePaths: []storiface.LocalPath{
{Path: t},
}}); err != nil {
panic(err)
}
- b, err := json.MarshalIndent(&paths.LocalStorageMeta{
+ b, err := json.MarshalIndent(&storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 10,
CanSeal: true,
diff --git a/node/rpc.go b/node/rpc.go
index bee540500..34f680973 100644
--- a/node/rpc.go
+++ b/node/rpc.go
@@ -3,13 +3,17 @@ package node
import (
"context"
"encoding/json"
+ "fmt"
"net"
"net/http"
_ "net/http/pprof"
"runtime"
"strconv"
+ "time"
+ "github.com/google/uuid"
"github.com/gorilla/mux"
+ "github.com/gorilla/websocket"
"github.com/ipfs/go-cid"
logging "github.com/ipfs/go-log/v2"
"github.com/multiformats/go-multiaddr"
@@ -23,6 +27,7 @@ import (
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/api/v0api"
"github.com/filecoin-project/lotus/api/v1api"
+ bstore "github.com/filecoin-project/lotus/blockstore"
"github.com/filecoin-project/lotus/lib/rpcenc"
"github.com/filecoin-project/lotus/metrics"
"github.com/filecoin-project/lotus/metrics/proxy"
@@ -47,7 +52,8 @@ func ServeRPC(h http.Handler, id string, addr multiaddr.Multiaddr) (StopFunc, er
// Instantiate the server and start listening.
srv := &http.Server{
- Handler: h,
+ Handler: h,
+ ReadHeaderTimeout: 30 * time.Second,
BaseContext: func(listener net.Listener) context.Context {
ctx, _ := tag.New(context.Background(), tag.Upsert(metrics.APIInterface, id))
return ctx
@@ -69,7 +75,7 @@ func FullNodeHandler(a v1api.FullNode, permissioned bool, opts ...jsonrpc.Server
m := mux.NewRouter()
serveRpc := func(path string, hnd interface{}) {
- rpcServer := jsonrpc.NewServer(opts...)
+ rpcServer := jsonrpc.NewServer(append(opts, jsonrpc.WithServerErrors(api.RPCErrors))...)
rpcServer.Register("Filecoin", hnd)
rpcServer.AliasMethod("rpc.discover", "Filecoin.Discover")
@@ -92,6 +98,7 @@ func FullNodeHandler(a v1api.FullNode, permissioned bool, opts ...jsonrpc.Server
// Import handler
handleImportFunc := handleImport(a.(*impl.FullNodeAPI))
handleExportFunc := handleExport(a.(*impl.FullNodeAPI))
+ handleRemoteStoreFunc := handleRemoteStore(a.(*impl.FullNodeAPI))
if permissioned {
importAH := &auth.Handler{
Verify: a.AuthVerify,
@@ -104,9 +111,16 @@ func FullNodeHandler(a v1api.FullNode, permissioned bool, opts ...jsonrpc.Server
Next: handleExportFunc,
}
m.Handle("/rest/v0/export", exportAH)
+
+ storeAH := &auth.Handler{
+ Verify: a.AuthVerify,
+ Next: handleRemoteStoreFunc,
+ }
+ m.Handle("/rest/v0/store/{uuid}", storeAH)
} else {
m.HandleFunc("/rest/v0/import", handleImportFunc)
m.HandleFunc("/rest/v0/export", handleExportFunc)
+ m.HandleFunc("/rest/v0/store/{uuid}", handleRemoteStoreFunc)
}
// debugging
@@ -130,7 +144,7 @@ func MinerHandler(a api.StorageMiner, permissioned bool) (http.Handler, error) {
}
readerHandler, readerServerOpt := rpcenc.ReaderParamDecoder()
- rpcServer := jsonrpc.NewServer(readerServerOpt)
+ rpcServer := jsonrpc.NewServer(jsonrpc.WithServerErrors(api.RPCErrors), readerServerOpt)
rpcServer.Register("Filecoin", mapi)
rpcServer.AliasMethod("rpc.discover", "Filecoin.Discover")
@@ -256,3 +270,34 @@ func handleFractionOpt(name string, setter func(int)) http.HandlerFunc {
setter(fr)
}
}
+
+var upgrader = websocket.Upgrader{
+ CheckOrigin: func(r *http.Request) bool {
+ return true
+ },
+}
+
+func handleRemoteStore(a *impl.FullNodeAPI) func(w http.ResponseWriter, r *http.Request) {
+ return func(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ id, err := uuid.Parse(vars["uuid"])
+ if err != nil {
+ http.Error(w, fmt.Sprintf("parse uuid: %s", err), http.StatusBadRequest)
+ return
+ }
+
+ c, err := upgrader.Upgrade(w, r, nil)
+ if err != nil {
+ log.Error(err)
+ w.WriteHeader(500)
+ return
+ }
+
+ nstore := bstore.NewNetworkStoreWS(c)
+ if err := a.ApiBlockstoreAccessor.RegisterApiStore(id, nstore); err != nil {
+ log.Errorw("registering api bstore", "error", err)
+ _ = c.Close()
+ return
+ }
+ }
+}
diff --git a/paychmgr/mock_test.go b/paychmgr/mock_test.go
index d1325ad31..739bae25a 100644
--- a/paychmgr/mock_test.go
+++ b/paychmgr/mock_test.go
@@ -250,5 +250,5 @@ func (pchapi *mockPaychAPI) addSigningKey(key []byte) {
}
func (pchapi *mockPaychAPI) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) {
- return build.NewestNetworkVersion, nil
+ return build.TestNetworkVersion, nil
}
diff --git a/paychmgr/paych.go b/paychmgr/paych.go
index 45703a6c8..c683aaadd 100644
--- a/paychmgr/paych.go
+++ b/paychmgr/paych.go
@@ -9,11 +9,11 @@ import (
"github.com/filecoin-project/go-address"
cborutil "github.com/filecoin-project/go-cbor-util"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin/v8/paych"
"github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/chain/actors"
lpaych "github.com/filecoin-project/lotus/chain/actors/builtin/paych"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/lib/sigs"
@@ -89,7 +89,7 @@ func (ca *channelAccessor) messageBuilder(ctx context.Context, from address.Addr
return nil, err
}
- av, err := actors.VersionForNetwork(nwVersion)
+ av, err := actorstypes.VersionForNetwork(nwVersion)
if err != nil {
return nil, err
}
diff --git a/paychmgr/simple.go b/paychmgr/simple.go
index 6b2aee2aa..6d6b78a71 100644
--- a/paychmgr/simple.go
+++ b/paychmgr/simple.go
@@ -537,7 +537,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(ctx context.Context, channelID str
}
// If channel creation failed
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
ca.lk.Lock()
defer ca.lk.Unlock()
@@ -651,7 +651,7 @@ func (ca *channelAccessor) waitAddFundsMsg(ctx context.Context, channelID string
return err
}
- if mwait.Receipt.ExitCode != 0 {
+ if mwait.Receipt.ExitCode.IsError() {
err := xerrors.Errorf("voucher channel creation failed: adding funds (exit code %d)", mwait.Receipt.ExitCode)
log.Error(err)
diff --git a/scripts/build-appimage-bundle.sh b/scripts/build-appimage-bundle.sh
index d99b459b9..d4ce6de77 100755
--- a/scripts/build-appimage-bundle.sh
+++ b/scripts/build-appimage-bundle.sh
@@ -20,7 +20,7 @@ PID="$!"
trap "kill -9 ${PID}" EXIT
sleep 30
-cp "../appimage/Lotus-${CIRCLE_TAG}-x86_64.AppImage" .
+cp "/tmp/workspace/appimage/Lotus-${CIRCLE_TAG}-x86_64.AppImage" .
sha512sum "Lotus-${CIRCLE_TAG}-x86_64.AppImage" > "Lotus-${CIRCLE_TAG}-x86_64.AppImage.sha512"
ipfs add -q "Lotus-${CIRCLE_TAG}-x86_64.AppImage" > "Lotus-${CIRCLE_TAG}-x86_64.AppImage.cid"
popd
diff --git a/scripts/generate-lotus-cli.py b/scripts/generate-lotus-cli.py
index 7999603b2..b0d3fd19d 100644
--- a/scripts/generate-lotus-cli.py
+++ b/scripts/generate-lotus-cli.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# Generate lotus command lines documents as text and markdown in folder "lotus/documentation/en".
-# Python 2.7
+# Python 3
import os
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index 3f83ad16d..8c7323a2b 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -13,7 +13,7 @@ description: |
https://fil.org
- https://docs.filecoin.io
+ https://lotus.filecoin.io
https://github.com/filecoin-project/lotus
diff --git a/storage/paths/fetch.go b/storage/paths/fetch.go
new file mode 100644
index 000000000..2d87380bd
--- /dev/null
+++ b/storage/paths/fetch.go
@@ -0,0 +1,105 @@
+package paths
+
+import (
+ "context"
+ "io"
+ "mime"
+ "net/http"
+ "os"
+ "time"
+
+ "github.com/hashicorp/go-multierror"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/lotus/storage/sealer/tarutil"
+)
+
+func fetch(ctx context.Context, url, outname string, header http.Header) (rerr error) {
+ log.Infof("Fetch %s -> %s", url, outname)
+
+ req, err := http.NewRequest("GET", url, nil)
+ if err != nil {
+ return xerrors.Errorf("request: %w", err)
+ }
+ req.Header = header
+ req = req.WithContext(ctx)
+
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ return xerrors.Errorf("do request: %w", err)
+ }
+ defer resp.Body.Close() // nolint
+
+ if resp.StatusCode != 200 {
+ return xerrors.Errorf("non-200 code: %d", resp.StatusCode)
+ }
+
+ start := time.Now()
+ var bytes int64
+ defer func() {
+ took := time.Now().Sub(start)
+ mibps := float64(bytes) / 1024 / 1024 * float64(time.Second) / float64(took)
+ log.Infow("Fetch done", "url", url, "out", outname, "took", took.Round(time.Millisecond), "bytes", bytes, "MiB/s", mibps, "err", rerr)
+ }()
+
+ mediatype, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type"))
+ if err != nil {
+ return xerrors.Errorf("parse media type: %w", err)
+ }
+
+ if err := os.RemoveAll(outname); err != nil {
+ return xerrors.Errorf("removing dest: %w", err)
+ }
+
+ switch mediatype {
+ case "application/x-tar":
+ bytes, err = tarutil.ExtractTar(resp.Body, outname, make([]byte, CopyBuf))
+ return err
+ case "application/octet-stream":
+ f, err := os.Create(outname)
+ if err != nil {
+ return err
+ }
+ bytes, err = io.CopyBuffer(f, resp.Body, make([]byte, CopyBuf))
+ if err != nil {
+ f.Close() // nolint
+ return err
+ }
+ return f.Close()
+ default:
+ return xerrors.Errorf("unknown content type: '%s'", mediatype)
+ }
+}
+
+// FetchWithTemp fetches data into a temp 'fetching' directory, then moves the file to destination
+// The set of URLs must refer to the same object, if one fails, another one will be tried.
+func FetchWithTemp(ctx context.Context, urls []string, dest string, header http.Header) (string, error) {
+ var merr error
+ for _, url := range urls {
+ tempDest, err := tempFetchDest(dest, true)
+ if err != nil {
+ return "", err
+ }
+
+ if err := os.RemoveAll(dest); err != nil {
+ return "", xerrors.Errorf("removing dest: %w", err)
+ }
+
+ err = fetch(ctx, url, tempDest, header)
+ if err != nil {
+ merr = multierror.Append(merr, xerrors.Errorf("fetch error %s -> %s: %w", url, tempDest, err))
+ continue
+ }
+
+ if err := move(tempDest, dest); err != nil {
+ return "", xerrors.Errorf("fetch move error %s -> %s: %w", tempDest, dest, err)
+ }
+
+ if merr != nil {
+ log.Warnw("acquireFromRemote encountered errors when fetching sector from remote", "errors", merr)
+ }
+ return url, nil
+ }
+
+ return "", xerrors.Errorf("failed to fetch sector file (tried %v): %w", urls, merr)
+}
diff --git a/storage/paths/http_handler.go b/storage/paths/http_handler.go
index c8f465f25..fbf1c85b0 100644
--- a/storage/paths/http_handler.go
+++ b/storage/paths/http_handler.go
@@ -95,7 +95,7 @@ func (handler *FetchHandler) remoteGetSector(w http.ResponseWriter, r *http.Requ
return
}
- ft, err := ftFromString(vars["type"])
+ ft, err := FileTypeFromString(vars["type"])
if err != nil {
log.Errorf("%+v", err)
w.WriteHeader(500)
@@ -167,7 +167,7 @@ func (handler *FetchHandler) remoteDeleteSector(w http.ResponseWriter, r *http.R
return
}
- ft, err := ftFromString(vars["type"])
+ ft, err := FileTypeFromString(vars["type"])
if err != nil {
log.Errorf("%+v", err)
w.WriteHeader(500)
@@ -195,9 +195,9 @@ func (handler *FetchHandler) remoteGetAllocated(w http.ResponseWriter, r *http.R
return
}
- ft, err := ftFromString(vars["type"])
+ ft, err := FileTypeFromString(vars["type"])
if err != nil {
- log.Errorf("ftFromString: %+v", err)
+ log.Errorf("FileTypeFromString: %+v", err)
w.WriteHeader(500)
return
}
@@ -311,7 +311,7 @@ func (handler *FetchHandler) generateSingleVanillaProof(w http.ResponseWriter, r
http.ServeContent(w, r, "", time.Time{}, bytes.NewReader(vanilla))
}
-func ftFromString(t string) (storiface.SectorFileType, error) {
+func FileTypeFromString(t string) (storiface.SectorFileType, error) {
switch t {
case storiface.FTUnsealed.String():
return storiface.FTUnsealed, nil
diff --git a/storage/paths/index.go b/storage/paths/index.go
index ba387a3f7..ce11eec9c 100644
--- a/storage/paths/index.go
+++ b/storage/paths/index.go
@@ -324,7 +324,11 @@ func (i *Index) StorageReportHealth(ctx context.Context, id storiface.ID, report
ent.lastHeartbeat = time.Now()
if report.Stat.Capacity > 0 {
- ctx, _ = tag.New(ctx, tag.Upsert(metrics.StorageID, string(id)))
+ ctx, _ = tag.New(ctx,
+ tag.Upsert(metrics.StorageID, string(id)),
+ tag.Upsert(metrics.PathStorage, fmt.Sprint(ent.info.CanStore)),
+ tag.Upsert(metrics.PathSeal, fmt.Sprint(ent.info.CanSeal)),
+ )
stats.Record(ctx, metrics.StorageFSAvailable.M(float64(report.Stat.FSAvailable)/float64(report.Stat.Capacity)))
stats.Record(ctx, metrics.StorageAvailable.M(float64(report.Stat.Available)/float64(report.Stat.Capacity)))
diff --git a/storage/paths/local.go b/storage/paths/local.go
index 552b1738d..2182f24ef 100644
--- a/storage/paths/local.go
+++ b/storage/paths/local.go
@@ -17,71 +17,14 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/proof"
+ "github.com/filecoin-project/lotus/lib/result"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
-// LocalStorageMeta [path]/sectorstore.json
-type LocalStorageMeta struct {
- ID storiface.ID
-
- // A high weight means data is more likely to be stored in this path
- Weight uint64 // 0 = readonly
-
- // Intermediate data for the sealing process will be stored here
- CanSeal bool
-
- // Finalized sectors that will be proved over time will be stored here
- CanStore bool
-
- // MaxStorage specifies the maximum number of bytes to use for sector storage
- // (0 = unlimited)
- MaxStorage uint64
-
- // List of storage groups this path belongs to
- Groups []string
-
- // List of storage groups to which data from this path can be moved. If none
- // are specified, allow to all
- AllowTo []string
-
- // AllowTypes lists sector file types which are allowed to be put into this
- // path. If empty, all file types are allowed.
- //
- // Valid values:
- // - "unsealed"
- // - "sealed"
- // - "cache"
- // - "update"
- // - "update-cache"
- // Any other value will generate a warning and be ignored.
- AllowTypes []string
-
- // DenyTypes lists sector file types which aren't allowed to be put into this
- // path.
- //
- // Valid values:
- // - "unsealed"
- // - "sealed"
- // - "cache"
- // - "update"
- // - "update-cache"
- // Any other value will generate a warning and be ignored.
- DenyTypes []string
-}
-
-// StorageConfig .lotusstorage/storage.json
-type StorageConfig struct {
- StoragePaths []LocalPath
-}
-
-type LocalPath struct {
- Path string
-}
-
type LocalStorage interface {
- GetStorage() (StorageConfig, error)
- SetStorage(func(*StorageConfig)) error
+ GetStorage() (storiface.StorageConfig, error)
+ SetStorage(func(*storiface.StorageConfig)) error
Stat(path string) (fsutil.FsStat, error)
@@ -213,7 +156,7 @@ func (st *Local) OpenPath(ctx context.Context, p string) error {
return xerrors.Errorf("reading storage metadata for %s: %w", p, err)
}
- var meta LocalStorageMeta
+ var meta storiface.LocalStorageMeta
if err := json.Unmarshal(mb, &meta); err != nil {
return xerrors.Errorf("unmarshalling storage metadata for %s: %w", p, err)
}
@@ -309,7 +252,7 @@ func (st *Local) Redeclare(ctx context.Context, filterId *storiface.ID, dropMiss
return xerrors.Errorf("reading storage metadata for %s: %w", p.local, err)
}
- var meta LocalStorageMeta
+ var meta storiface.LocalStorageMeta
if err := json.Unmarshal(mb, &meta); err != nil {
return xerrors.Errorf("unmarshalling storage metadata for %s: %w", p.local, err)
}
@@ -370,7 +313,7 @@ func (st *Local) declareSectors(ctx context.Context, p string, id storiface.ID,
}
for _, t := range storiface.PathTypes {
- ents, err := ioutil.ReadDir(filepath.Join(p, t.String()))
+ ents, err := os.ReadDir(filepath.Join(p, t.String()))
if err != nil {
if os.IsNotExist(err) {
if err := os.MkdirAll(filepath.Join(p, t.String()), 0755); err != nil { // nolint
@@ -816,20 +759,22 @@ func (st *Local) GenerateSingleVanillaProof(ctx context.Context, minerID abi.Act
ProofType: si.SealProof,
}
- var cache string
- var sealed string
+ var cache, sealed, cacheID, sealedID string
+
if si.Update {
- src, _, err := st.AcquireSector(ctx, sr, storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove)
+ src, si, err := st.AcquireSector(ctx, sr, storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove)
if err != nil {
return nil, xerrors.Errorf("acquire sector: %w", err)
}
cache, sealed = src.UpdateCache, src.Update
+ cacheID, sealedID = si.UpdateCache, si.Update
} else {
- src, _, err := st.AcquireSector(ctx, sr, storiface.FTSealed|storiface.FTCache, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove)
+ src, si, err := st.AcquireSector(ctx, sr, storiface.FTSealed|storiface.FTCache, storiface.FTNone, storiface.PathStorage, storiface.AcquireMove)
if err != nil {
return nil, xerrors.Errorf("acquire sector: %w", err)
}
cache, sealed = src.Cache, src.Sealed
+ cacheID, sealedID = si.Cache, si.Sealed
}
if sealed == "" || cache == "" {
@@ -847,7 +792,22 @@ func (st *Local) GenerateSingleVanillaProof(ctx context.Context, minerID abi.Act
SealedSectorPath: sealed,
}
- return ffi.GenerateSingleVanillaProof(psi, si.Challenge)
+ start := time.Now()
+
+ resCh := make(chan result.Result[[]byte], 1)
+ go func() {
+ resCh <- result.Wrap(ffi.GenerateSingleVanillaProof(psi, si.Challenge))
+ }()
+
+ select {
+ case r := <-resCh:
+ return r.Unwrap()
+ case <-ctx.Done():
+ log.Errorw("failed to generate valilla PoSt proof before context cancellation", "err", ctx.Err(), "duration", time.Now().Sub(start), "cache-id", cacheID, "sealed-id", sealedID, "cache", cache, "sealed", sealed)
+
+ // this will leave the GenerateSingleVanillaProof goroutine hanging, but that's still less bad than failing PoSt
+ return nil, xerrors.Errorf("failed to generate vanilla proof before context cancellation: %w", ctx.Err())
+ }
}
var _ Store = &Local{}
diff --git a/storage/paths/local_test.go b/storage/paths/local_test.go
index 83e8e27fd..6b9f4a545 100644
--- a/storage/paths/local_test.go
+++ b/storage/paths/local_test.go
@@ -19,18 +19,18 @@ const pathSize = 16 << 20
type TestingLocalStorage struct {
root string
- c StorageConfig
+ c storiface.StorageConfig
}
func (t *TestingLocalStorage) DiskUsage(path string) (int64, error) {
return 1, nil
}
-func (t *TestingLocalStorage) GetStorage() (StorageConfig, error) {
+func (t *TestingLocalStorage) GetStorage() (storiface.StorageConfig, error) {
return t.c, nil
}
-func (t *TestingLocalStorage) SetStorage(f func(*StorageConfig)) error {
+func (t *TestingLocalStorage) SetStorage(f func(*storiface.StorageConfig)) error {
f(&t.c)
return nil
}
@@ -51,7 +51,7 @@ func (t *TestingLocalStorage) init(subpath string) error {
metaFile := filepath.Join(path, MetaFile)
- meta := &LocalStorageMeta{
+ meta := &storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 1,
CanSeal: true,
diff --git a/storage/paths/localstorage_cached.go b/storage/paths/localstorage_cached.go
index 4ccabb15e..cac0a44b6 100644
--- a/storage/paths/localstorage_cached.go
+++ b/storage/paths/localstorage_cached.go
@@ -7,6 +7,7 @@ import (
lru "github.com/hashicorp/golang-lru"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
var StatTimeout = 5 * time.Second
@@ -47,11 +48,11 @@ type diskUsageResult struct {
time time.Time
}
-func (c *cachedLocalStorage) GetStorage() (StorageConfig, error) {
+func (c *cachedLocalStorage) GetStorage() (storiface.StorageConfig, error) {
return c.base.GetStorage()
}
-func (c *cachedLocalStorage) SetStorage(f func(*StorageConfig)) error {
+func (c *cachedLocalStorage) SetStorage(f func(*storiface.StorageConfig)) error {
return c.base.SetStorage(f)
}
diff --git a/storage/paths/remote.go b/storage/paths/remote.go
index 331f2cf7a..06d1080b3 100644
--- a/storage/paths/remote.go
+++ b/storage/paths/remote.go
@@ -7,7 +7,6 @@ import (
"io"
"io/ioutil"
"math/bits"
- "mime"
"net/http"
"net/url"
"os"
@@ -24,7 +23,6 @@ import (
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
- "github.com/filecoin-project/lotus/storage/sealer/tarutil"
)
var FetchTempSubdir = "fetching"
@@ -236,7 +234,7 @@ func (r *Remote) acquireFromRemote(ctx context.Context, s abi.SectorID, fileType
return "", xerrors.Errorf("removing dest: %w", err)
}
- err = r.fetch(ctx, url, tempDest)
+ err = r.fetchThrottled(ctx, url, tempDest)
if err != nil {
merr = multierror.Append(merr, xerrors.Errorf("fetch error %s (storage %s) -> %s: %w", url, info.ID, tempDest, err))
continue
@@ -256,9 +254,7 @@ func (r *Remote) acquireFromRemote(ctx context.Context, s abi.SectorID, fileType
return "", xerrors.Errorf("failed to acquire sector %v from remote (tried %v): %w", s, si, merr)
}
-func (r *Remote) fetch(ctx context.Context, url, outname string) error {
- log.Infof("Fetch %s -> %s", url, outname)
-
+func (r *Remote) fetchThrottled(ctx context.Context, url, outname string) (rerr error) {
if len(r.limit) >= cap(r.limit) {
log.Infof("Throttling fetch, %d already running", len(r.limit))
}
@@ -274,59 +270,7 @@ func (r *Remote) fetch(ctx context.Context, url, outname string) error {
return xerrors.Errorf("context error while waiting for fetch limiter: %w", ctx.Err())
}
- req, err := http.NewRequest("GET", url, nil)
- if err != nil {
- return xerrors.Errorf("request: %w", err)
- }
- req.Header = r.auth
- req = req.WithContext(ctx)
-
- resp, err := http.DefaultClient.Do(req)
- if err != nil {
- return xerrors.Errorf("do request: %w", err)
- }
- defer resp.Body.Close() // nolint
-
- if resp.StatusCode != 200 {
- return xerrors.Errorf("non-200 code: %d", resp.StatusCode)
- }
-
- /*bar := pb.New64(w.sizeForType(typ))
- bar.ShowPercent = true
- bar.ShowSpeed = true
- bar.Units = pb.U_BYTES
-
- barreader := bar.NewProxyReader(resp.Body)
-
- bar.Start()
- defer bar.Finish()*/
-
- mediatype, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type"))
- if err != nil {
- return xerrors.Errorf("parse media type: %w", err)
- }
-
- if err := os.RemoveAll(outname); err != nil {
- return xerrors.Errorf("removing dest: %w", err)
- }
-
- switch mediatype {
- case "application/x-tar":
- return tarutil.ExtractTar(resp.Body, outname, make([]byte, CopyBuf))
- case "application/octet-stream":
- f, err := os.Create(outname)
- if err != nil {
- return err
- }
- _, err = io.CopyBuffer(f, resp.Body, make([]byte, CopyBuf))
- if err != nil {
- f.Close() // nolint
- return err
- }
- return f.Close()
- default:
- return xerrors.Errorf("unknown content type: '%s'", mediatype)
- }
+ return fetch(ctx, url, outname, r.auth)
}
func (r *Remote) checkAllocated(ctx context.Context, url string, spt abi.RegisteredSealProof, offset, size abi.PaddedPieceSize) (bool, error) {
diff --git a/storage/paths/remote_test.go b/storage/paths/remote_test.go
index a7bd6bf40..2d7fe2c73 100644
--- a/storage/paths/remote_test.go
+++ b/storage/paths/remote_test.go
@@ -38,7 +38,7 @@ func createTestStorage(t *testing.T, p string, seal bool, att ...*paths.Local) s
}
}
- cfg := &paths.LocalStorageMeta{
+ cfg := &storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 10,
CanSeal: seal,
@@ -77,8 +77,8 @@ func TestMoveShared(t *testing.T) {
_ = lr.Close()
})
- err = lr.SetStorage(func(config *paths.StorageConfig) {
- *config = paths.StorageConfig{}
+ err = lr.SetStorage(func(config *storiface.StorageConfig) {
+ *config = storiface.StorageConfig{}
})
require.NoError(t, err)
diff --git a/storage/pipeline/cbor_gen.go b/storage/pipeline/cbor_gen.go
index 2fb8c445c..88dac5d64 100644
--- a/storage/pipeline/cbor_gen.go
+++ b/storage/pipeline/cbor_gen.go
@@ -13,9 +13,9 @@ import (
xerrors "golang.org/x/xerrors"
abi "github.com/filecoin-project/go-state-types/abi"
- miner "github.com/filecoin-project/go-state-types/builtin/v8/miner"
api "github.com/filecoin-project/lotus/api"
+ storiface "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
var _ = xerrors.Errorf
@@ -23,129 +23,6 @@ var _ = cid.Undef
var _ = math.E
var _ = sort.Sort
-func (t *Piece) MarshalCBOR(w io.Writer) error {
- if t == nil {
- _, err := w.Write(cbg.CborNull)
- return err
- }
-
- cw := cbg.NewCborWriter(w)
-
- if _, err := cw.Write([]byte{162}); err != nil {
- return err
- }
-
- // t.Piece (abi.PieceInfo) (struct)
- if len("Piece") > cbg.MaxLength {
- return xerrors.Errorf("Value in field \"Piece\" was too long")
- }
-
- if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Piece"))); err != nil {
- return err
- }
- if _, err := io.WriteString(w, string("Piece")); err != nil {
- return err
- }
-
- if err := t.Piece.MarshalCBOR(cw); err != nil {
- return err
- }
-
- // t.DealInfo (api.PieceDealInfo) (struct)
- if len("DealInfo") > cbg.MaxLength {
- return xerrors.Errorf("Value in field \"DealInfo\" was too long")
- }
-
- if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("DealInfo"))); err != nil {
- return err
- }
- if _, err := io.WriteString(w, string("DealInfo")); err != nil {
- return err
- }
-
- if err := t.DealInfo.MarshalCBOR(cw); err != nil {
- return err
- }
- return nil
-}
-
-func (t *Piece) UnmarshalCBOR(r io.Reader) (err error) {
- *t = Piece{}
-
- cr := cbg.NewCborReader(r)
-
- maj, extra, err := cr.ReadHeader()
- if err != nil {
- return err
- }
- defer func() {
- if err == io.EOF {
- err = io.ErrUnexpectedEOF
- }
- }()
-
- if maj != cbg.MajMap {
- return fmt.Errorf("cbor input should be of type map")
- }
-
- if extra > cbg.MaxLength {
- return fmt.Errorf("Piece: map struct too large (%d)", extra)
- }
-
- var name string
- n := extra
-
- for i := uint64(0); i < n; i++ {
-
- {
- sval, err := cbg.ReadString(cr)
- if err != nil {
- return err
- }
-
- name = string(sval)
- }
-
- switch name {
- // t.Piece (abi.PieceInfo) (struct)
- case "Piece":
-
- {
-
- if err := t.Piece.UnmarshalCBOR(cr); err != nil {
- return xerrors.Errorf("unmarshaling t.Piece: %w", err)
- }
-
- }
- // t.DealInfo (api.PieceDealInfo) (struct)
- case "DealInfo":
-
- {
-
- b, err := cr.ReadByte()
- if err != nil {
- return err
- }
- if b != cbg.CborNull[0] {
- if err := cr.UnreadByte(); err != nil {
- return err
- }
- t.DealInfo = new(api.PieceDealInfo)
- if err := t.DealInfo.UnmarshalCBOR(cr); err != nil {
- return xerrors.Errorf("unmarshaling t.DealInfo pointer: %w", err)
- }
- }
-
- }
-
- default:
- // Field doesn't exist on this type, so ignore it
- cbg.ScanForLinks(r, func(cid.Cid) {})
- }
- }
-
- return nil
-}
func (t *SectorInfo) MarshalCBOR(w io.Writer) error {
if t == nil {
_, err := w.Write(cbg.CborNull)
@@ -154,7 +31,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error {
cw := cbg.NewCborWriter(w)
- if _, err := cw.Write([]byte{184, 32}); err != nil {
+ if _, err := cw.Write([]byte{184, 38}); err != nil {
return err
}
@@ -241,7 +118,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error {
}
}
- // t.Pieces ([]sealing.Piece) (slice)
+ // t.Pieces ([]api.SectorPiece) (slice)
if len("Pieces") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"Pieces\" was too long")
}
@@ -404,22 +281,6 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error {
return err
}
- // t.PreCommitInfo (miner.SectorPreCommitInfo) (struct)
- if len("PreCommitInfo") > cbg.MaxLength {
- return xerrors.Errorf("Value in field \"PreCommitInfo\" was too long")
- }
-
- if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("PreCommitInfo"))); err != nil {
- return err
- }
- if _, err := io.WriteString(w, string("PreCommitInfo")); err != nil {
- return err
- }
-
- if err := t.PreCommitInfo.MarshalCBOR(cw); err != nil {
- return err
- }
-
// t.PreCommitDeposit (big.Int) (struct)
if len("PreCommitDeposit") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"PreCommitDeposit\" was too long")
@@ -590,7 +451,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error {
return err
}
- // t.CCPieces ([]sealing.Piece) (slice)
+ // t.CCPieces ([]api.SectorPiece) (slice)
if len("CCPieces") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"CCPieces\" was too long")
}
@@ -794,6 +655,139 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error {
}
}
+ // t.RemoteDataUnsealed (storiface.SectorLocation) (struct)
+ if len("RemoteDataUnsealed") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"RemoteDataUnsealed\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataUnsealed"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("RemoteDataUnsealed")); err != nil {
+ return err
+ }
+
+ if err := t.RemoteDataUnsealed.MarshalCBOR(cw); err != nil {
+ return err
+ }
+
+ // t.RemoteDataSealed (storiface.SectorLocation) (struct)
+ if len("RemoteDataSealed") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"RemoteDataSealed\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataSealed"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("RemoteDataSealed")); err != nil {
+ return err
+ }
+
+ if err := t.RemoteDataSealed.MarshalCBOR(cw); err != nil {
+ return err
+ }
+
+ // t.RemoteDataCache (storiface.SectorLocation) (struct)
+ if len("RemoteDataCache") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"RemoteDataCache\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataCache"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("RemoteDataCache")); err != nil {
+ return err
+ }
+
+ if err := t.RemoteDataCache.MarshalCBOR(cw); err != nil {
+ return err
+ }
+
+ // t.RemoteCommit1Endpoint (string) (string)
+ if len("RemoteCommit1Endpoint") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"RemoteCommit1Endpoint\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteCommit1Endpoint"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("RemoteCommit1Endpoint")); err != nil {
+ return err
+ }
+
+ if len(t.RemoteCommit1Endpoint) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.RemoteCommit1Endpoint was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RemoteCommit1Endpoint))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.RemoteCommit1Endpoint)); err != nil {
+ return err
+ }
+
+ // t.RemoteCommit2Endpoint (string) (string)
+ if len("RemoteCommit2Endpoint") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"RemoteCommit2Endpoint\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteCommit2Endpoint"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("RemoteCommit2Endpoint")); err != nil {
+ return err
+ }
+
+ if len(t.RemoteCommit2Endpoint) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.RemoteCommit2Endpoint was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RemoteCommit2Endpoint))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.RemoteCommit2Endpoint)); err != nil {
+ return err
+ }
+
+ // t.RemoteSealingDoneEndpoint (string) (string)
+ if len("RemoteSealingDoneEndpoint") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"RemoteSealingDoneEndpoint\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteSealingDoneEndpoint"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("RemoteSealingDoneEndpoint")); err != nil {
+ return err
+ }
+
+ if len(t.RemoteSealingDoneEndpoint) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.RemoteSealingDoneEndpoint was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.RemoteSealingDoneEndpoint))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.RemoteSealingDoneEndpoint)); err != nil {
+ return err
+ }
+
+ // t.RemoteDataFinalized (bool) (bool)
+ if len("RemoteDataFinalized") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"RemoteDataFinalized\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("RemoteDataFinalized"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("RemoteDataFinalized")); err != nil {
+ return err
+ }
+
+ if err := cbg.WriteBool(w, t.RemoteDataFinalized); err != nil {
+ return err
+ }
+
// t.LastErr (string) (string)
if len("LastErr") > cbg.MaxLength {
return xerrors.Errorf("Value in field \"LastErr\" was too long")
@@ -960,7 +954,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) {
t.CreationTime = int64(extraI)
}
- // t.Pieces ([]sealing.Piece) (slice)
+ // t.Pieces ([]api.SectorPiece) (slice)
case "Pieces":
maj, extra, err = cr.ReadHeader()
@@ -977,12 +971,12 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) {
}
if extra > 0 {
- t.Pieces = make([]Piece, extra)
+ t.Pieces = make([]api.SectorPiece, extra)
}
for i := 0; i < int(extra); i++ {
- var v Piece
+ var v api.SectorPiece
if err := v.UnmarshalCBOR(cr); err != nil {
return err
}
@@ -1128,26 +1122,6 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) {
if _, err := io.ReadFull(cr, t.Proof[:]); err != nil {
return err
}
- // t.PreCommitInfo (miner.SectorPreCommitInfo) (struct)
- case "PreCommitInfo":
-
- {
-
- b, err := cr.ReadByte()
- if err != nil {
- return err
- }
- if b != cbg.CborNull[0] {
- if err := cr.UnreadByte(); err != nil {
- return err
- }
- t.PreCommitInfo = new(miner.SectorPreCommitInfo)
- if err := t.PreCommitInfo.UnmarshalCBOR(cr); err != nil {
- return xerrors.Errorf("unmarshaling t.PreCommitInfo pointer: %w", err)
- }
- }
-
- }
// t.PreCommitDeposit (big.Int) (struct)
case "PreCommitDeposit":
@@ -1310,7 +1284,7 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) {
default:
return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra)
}
- // t.CCPieces ([]sealing.Piece) (slice)
+ // t.CCPieces ([]api.SectorPiece) (slice)
case "CCPieces":
maj, extra, err = cr.ReadHeader()
@@ -1327,12 +1301,12 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) {
}
if extra > 0 {
- t.CCPieces = make([]Piece, extra)
+ t.CCPieces = make([]api.SectorPiece, extra)
}
for i := 0; i < int(extra); i++ {
- var v Piece
+ var v api.SectorPiece
if err := v.UnmarshalCBOR(cr); err != nil {
return err
}
@@ -1514,6 +1488,117 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) (err error) {
t.TerminatedAt = abi.ChainEpoch(extraI)
}
+ // t.RemoteDataUnsealed (storiface.SectorLocation) (struct)
+ case "RemoteDataUnsealed":
+
+ {
+
+ b, err := cr.ReadByte()
+ if err != nil {
+ return err
+ }
+ if b != cbg.CborNull[0] {
+ if err := cr.UnreadByte(); err != nil {
+ return err
+ }
+ t.RemoteDataUnsealed = new(storiface.SectorLocation)
+ if err := t.RemoteDataUnsealed.UnmarshalCBOR(cr); err != nil {
+ return xerrors.Errorf("unmarshaling t.RemoteDataUnsealed pointer: %w", err)
+ }
+ }
+
+ }
+ // t.RemoteDataSealed (storiface.SectorLocation) (struct)
+ case "RemoteDataSealed":
+
+ {
+
+ b, err := cr.ReadByte()
+ if err != nil {
+ return err
+ }
+ if b != cbg.CborNull[0] {
+ if err := cr.UnreadByte(); err != nil {
+ return err
+ }
+ t.RemoteDataSealed = new(storiface.SectorLocation)
+ if err := t.RemoteDataSealed.UnmarshalCBOR(cr); err != nil {
+ return xerrors.Errorf("unmarshaling t.RemoteDataSealed pointer: %w", err)
+ }
+ }
+
+ }
+ // t.RemoteDataCache (storiface.SectorLocation) (struct)
+ case "RemoteDataCache":
+
+ {
+
+ b, err := cr.ReadByte()
+ if err != nil {
+ return err
+ }
+ if b != cbg.CborNull[0] {
+ if err := cr.UnreadByte(); err != nil {
+ return err
+ }
+ t.RemoteDataCache = new(storiface.SectorLocation)
+ if err := t.RemoteDataCache.UnmarshalCBOR(cr); err != nil {
+ return xerrors.Errorf("unmarshaling t.RemoteDataCache pointer: %w", err)
+ }
+ }
+
+ }
+ // t.RemoteCommit1Endpoint (string) (string)
+ case "RemoteCommit1Endpoint":
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.RemoteCommit1Endpoint = string(sval)
+ }
+ // t.RemoteCommit2Endpoint (string) (string)
+ case "RemoteCommit2Endpoint":
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.RemoteCommit2Endpoint = string(sval)
+ }
+ // t.RemoteSealingDoneEndpoint (string) (string)
+ case "RemoteSealingDoneEndpoint":
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.RemoteSealingDoneEndpoint = string(sval)
+ }
+ // t.RemoteDataFinalized (bool) (bool)
+ case "RemoteDataFinalized":
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajOther {
+ return fmt.Errorf("booleans must be major type 7")
+ }
+ switch extra {
+ case 20:
+ t.RemoteDataFinalized = false
+ case 21:
+ t.RemoteDataFinalized = true
+ default:
+ return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra)
+ }
// t.LastErr (string) (string)
case "LastErr":
diff --git a/storage/pipeline/checks.go b/storage/pipeline/checks.go
index 2192db5cf..6381ce898 100644
--- a/storage/pipeline/checks.go
+++ b/storage/pipeline/checks.go
@@ -13,6 +13,7 @@ import (
"github.com/filecoin-project/go-state-types/crypto"
prooftypes "github.com/filecoin-project/go-state-types/proof"
+ "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/types"
)
@@ -41,21 +42,28 @@ type ErrCommitWaitFailed struct{ error }
type ErrBadRU struct{ error }
type ErrBadPR struct{ error }
-func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api SealingAPI, mustHaveDeals bool) error {
+func checkPieces(ctx context.Context, maddr address.Address, sn abi.SectorNumber, pieces []api.SectorPiece, api SealingAPI, mustHaveDeals bool) error {
ts, err := api.ChainHead(ctx)
if err != nil {
return &ErrApi{xerrors.Errorf("getting chain head: %w", err)}
}
dealCount := 0
+ var offset abi.PaddedPieceSize
+
+ for i, p := range pieces {
+ // check that the piece is correctly aligned
+ if offset%p.Piece.Size != 0 {
+ return &ErrInvalidPiece{xerrors.Errorf("sector %d piece %d is not aligned: size=%xh offset=%xh off-by=%xh", sn, i, p.Piece.Size, offset, offset%p.Piece.Size)}
+ }
+ offset += p.Piece.Size
- for i, p := range si.Pieces {
// if no deal is associated with the piece, ensure that we added it as
// filler (i.e. ensure that it has a zero PieceCID)
if p.DealInfo == nil {
exp := zerocomm.ZeroPieceCommitment(p.Piece.Size.Unpadded())
if !p.Piece.PieceCID.Equals(exp) {
- return &ErrInvalidPiece{xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", si.SectorNumber, i, p.Piece.PieceCID)}
+ return &ErrInvalidPiece{xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", sn, i, p.Piece.PieceCID)}
}
continue
}
@@ -68,24 +76,24 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api
}
if deal.Proposal.Provider != maddr {
- return &ErrInvalidDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(si.Pieces), si.SectorNumber, p.DealInfo.DealID, deal.Proposal.Provider, maddr)}
+ return &ErrInvalidDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(pieces), sn, p.DealInfo.DealID, deal.Proposal.Provider, maddr)}
}
if deal.Proposal.PieceCID != p.Piece.PieceCID {
- return &ErrInvalidDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(si.Pieces), si.SectorNumber, p.DealInfo.DealID, p.Piece.PieceCID, deal.Proposal.PieceCID)}
+ return &ErrInvalidDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(pieces), sn, p.DealInfo.DealID, p.Piece.PieceCID, deal.Proposal.PieceCID)}
}
if p.Piece.Size != deal.Proposal.PieceSize {
- return &ErrInvalidDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(si.Pieces), si.SectorNumber, p.DealInfo.DealID, p.Piece.Size, deal.Proposal.PieceSize)}
+ return &ErrInvalidDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(pieces), sn, p.DealInfo.DealID, p.Piece.Size, deal.Proposal.PieceSize)}
}
if ts.Height() >= deal.Proposal.StartEpoch {
- return &ErrExpiredDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(si.Pieces), si.SectorNumber, p.DealInfo.DealID, deal.Proposal.StartEpoch, ts.Height())}
+ return &ErrExpiredDeals{xerrors.Errorf("piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(pieces), sn, p.DealInfo.DealID, deal.Proposal.StartEpoch, ts.Height())}
}
}
if mustHaveDeals && dealCount <= 0 {
- return &ErrNoDeals{(xerrors.Errorf("sector %d must have deals, but does not", si.SectorNumber))}
+ return &ErrNoDeals{xerrors.Errorf("sector %d must have deals, but does not", sn)}
}
return nil
@@ -95,7 +103,7 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api
//
// matches pieces, and that the seal ticket isn't expired
func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, tsk types.TipSetKey, height abi.ChainEpoch, api SealingAPI) (err error) {
- if err := checkPieces(ctx, maddr, si, api, false); err != nil {
+ if err := checkPieces(ctx, maddr, si.SectorNumber, si.Pieces, api, false); err != nil {
return err
}
@@ -210,7 +218,7 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte,
return &ErrInvalidProof{xerrors.New("invalid proof (compute error?)")}
}
- if err := checkPieces(ctx, m.maddr, si, m.Api, false); err != nil {
+ if err := checkPieces(ctx, m.maddr, si.SectorNumber, si.Pieces, m.Api, false); err != nil {
return err
}
@@ -220,7 +228,7 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte,
// check that sector info is good after running a replica update
func checkReplicaUpdate(ctx context.Context, maddr address.Address, si SectorInfo, tsk types.TipSetKey, api SealingAPI) error {
- if err := checkPieces(ctx, maddr, si, api, true); err != nil {
+ if err := checkPieces(ctx, maddr, si.SectorNumber, si.Pieces, api, true); err != nil {
return err
}
if !si.CCUpdate {
diff --git a/storage/pipeline/commit_batch.go b/storage/pipeline/commit_batch.go
index 2011ad92e..b5651c5fb 100644
--- a/storage/pipeline/commit_batch.go
+++ b/storage/pipeline/commit_batch.go
@@ -13,15 +13,15 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/go-state-types/proof"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/config"
@@ -583,7 +583,7 @@ func (b *CommitBatcher) getCommitCutoff(si SectorInfo) (time.Time, error) {
if pci == nil {
return time.Now(), xerrors.Errorf("precommit info not found")
}
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
log.Errorf("unsupported network vrsion: %s", err)
return time.Now(), err
diff --git a/storage/pipeline/commit_batch_test.go b/storage/pipeline/commit_batch_test.go
index cece591d3..a8948edcf 100644
--- a/storage/pipeline/commit_batch_test.go
+++ b/storage/pipeline/commit_batch_test.go
@@ -16,7 +16,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/network"
prooftypes "github.com/filecoin-project/go-state-types/proof"
diff --git a/storage/pipeline/currentdealinfo.go b/storage/pipeline/currentdealinfo.go
index bfc948610..cd3aa47be 100644
--- a/storage/pipeline/currentdealinfo.go
+++ b/storage/pipeline/currentdealinfo.go
@@ -10,7 +10,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
@@ -122,7 +122,7 @@ func (mgr *CurrentDealInfoManager) dealIDFromPublishDealsMsg(ctx context.Context
return dealID, types.EmptyTSK, xerrors.Errorf("getting publish deal message %s: %w", publishCid, err)
}
- var pubDealsParams market8.PublishStorageDealsParams
+ var pubDealsParams markettypes.PublishStorageDealsParams
if err := pubDealsParams.UnmarshalCBOR(bytes.NewReader(pubmsg.Params)); err != nil {
return dealID, types.EmptyTSK, xerrors.Errorf("unmarshalling publish deal message params for message %s: %w", publishCid, err)
}
diff --git a/storage/pipeline/currentdealinfo_test.go b/storage/pipeline/currentdealinfo_test.go
index 3087577d6..21141a35d 100644
--- a/storage/pipeline/currentdealinfo_test.go
+++ b/storage/pipeline/currentdealinfo_test.go
@@ -16,7 +16,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
- markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go
index 3df57a501..25fd6fcef 100644
--- a/storage/pipeline/fsm.go
+++ b/storage/pipeline/fsm.go
@@ -7,6 +7,7 @@ import (
"context"
"encoding/json"
"fmt"
+ "net/http"
"reflect"
"time"
@@ -14,6 +15,8 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-statemachine"
+
+ "github.com/filecoin-project/lotus/api"
)
func (m *Sealing) Plan(events []statemachine.Event, user interface{}) (interface{}, uint64, error) {
@@ -40,11 +43,17 @@ func (m *Sealing) Plan(events []statemachine.Event, user interface{}) (interface
}
var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *SectorInfo) (uint64, error){
+ // external import
+ ReceiveSector: planOne(
+ onReturning(SectorReceived{}),
+ ),
+
// Sealing
UndefinedSectorState: planOne(
on(SectorStart{}, WaitDeals),
on(SectorStartCC{}, Packing),
+ on(SectorReceive{}, ReceiveSector),
),
Empty: planOne( // deprecated
on(SectorAddPiece{}, AddPiece),
@@ -136,8 +145,8 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
),
FinalizeSector: planOne(
- on(SectorFinalized{}, Proving),
- on(SectorFinalizedAvailable{}, Available),
+ onWithCB(SectorFinalized{}, Proving, maybeNotifyRemoteDone(true, "Proving")),
+ onWithCB(SectorFinalizedAvailable{}, Available, maybeNotifyRemoteDone(true, "Available")),
on(SectorFinalizeFailed{}, FinalizeFailed),
),
@@ -179,6 +188,11 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
SubmitReplicaUpdate: planOne(
on(SectorReplicaUpdateSubmitted{}, ReplicaUpdateWait),
on(SectorSubmitReplicaUpdateFailed{}, ReplicaUpdateFailed),
+ on(SectorDeadlineImmutable{}, WaitMutable),
+ ),
+ WaitMutable: planOne(
+ on(SectorDeadlineMutable{}, SubmitReplicaUpdate),
+ on(SectorAbortUpgrade{}, AbortUpgrade),
),
ReplicaUpdateWait: planOne(
on(SectorReplicaUpdateLanded{}, UpdateActivating),
@@ -212,13 +226,16 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
on(SectorRetryWaitSeed{}, WaitSeed),
on(SectorSealPreCommit1Failed{}, SealPreCommit1Failed),
on(SectorPreCommitLanded{}, WaitSeed),
- on(SectorDealsExpired{}, DealsExpired),
+ onWithCB(SectorDealsExpired{}, DealsExpired, maybeNotifyRemoteDone(false, "DealsExpired")),
on(SectorInvalidDealIDs{}, RecoverDealIDs),
),
ComputeProofFailed: planOne(
on(SectorRetryComputeProof{}, Committing),
on(SectorSealPreCommit1Failed{}, SealPreCommit1Failed),
),
+ RemoteCommitFailed: planOne(
+ on(SectorRetryComputeProof{}, Committing),
+ ),
CommitFinalizeFailed: planOne(
on(SectorRetryFinalize{}, CommitFinalize),
),
@@ -232,9 +249,9 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
on(SectorRetryPreCommit{}, PreCommitting),
on(SectorRetryCommitWait{}, CommitWait),
on(SectorRetrySubmitCommit{}, SubmitCommit),
- on(SectorDealsExpired{}, DealsExpired),
+ onWithCB(SectorDealsExpired{}, DealsExpired, maybeNotifyRemoteDone(false, "DealsExpired")),
on(SectorInvalidDealIDs{}, RecoverDealIDs),
- on(SectorTicketExpired{}, Removing),
+ onWithCB(SectorTicketExpired{}, Removing, maybeNotifyRemoteDone(false, "Removing")),
),
FinalizeFailed: planOne(
on(SectorRetryFinalize{}, FinalizeSector),
@@ -457,6 +474,9 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta
}
switch state.State {
+ case ReceiveSector:
+ return m.handleReceiveSector, processed, nil
+
// Happy path
case Empty:
fallthrough
@@ -510,6 +530,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta
return m.handleProveReplicaUpdate, processed, nil
case SubmitReplicaUpdate:
return m.handleSubmitReplicaUpdate, processed, nil
+ case WaitMutable:
+ return m.handleWaitMutable, processed, nil
case ReplicaUpdateWait:
return m.handleReplicaUpdateWait, processed, nil
case FinalizeReplicaUpdate:
@@ -530,6 +552,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta
return m.handlePreCommitFailed, processed, nil
case ComputeProofFailed:
return m.handleComputeProofFailed, processed, nil
+ case RemoteCommitFailed:
+ return m.handleRemoteCommitFailed, processed, nil
case CommitFailed:
return m.handleCommitFailed, processed, nil
case CommitFinalizeFailed:
@@ -657,6 +681,8 @@ func planCommitting(events []statemachine.Event, state *SectorInfo) (uint64, err
return uint64(i + 1), nil
case SectorComputeProofFailed:
state.State = ComputeProofFailed
+ case SectorRemoteCommit1Failed, SectorRemoteCommit2Failed:
+ state.State = RemoteCommitFailed
case SectorSealPreCommit1Failed:
state.State = SealPreCommit1Failed
case SectorCommitFailed:
@@ -720,6 +746,16 @@ func on(mut mutator, next SectorState) func() (mutator, func(*SectorInfo) (bool,
}
}
+func onWithCB(mut mutator, next SectorState, cb func(info *SectorInfo)) func() (mutator, func(*SectorInfo) (bool, error)) {
+ return func() (mutator, func(*SectorInfo) (bool, error)) {
+ return mut, func(state *SectorInfo) (bool, error) {
+ cb(state)
+ state.State = next
+ return false, nil
+ }
+ }
+}
+
// like `on`, but doesn't change state
func apply(mut mutator) func() (mutator, func(*SectorInfo) (bool, error)) {
return func() (mutator, func(*SectorInfo) (bool, error)) {
@@ -796,3 +832,44 @@ func planOneOrIgnore(ts ...func() (mut mutator, next func(*SectorInfo) (more boo
return cnt, nil
}
}
+
+// maybeNotifyRemoteDone will send sealing-done notification to the RemoteSealingDone
+// if the RemoteSealingDoneEndpoint is set. If RemoteSealingDoneEndpoint is not set,
+// this is no-op
+func maybeNotifyRemoteDone(success bool, state string) func(*SectorInfo) {
+ return func(sector *SectorInfo) {
+ if sector.RemoteSealingDoneEndpoint == "" {
+ return
+ }
+
+ reqData := api.RemoteSealingDoneParams{
+ Successful: success,
+ State: state,
+ CommitMessage: sector.CommitMessage,
+ }
+ reqBody, err := json.Marshal(&reqData)
+ if err != nil {
+ log.Errorf("marshaling remote done notification request params: %s", err)
+ return
+ }
+
+ req, err := http.NewRequest("POST", sector.RemoteSealingDoneEndpoint, bytes.NewReader(reqBody))
+ if err != nil {
+ log.Errorf("creating new remote done notification request: %s", err)
+ return
+ }
+ req.Header.Set("Content-Type", "application/json")
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ log.Errorf("sending remote done notification: %s", err)
+ return
+ }
+
+ defer resp.Body.Close() //nolint:errcheck
+
+ if resp.StatusCode != http.StatusOK {
+ log.Errorf("remote done notification received non-200 http response %s", resp.Status)
+ return
+ }
+ }
+}
diff --git a/storage/pipeline/fsm_events.go b/storage/pipeline/fsm_events.go
index eb1087151..122691ca3 100644
--- a/storage/pipeline/fsm_events.go
+++ b/storage/pipeline/fsm_events.go
@@ -8,8 +8,9 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -87,7 +88,7 @@ func (evt SectorAddPiece) apply(state *SectorInfo) {
}
type SectorPieceAdded struct {
- NewPieces []Piece
+ NewPieces []api.SectorPiece
}
func (evt SectorPieceAdded) apply(state *SectorInfo) {
@@ -113,7 +114,7 @@ type SectorPacked struct{ FillerPieces []abi.PieceInfo }
func (evt SectorPacked) apply(state *SectorInfo) {
for idx := range evt.FillerPieces {
- state.Pieces = append(state.Pieces, Piece{
+ state.Pieces = append(state.Pieces, api.SectorPiece{
Piece: evt.FillerPieces[idx],
DealInfo: nil, // filler pieces don't have deals associated with them
})
@@ -205,7 +206,6 @@ type SectorPreCommitted struct {
func (evt SectorPreCommitted) apply(state *SectorInfo) {
state.PreCommitMessage = &evt.Message
state.PreCommitDeposit = evt.PreCommitDeposit
- state.PreCommitInfo = &evt.PreCommitInfo
}
type SectorSeedReady struct {
@@ -218,6 +218,16 @@ func (evt SectorSeedReady) apply(state *SectorInfo) {
state.SeedValue = evt.SeedValue
}
+type SectorRemoteCommit1Failed struct{ error }
+
+func (evt SectorRemoteCommit1Failed) FormatError(xerrors.Printer) (next error) { return evt.error }
+func (evt SectorRemoteCommit1Failed) apply(*SectorInfo) {}
+
+type SectorRemoteCommit2Failed struct{ error }
+
+func (evt SectorRemoteCommit2Failed) FormatError(xerrors.Printer) (next error) { return evt.error }
+func (evt SectorRemoteCommit2Failed) apply(*SectorInfo) {}
+
type SectorComputeProofFailed struct{ error }
func (evt SectorComputeProofFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
@@ -313,6 +323,9 @@ func (evt SectorStartCCUpdate) apply(state *SectorInfo) {
// Clear filler piece but remember in case of abort
state.CCPieces = state.Pieces
state.Pieces = nil
+
+ // Clear CreationTime in case this sector was accepting piece data previously
+ state.CreationTime = 0
}
type SectorReplicaUpdate struct {
@@ -448,6 +461,7 @@ func (evt SectorRevertUpgradeToProving) apply(state *SectorInfo) {
state.ReplicaUpdateMessage = nil
state.Pieces = state.CCPieces
state.CCPieces = nil
+ state.CreationTime = 0
}
type SectorRetrySubmitReplicaUpdateWait struct{}
@@ -462,6 +476,14 @@ type SectorSubmitReplicaUpdateFailed struct{}
func (evt SectorSubmitReplicaUpdateFailed) apply(state *SectorInfo) {}
+type SectorDeadlineImmutable struct{}
+
+func (evt SectorDeadlineImmutable) apply(state *SectorInfo) {}
+
+type SectorDeadlineMutable struct{}
+
+func (evt SectorDeadlineMutable) apply(state *SectorInfo) {}
+
type SectorReleaseKeyFailed struct{ error }
func (evt SectorReleaseKeyFailed) FormatError(xerrors.Printer) (next error) {
@@ -514,6 +536,9 @@ func (evt SectorTerminateFailed) apply(*SectorInfo) {}
type SectorRemove struct{}
func (evt SectorRemove) applyGlobal(state *SectorInfo) bool {
+ // because this event is global we need to send the notification here instead through an fsm callback
+ maybeNotifyRemoteDone(false, "Removing")(state)
+
state.State = Removing
return true
}
@@ -526,3 +551,15 @@ type SectorRemoveFailed struct{ error }
func (evt SectorRemoveFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
func (evt SectorRemoveFailed) apply(*SectorInfo) {}
+
+type SectorReceive struct {
+ State SectorInfo
+}
+
+func (evt SectorReceive) apply(state *SectorInfo) {
+ *state = evt.State
+}
+
+type SectorReceived struct{}
+
+func (evt SectorReceived) apply(state *SectorInfo) {}
diff --git a/storage/pipeline/fsm_test.go b/storage/pipeline/fsm_test.go
index 53f85d1dc..f12b66f93 100644
--- a/storage/pipeline/fsm_test.go
+++ b/storage/pipeline/fsm_test.go
@@ -390,3 +390,64 @@ func TestTicketExpired(t *testing.T) {
}
}
}
+
+func TestCreationTimeCleared(t *testing.T) {
+ var notif []struct{ before, after SectorInfo }
+ ma, _ := address.NewIDAddress(55151)
+ m := test{
+ s: &Sealing{
+ maddr: ma,
+ stats: SectorStats{
+ bySector: map[abi.SectorID]SectorState{},
+ byState: map[SectorState]int64{},
+ },
+ notifee: func(before, after SectorInfo) {
+ notif = append(notif, struct{ before, after SectorInfo }{before, after})
+ },
+ },
+ t: t,
+ state: &SectorInfo{State: Available},
+ }
+
+ // sector starts with zero CreationTime
+ m.planSingle(SectorStartCCUpdate{})
+ require.Equal(m.t, m.state.State, SnapDealsWaitDeals)
+
+ require.Equal(t, int64(0), m.state.CreationTime)
+
+ // First AddPiece will set CreationTime
+ m.planSingle(SectorAddPiece{})
+ require.Equal(m.t, m.state.State, SnapDealsAddPiece)
+
+ require.NotEqual(t, int64(0), m.state.CreationTime)
+
+ m.planSingle(SectorPieceAdded{})
+ require.Equal(m.t, m.state.State, SnapDealsWaitDeals)
+
+ // abort shoult clean up CreationTime
+ m.planSingle(SectorAbortUpgrade{})
+ require.Equal(m.t, m.state.State, AbortUpgrade)
+
+ require.NotEqual(t, int64(0), m.state.CreationTime)
+
+ m.planSingle(SectorRevertUpgradeToProving{})
+ require.Equal(m.t, m.state.State, Proving)
+
+ require.Equal(t, int64(0), m.state.CreationTime)
+
+ m.planSingle(SectorMarkForUpdate{})
+
+ // in case CreationTime was set for whatever reason (lotus bug / manual sector state change)
+ // make sure we clean it up when starting upgrade
+ m.state.CreationTime = 325
+ m.planSingle(SectorStartCCUpdate{})
+ require.Equal(m.t, m.state.State, SnapDealsWaitDeals)
+
+ require.Equal(t, int64(0), m.state.CreationTime)
+
+ // "First" AddPiece will set CreationTime
+ m.planSingle(SectorAddPiece{})
+ require.Equal(m.t, m.state.State, SnapDealsAddPiece)
+
+ require.NotEqual(t, int64(0), m.state.CreationTime)
+}
diff --git a/storage/pipeline/gen/main.go b/storage/pipeline/gen/main.go
index 6da1d96b7..578c81478 100644
--- a/storage/pipeline/gen/main.go
+++ b/storage/pipeline/gen/main.go
@@ -11,7 +11,6 @@ import (
func main() {
err := gen.WriteMapEncodersToFile("./cbor_gen.go", "sealing",
- sealing.Piece{},
sealing.SectorInfo{},
sealing.Log{},
)
diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go
index c7af7783e..25c752e5f 100644
--- a/storage/pipeline/input.go
+++ b/storage/pipeline/input.go
@@ -6,12 +6,14 @@ import (
"time"
"github.com/ipfs/go-cid"
+ "go.uber.org/zap"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-commp-utils/zerocomm"
"github.com/filecoin-project/go-padreader"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/go-statemachine"
"github.com/filecoin-project/lotus/api"
@@ -28,8 +30,13 @@ import (
func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) error {
var used abi.UnpaddedPieceSize
+ var lastDealEnd abi.ChainEpoch
for _, piece := range sector.Pieces {
used += piece.Piece.Size.Unpadded()
+
+ if piece.DealInfo != nil && piece.DealInfo.DealProposal.EndEpoch > lastDealEnd {
+ lastDealEnd = piece.DealInfo.DealProposal.EndEpoch
+ }
}
m.inputLk.Lock()
@@ -72,6 +79,7 @@ func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) e
// (note that m.assignedPieces[sid] will always be empty here)
m.openSectors[sid].used = used
}
+ m.openSectors[sid].lastDealEnd = lastDealEnd
go func() {
defer m.inputLk.Unlock()
@@ -84,12 +92,17 @@ func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) e
}
func (m *Sealing) maybeStartSealing(ctx statemachine.Context, sector SectorInfo, used abi.UnpaddedPieceSize) (bool, error) {
+ log := log.WithOptions(zap.Fields(
+ zap.Uint64("sector", uint64(sector.SectorNumber)),
+ zap.Int("deals", len(sector.dealIDs())),
+ ))
+
now := time.Now()
st := m.sectorTimers[m.minerSectorID(sector.SectorNumber)]
if st != nil {
if !st.Stop() { // timer expired, SectorStartPacking was/is being sent
// we send another SectorStartPacking in case one was sent in the handleAddPiece state
- log.Infow("starting to seal deal sector", "sector", sector.SectorNumber, "trigger", "wait-timeout")
+ log.Infow("starting to seal deal sector", "trigger", "wait-timeout")
return true, ctx.Send(SectorStartPacking{})
}
}
@@ -106,13 +119,13 @@ func (m *Sealing) maybeStartSealing(ctx statemachine.Context, sector SectorInfo,
if len(sector.dealIDs()) >= maxDeals {
// can't accept more deals
- log.Infow("starting to seal deal sector", "sector", sector.SectorNumber, "trigger", "maxdeals")
+ log.Infow("starting to seal deal sector", "trigger", "maxdeals")
return true, ctx.Send(SectorStartPacking{})
}
if used.Padded() == abi.PaddedPieceSize(ssize) {
// sector full
- log.Infow("starting to seal deal sector", "sector", sector.SectorNumber, "trigger", "filled")
+ log.Infow("starting to seal deal sector", "trigger", "filled")
return true, ctx.Send(SectorStartPacking{})
}
@@ -142,15 +155,15 @@ func (m *Sealing) maybeStartSealing(ctx statemachine.Context, sector SectorInfo,
}
if now.After(sealTime) {
- log.Infow("starting to seal deal sector", "sector", sector.SectorNumber, "trigger", "wait-timeout")
+ log.Infow("starting to seal deal sector", "trigger", "wait-timeout", "creation", sector.CreationTime)
return true, ctx.Send(SectorStartPacking{})
}
m.sectorTimers[m.minerSectorID(sector.SectorNumber)] = time.AfterFunc(sealTime.Sub(now), func() {
- log.Infow("starting to seal deal sector", "sector", sector.SectorNumber, "trigger", "wait-timer")
+ log.Infow("starting to seal deal sector", "trigger", "wait-timer")
if err := ctx.Send(SectorStartPacking{}); err != nil {
- log.Errorw("sending SectorStartPacking event failed", "sector", sector.SectorNumber, "error", err)
+ log.Errorw("sending SectorStartPacking event failed", "error", err)
}
})
}
@@ -234,7 +247,7 @@ func (m *Sealing) handleAddPiece(ctx statemachine.Context, sector SectorInfo) er
}
pieceSizes = append(pieceSizes, p.Unpadded())
- res.NewPieces = append(res.NewPieces, Piece{
+ res.NewPieces = append(res.NewPieces, api.SectorPiece{
Piece: ppi,
})
}
@@ -262,7 +275,7 @@ func (m *Sealing) handleAddPiece(ctx statemachine.Context, sector SectorInfo) er
offset += deal.size
pieceSizes = append(pieceSizes, deal.size)
- res.NewPieces = append(res.NewPieces, Piece{
+ res.NewPieces = append(res.NewPieces, api.SectorPiece{
Piece: ppi,
DealInfo: &deal.deal,
})
@@ -314,6 +327,11 @@ func (m *Sealing) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPiec
deal.DealProposal.PieceCID, ts.Height(), deal.DealProposal.StartEpoch)
}
+ claimTerms, err := m.getClaimTerms(ctx, deal, ts.Key())
+ if err != nil {
+ return api.SectorOffset{}, err
+ }
+
m.inputLk.Lock()
if pp, exist := m.pendingPieces[proposalCID(deal)]; exist {
m.inputLk.Unlock()
@@ -332,7 +350,7 @@ func (m *Sealing) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPiec
}
// addPendingPiece takes over m.inputLk
- pp := m.addPendingPiece(ctx, size, data, deal, sp)
+ pp := m.addPendingPiece(ctx, size, data, deal, claimTerms, sp)
res, err := waitAddPieceResp(ctx, pp)
if err != nil {
@@ -341,14 +359,41 @@ func (m *Sealing) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPiec
return api.SectorOffset{Sector: res.sn, Offset: res.offset.Padded()}, res.err
}
+func (m *Sealing) getClaimTerms(ctx context.Context, deal api.PieceDealInfo, tsk types.TipSetKey) (pieceClaimBounds, error) {
+ nv, err := m.Api.StateNetworkVersion(ctx, tsk)
+ if err != nil {
+ return pieceClaimBounds{}, err
+ }
+
+ if nv >= network.Version17 {
+ all, err := m.Api.StateGetAllocationForPendingDeal(ctx, deal.DealID, tsk)
+ if err != nil {
+ return pieceClaimBounds{}, err
+ }
+ if all != nil {
+ return pieceClaimBounds{
+ claimTermEnd: deal.DealProposal.StartEpoch + all.TermMax,
+ }, nil
+ }
+ }
+
+ // no allocation for this deal, so just use a really high number for "term end"
+ return pieceClaimBounds{
+ claimTermEnd: deal.DealProposal.EndEpoch + policy.GetSectorMaxLifetime(abi.RegisteredSealProof_StackedDrg32GiBV1_1, network.Version17),
+ }, nil
+}
+
// called with m.inputLk; transfers the lock to another goroutine!
-func (m *Sealing) addPendingPiece(ctx context.Context, size abi.UnpaddedPieceSize, data storiface.Data, deal api.PieceDealInfo, sp abi.RegisteredSealProof) *pendingPiece {
+func (m *Sealing) addPendingPiece(ctx context.Context, size abi.UnpaddedPieceSize, data storiface.Data, deal api.PieceDealInfo, ct pieceClaimBounds, sp abi.RegisteredSealProof) *pendingPiece {
doneCh := make(chan struct{})
pp := &pendingPiece{
+ size: size,
+ deal: deal,
+ claimTerms: ct,
+
+ data: data,
+
doneCh: doneCh,
- size: size,
- deal: deal,
- data: data,
assigned: false,
}
pp.accepted = func(sn abi.SectorNumber, offset abi.UnpaddedPieceSize, err error) {
@@ -396,7 +441,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
e abi.ChainEpoch
p abi.TokenAmount
})
- expF := func(sn abi.SectorNumber) (abi.ChainEpoch, abi.TokenAmount, error) {
+ getExpirationCached := func(sn abi.SectorNumber) (abi.ChainEpoch, abi.TokenAmount, error) {
if e, ok := memo[sn]; ok {
return e.e, e.p, nil
}
@@ -404,6 +449,9 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
if err != nil {
return 0, big.Zero(), err
}
+ if onChainInfo == nil {
+ return 0, big.Zero(), xerrors.Errorf("sector info for sector %d not found", sn)
+ }
memo[sn] = struct {
e abi.ChainEpoch
p abi.TokenAmount
@@ -420,6 +468,9 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
sector abi.SectorID
deal cid.Cid
+ dealEnd abi.ChainEpoch
+ claimTermEnd abi.ChainEpoch
+
size abi.UnpaddedPieceSize
padding abi.UnpaddedPieceSize
}
@@ -440,14 +491,12 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
avail := abi.PaddedPieceSize(ssize).Unpadded() - sector.used
// check that sector lifetime is long enough to fit deal using latest expiration from on chain
- ok, err := sector.dealFitsInLifetime(piece.deal.DealProposal.EndEpoch, expF)
+ ok, err := sector.checkDealAssignable(piece, getExpirationCached)
if err != nil {
log.Errorf("failed to check expiration for cc Update sector %d", sector.number)
continue
}
if !ok {
- exp, _, _ := expF(sector.number)
- log.Debugf("CC update sector %d cannot fit deal, expiration %d before deal end epoch %d", id, exp, piece.deal.DealProposal.EndEpoch)
continue
}
@@ -456,6 +505,9 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
sector: id,
deal: proposalCid,
+ dealEnd: piece.deal.DealProposal.EndEpoch,
+ claimTermEnd: piece.claimTerms.claimTermEnd,
+
size: piece.size,
padding: avail % piece.size,
})
@@ -463,6 +515,8 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
}
}
sort.Slice(matches, func(i, j int) bool {
+ // todo maybe sort by expiration
+
if matches[i].padding != matches[j].padding { // less padding is better
return matches[i].padding < matches[j].padding
}
@@ -487,18 +541,29 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
continue
}
+ // late checks
+
avail := abi.PaddedPieceSize(ssize).Unpadded() - m.openSectors[mt.sector].used
if mt.size > avail {
continue
}
+ if m.openSectors[mt.sector].lastDealEnd > mt.claimTermEnd {
+ continue
+ }
+
+ // assign the piece!
+
err := m.openSectors[mt.sector].maybeAccept(mt.deal)
if err != nil {
m.pendingPieces[mt.deal].accepted(mt.sector.Number, 0, err) // non-error case in handleAddPiece
}
m.openSectors[mt.sector].used += mt.padding + mt.size
+ if mt.dealEnd > m.openSectors[mt.sector].lastDealEnd {
+ m.openSectors[mt.sector].lastDealEnd = mt.dealEnd
+ }
m.pendingPieces[mt.deal].assigned = true
delete(toAssign, mt.deal)
@@ -513,7 +578,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
if len(toAssign) > 0 {
log.Errorf("we are trying to create a new sector with open sectors %v", m.openSectors)
- if err := m.tryGetDealSector(ctx, sp, expF); err != nil {
+ if err := m.tryGetDealSector(ctx, sp, getExpirationCached); err != nil {
log.Errorw("Failed to create a new sector for deals", "error", err)
}
}
@@ -521,60 +586,108 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e
return nil
}
-func (m *Sealing) calcTargetExpiration(ctx context.Context, ssize abi.SectorSize) (minTarget, target abi.ChainEpoch, err error) {
- var candidates []*pendingPiece
+// pendingPieceIndex is an index in the Sealing.pendingPieces map
+type pendingPieceIndex cid.Cid
- for _, piece := range m.pendingPieces {
- if piece.assigned {
- continue // already assigned to a sector, skip
- }
- candidates = append(candidates, piece)
- }
+type pieceBound struct {
+ epoch abi.ChainEpoch
- // earliest expiration first
- sort.Slice(candidates, func(i, j int) bool {
- return candidates[i].deal.DealProposal.EndEpoch < candidates[j].deal.DealProposal.EndEpoch
- })
+ // boundStart marks deal /end/ epoch; only deals with boundStart lower or equal to expiration of a given sector can be
+ // put into that sector
+ boundStart []pendingPieceIndex
- var totalBytes uint64
- for _, candidate := range candidates {
- totalBytes += uint64(candidate.size)
+ // boundEnd marks deal claim TermMax; only deals with boundEnd higher or equal to expiration of a given sector can be
+ // put into that sector
+ boundEnd []pendingPieceIndex
- if totalBytes >= uint64(abi.PaddedPieceSize(ssize).Unpadded()) {
- return candidates[0].deal.DealProposal.EndEpoch, candidate.deal.DealProposal.EndEpoch, nil
- }
- }
-
- ts, err := m.Api.ChainHead(ctx)
- if err != nil {
- return 0, 0, xerrors.Errorf("getting current epoch: %w", err)
- }
-
- minDur, maxDur := policy.DealDurationBounds(0)
-
- return ts.Height() + minDur, ts.Height() + maxDur, nil
+ dealBytesInBound abi.UnpaddedPieceSize
}
-func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, ef expFn) (bool, error) {
+func (m *Sealing) pendingPieceEpochBounds() []pieceBound {
+ boundsByEpoch := map[abi.ChainEpoch]*pieceBound{}
+
+ for ppi, piece := range m.pendingPieces {
+ // start bound on deal end
+ if boundsByEpoch[piece.deal.DealProposal.EndEpoch] == nil {
+ boundsByEpoch[piece.deal.DealProposal.EndEpoch] = &pieceBound{
+ epoch: piece.deal.DealProposal.EndEpoch,
+ }
+ }
+ boundsByEpoch[piece.deal.DealProposal.EndEpoch].boundStart = append(boundsByEpoch[piece.deal.DealProposal.EndEpoch].boundStart, pendingPieceIndex(ppi))
+
+ // end bound on term max
+ if boundsByEpoch[piece.claimTerms.claimTermEnd] == nil {
+ boundsByEpoch[piece.claimTerms.claimTermEnd] = &pieceBound{
+ epoch: piece.claimTerms.claimTermEnd,
+ }
+ }
+ boundsByEpoch[piece.claimTerms.claimTermEnd].boundEnd = append(boundsByEpoch[piece.claimTerms.claimTermEnd].boundEnd, pendingPieceIndex(ppi))
+ }
+
+ out := make([]pieceBound, 0, len(boundsByEpoch))
+ for _, bound := range boundsByEpoch {
+ out = append(out, *bound)
+ }
+
+ sort.Slice(out, func(i, j int) bool {
+ return out[i].epoch < out[j].epoch
+ })
+
+ var curBoundBytes abi.UnpaddedPieceSize
+ for i, bound := range out {
+ for _, ppi := range bound.boundStart {
+ curBoundBytes += m.pendingPieces[cid.Cid(ppi)].size
+ }
+ for _, ppi := range bound.boundEnd {
+ curBoundBytes -= m.pendingPieces[cid.Cid(ppi)].size
+ }
+
+ out[i].dealBytesInBound = curBoundBytes
+ }
+
+ return out
+}
+
+func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealProof, cfg sealiface.Config, ef expFn) (bool, error) {
if len(m.available) == 0 {
return false, nil
}
+ ts, err := m.Api.ChainHead(ctx)
+ if err != nil {
+ return false, err
+ }
ssize, err := sp.SectorSize()
if err != nil {
- return false, xerrors.Errorf("getting sector size: %w", err)
+ return false, err
}
- minExpiration, targetExpiration, err := m.calcTargetExpiration(ctx, ssize)
- if err != nil {
- return false, xerrors.Errorf("calculating min target expiration: %w", err)
+
+ pieceBounds := m.pendingPieceEpochBounds()
+
+ findBound := func(sectorExp abi.ChainEpoch) *pieceBound {
+ if len(pieceBounds) == 0 {
+ return nil
+ }
+ f := sort.Search(len(pieceBounds), func(i int) bool {
+ return sectorExp <= pieceBounds[i].epoch
+ })
+ if f == 0 {
+ // all piece bounds are after sector expiration
+ return nil
+ }
+ return &pieceBounds[f-1]
}
+ targetExpirationEpoch := ts.Height() + abi.ChainEpoch(cfg.MinTargetUpgradeSectorExpiration)
+ minExpirationEpoch := ts.Height() + abi.ChainEpoch(cfg.MinUpgradeSectorExpiration)
+
var candidate abi.SectorID
var bestExpiration abi.ChainEpoch
+ var bestDealBytes abi.PaddedPieceSize
bestPledge := types.TotalFilecoinInt
for s := range m.available {
- expiration, pledge, err := ef(s.Number)
+ expirationEpoch, pledge, err := ef(s.Number)
if err != nil {
log.Errorw("checking sector expiration", "error", err)
continue
@@ -587,33 +700,58 @@ func (m *Sealing) maybeUpgradeSector(ctx context.Context, sp abi.RegisteredSealP
return false
}
if !active {
- log.Debugw("skipping available sector", "reason", "not active")
+ log.Debugw("skipping available sector", "sector", sid, "reason", "not active")
return false
}
return true
}
+ if expirationEpoch < minExpirationEpoch {
+ log.Debugw("skipping available sector", "sector", s.Number, "reason", "expiration below MinUpgradeSectorExpiration")
+ }
+
+ pb := findBound(expirationEpoch)
+ if pb == nil {
+ log.Debugw("skipping available sector", "sector", s.Number, "reason", "expiration below deal bounds")
+ continue
+ }
+
+ // if the sector has less than one sector worth of candidate deals, and
+ // the best candidate has more candidate deals, this sector isn't better
+ if pb.dealBytesInBound.Padded() < abi.PaddedPieceSize(ssize) {
+ if bestDealBytes > pb.dealBytesInBound.Padded() {
+ continue
+ }
+ }
+
// if best is below target, we want larger expirations
// if best is above target, we want lower pledge, but only if still above target
- if bestExpiration < targetExpiration {
- if expiration > bestExpiration && slowChecks(s.Number) {
- bestExpiration = expiration
+ // todo: after nv17 "target expiration" doesn't really make that much sense
+ // (tho to be fair it doesn't make too much sense now either)
+ // we probably want the lowest expiration that's still above the configured
+ // minimum, and can fit most candidate deals
+
+ if bestExpiration < targetExpirationEpoch {
+ if expirationEpoch > bestExpiration && slowChecks(s.Number) {
+ bestExpiration = expirationEpoch
bestPledge = pledge
+ bestDealBytes = pb.dealBytesInBound.Padded()
candidate = s
}
continue
}
- if expiration >= targetExpiration && pledge.LessThan(bestPledge) && slowChecks(s.Number) {
- bestExpiration = expiration
+ if expirationEpoch >= targetExpirationEpoch && pledge.LessThan(bestPledge) && slowChecks(s.Number) {
+ bestExpiration = expirationEpoch
bestPledge = pledge
+ bestDealBytes = pb.dealBytesInBound.Padded()
candidate = s
}
}
- if bestExpiration < minExpiration {
- log.Infow("Not upgrading any sectors", "available", len(m.available), "pieces", len(m.pendingPieces), "bestExp", bestExpiration, "target", targetExpiration, "min", minExpiration, "candidate", candidate)
+ if bestExpiration < minExpirationEpoch {
+ log.Infow("Not upgrading any sectors", "available", len(m.available), "pieces", len(m.pendingPieces), "bestExp", bestExpiration, "target", targetExpirationEpoch, "min", minExpirationEpoch, "candidate", candidate)
// didn't find a good sector / no sectors were available
return false, nil
}
@@ -682,7 +820,7 @@ func (m *Sealing) tryGetDealSector(ctx context.Context, sp abi.RegisteredSealPro
"shouldUpgrade", shouldUpgrade)
if shouldUpgrade {
- got, err := m.maybeUpgradeSector(ctx, sp, ef)
+ got, err := m.maybeUpgradeSector(ctx, sp, cfg, ef)
if err != nil {
return err
}
diff --git a/storage/pipeline/mocks/api.go b/storage/pipeline/mocks/api.go
index 4e0813194..066fe996e 100644
--- a/storage/pipeline/mocks/api.go
+++ b/storage/pipeline/mocks/api.go
@@ -15,7 +15,8 @@ import (
bitfield "github.com/filecoin-project/go-bitfield"
abi "github.com/filecoin-project/go-state-types/abi"
big "github.com/filecoin-project/go-state-types/big"
- miner "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ miner "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifreg "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
crypto "github.com/filecoin-project/go-state-types/crypto"
dline "github.com/filecoin-project/go-state-types/dline"
network "github.com/filecoin-project/go-state-types/network"
@@ -138,6 +139,21 @@ func (mr *MockSealingAPIMockRecorder) StateComputeDataCID(arg0, arg1, arg2, arg3
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateComputeDataCID", reflect.TypeOf((*MockSealingAPI)(nil).StateComputeDataCID), arg0, arg1, arg2, arg3, arg4)
}
+// StateGetAllocationForPendingDeal mocks base method.
+func (m *MockSealingAPI) StateGetAllocationForPendingDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*verifreg.Allocation, error) {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "StateGetAllocationForPendingDeal", arg0, arg1, arg2)
+ ret0, _ := ret[0].(*verifreg.Allocation)
+ ret1, _ := ret[1].(error)
+ return ret0, ret1
+}
+
+// StateGetAllocationForPendingDeal indicates an expected call of StateGetAllocationForPendingDeal.
+func (mr *MockSealingAPIMockRecorder) StateGetAllocationForPendingDeal(arg0, arg1, arg2 interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocationForPendingDeal", reflect.TypeOf((*MockSealingAPI)(nil).StateGetAllocationForPendingDeal), arg0, arg1, arg2)
+}
+
// StateGetRandomnessFromBeacon mocks base method.
func (m *MockSealingAPI) StateGetRandomnessFromBeacon(arg0 context.Context, arg1 crypto.DomainSeparationTag, arg2 abi.ChainEpoch, arg3 []byte, arg4 types.TipSetKey) (abi.Randomness, error) {
m.ctrl.T.Helper()
diff --git a/storage/pipeline/mocks/mock_commit_batcher.go b/storage/pipeline/mocks/mock_commit_batcher.go
index d61fde912..c4e7e3eef 100644
--- a/storage/pipeline/mocks/mock_commit_batcher.go
+++ b/storage/pipeline/mocks/mock_commit_batcher.go
@@ -13,7 +13,7 @@ import (
address "github.com/filecoin-project/go-address"
abi "github.com/filecoin-project/go-state-types/abi"
big "github.com/filecoin-project/go-state-types/big"
- miner "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ miner "github.com/filecoin-project/go-state-types/builtin/v9/miner"
network "github.com/filecoin-project/go-state-types/network"
api "github.com/filecoin-project/lotus/api"
diff --git a/storage/pipeline/precommit_batch.go b/storage/pipeline/precommit_batch.go
index d0de68daa..6ee6aed93 100644
--- a/storage/pipeline/precommit_batch.go
+++ b/storage/pipeline/precommit_batch.go
@@ -14,7 +14,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/api"
@@ -280,14 +280,15 @@ func (b *PreCommitBatcher) processIndividually(cfg sealiface.Config) ([]sealifac
return res, nil
}
-func (b *PreCommitBatcher) processSingle(cfg sealiface.Config, mi api.MinerInfo, avail *abi.TokenAmount, params *preCommitEntry) (cid.Cid, error) {
+func (b *PreCommitBatcher) processSingle(cfg sealiface.Config, mi api.MinerInfo, avail *abi.TokenAmount, entry *preCommitEntry) (cid.Cid, error) {
+ msgParams := infoToPreCommitSectorParams(entry.pci)
enc := new(bytes.Buffer)
- if err := params.pci.MarshalCBOR(enc); err != nil {
+ if err := msgParams.MarshalCBOR(enc); err != nil {
return cid.Undef, xerrors.Errorf("marshaling precommit params: %w", err)
}
- deposit := params.deposit
+ deposit := entry.deposit
if cfg.CollateralFromMinerBalance {
c := big.Sub(deposit, *avail)
*avail = big.Sub(*avail, deposit)
@@ -328,7 +329,7 @@ func (b *PreCommitBatcher) processBatch(cfg sealiface.Config, tsk types.TipSetKe
}
res.Sectors = append(res.Sectors, p.pci.SectorNumber)
- params.Sectors = append(params.Sectors, *p.pci)
+ params.Sectors = append(params.Sectors, *infoToPreCommitSectorParams(p.pci))
deposit = big.Add(deposit, p.deposit)
}
diff --git a/storage/pipeline/precommit_batch_test.go b/storage/pipeline/precommit_batch_test.go
index 735474f07..1779128bd 100644
--- a/storage/pipeline/precommit_batch_test.go
+++ b/storage/pipeline/precommit_batch_test.go
@@ -15,7 +15,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/network"
miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner"
diff --git a/storage/pipeline/precommit_policy.go b/storage/pipeline/precommit_policy.go
index e0761d209..04f69a93a 100644
--- a/storage/pipeline/precommit_policy.go
+++ b/storage/pipeline/precommit_policy.go
@@ -9,6 +9,7 @@ import (
"github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/go-state-types/network"
+ "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/types"
@@ -16,7 +17,7 @@ import (
)
type PreCommitPolicy interface {
- Expiration(ctx context.Context, ps ...Piece) (abi.ChainEpoch, error)
+ Expiration(ctx context.Context, ps ...api.SectorPiece) (abi.ChainEpoch, error)
}
type Chain interface {
@@ -59,7 +60,7 @@ func NewBasicPreCommitPolicy(api Chain, cfgGetter dtypes.GetSealingConfigFunc, p
// Expiration produces the pre-commit sector expiration epoch for an encoded
// replica containing the provided enumeration of pieces and deals.
-func (p *BasicPreCommitPolicy) Expiration(ctx context.Context, ps ...Piece) (abi.ChainEpoch, error) {
+func (p *BasicPreCommitPolicy) Expiration(ctx context.Context, ps ...api.SectorPiece) (abi.ChainEpoch, error) {
ts, err := p.api.ChainHead(ctx)
if err != nil {
return 0, err
diff --git a/storage/pipeline/precommit_policy_test.go b/storage/pipeline/precommit_policy_test.go
index 5d2da1ee0..9f23e58d6 100644
--- a/storage/pipeline/precommit_policy_test.go
+++ b/storage/pipeline/precommit_policy_test.go
@@ -44,7 +44,7 @@ func fakeConfigGetter(stub *fakeConfigStub) dtypes.GetSealingConfigFunc {
}
func (f *fakeChain) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) {
- return build.NewestNetworkVersion, nil
+ return build.TestNetworkVersion, nil
}
func (f *fakeChain) ChainHead(ctx context.Context) (*types.TipSet, error) {
@@ -95,7 +95,7 @@ func TestBasicPolicyMostConstrictiveSchedule(t *testing.T) {
h: abi.ChainEpoch(55),
}, cfg, 2)
longestDealEpochEnd := abi.ChainEpoch(547300)
- pieces := []pipeline.Piece{
+ pieces := []api.SectorPiece{
{
Piece: abi.PieceInfo{
Size: abi.PaddedPieceSize(1024),
@@ -136,7 +136,7 @@ func TestBasicPolicyIgnoresExistingScheduleIfExpired(t *testing.T) {
h: abi.ChainEpoch(55),
}, cfg, 0)
- pieces := []pipeline.Piece{
+ pieces := []api.SectorPiece{
{
Piece: abi.PieceInfo{
Size: abi.PaddedPieceSize(1024),
@@ -165,7 +165,7 @@ func TestMissingDealIsIgnored(t *testing.T) {
h: abi.ChainEpoch(55),
}, cfg, 0)
- pieces := []pipeline.Piece{
+ pieces := []api.SectorPiece{
{
Piece: abi.PieceInfo{
Size: abi.PaddedPieceSize(1024),
diff --git a/storage/pipeline/receive.go b/storage/pipeline/receive.go
new file mode 100644
index 000000000..b1b0ce99f
--- /dev/null
+++ b/storage/pipeline/receive.go
@@ -0,0 +1,304 @@
+package sealing
+
+import (
+ "bytes"
+ "context"
+ "net/url"
+
+ "github.com/ipfs/go-cid"
+ "github.com/ipfs/go-datastore"
+ "github.com/multiformats/go-multihash"
+ "golang.org/x/xerrors"
+
+ "github.com/filecoin-project/go-address"
+ "github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/go-state-types/crypto"
+ "github.com/filecoin-project/go-state-types/proof"
+ "github.com/filecoin-project/go-statemachine"
+
+ "github.com/filecoin-project/lotus/api"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
+)
+
+func (m *Sealing) Receive(ctx context.Context, meta api.RemoteSectorMeta) error {
+ m.inputLk.Lock()
+ defer m.inputLk.Unlock()
+
+ si, err := m.checkSectorMeta(ctx, meta)
+ if err != nil {
+ return err
+ }
+
+ exists, err := m.sectors.Has(uint64(meta.Sector.Number))
+ if err != nil {
+ return xerrors.Errorf("checking if sector exists: %w", err)
+ }
+ if exists {
+ return xerrors.Errorf("sector %d state already exists", meta.Sector.Number)
+ }
+
+ err = m.sectors.Send(uint64(meta.Sector.Number), SectorReceive{
+ State: si,
+ })
+ if err != nil {
+ return xerrors.Errorf("receiving sector: %w", err)
+ }
+
+ return nil
+}
+
+func (m *Sealing) checkSectorMeta(ctx context.Context, meta api.RemoteSectorMeta) (SectorInfo, error) {
+ {
+ mid, err := address.IDFromAddress(m.maddr)
+ if err != nil {
+ panic(err)
+ }
+
+ if meta.Sector.Miner != abi.ActorID(mid) {
+ return SectorInfo{}, xerrors.Errorf("sector for wrong actor - expected actor id %d, sector was for actor %d", mid, meta.Sector.Miner)
+ }
+ }
+
+ {
+ // initial sanity check, doesn't prevent races
+ _, err := m.GetSectorInfo(meta.Sector.Number)
+ if err != nil && !xerrors.Is(err, datastore.ErrNotFound) {
+ return SectorInfo{}, err
+ }
+ if err == nil {
+ return SectorInfo{}, xerrors.Errorf("sector with ID %d already exists in the sealing pipeline", meta.Sector.Number)
+ }
+ }
+
+ {
+ spt, err := m.currentSealProof(ctx)
+ if err != nil {
+ return SectorInfo{}, err
+ }
+
+ if meta.Type != spt {
+ return SectorInfo{}, xerrors.Errorf("sector seal proof type doesn't match current seal proof type (%d!=%d)", meta.Type, spt)
+ }
+ }
+
+ ts, err := m.Api.ChainHead(ctx)
+ if err != nil {
+ return SectorInfo{}, xerrors.Errorf("getting chain head: %w", err)
+ }
+
+ var info SectorInfo
+ var validatePoRep bool
+
+ switch SectorState(meta.State) {
+ case Proving, Available:
+ if meta.CommitMessage != nil {
+ if err := checkMessagePrefix(*meta.CommitMessage); err != nil {
+ return SectorInfo{}, xerrors.Errorf("commit message prefix: %w", err)
+ }
+
+ info.CommitMessage = meta.CommitMessage
+ }
+
+ fallthrough
+ case SubmitCommit:
+ if meta.PreCommitDeposit == nil {
+ return SectorInfo{}, xerrors.Errorf("sector PreCommitDeposit was null")
+ }
+
+ info.PreCommitDeposit = *meta.PreCommitDeposit
+ info.PreCommitTipSet = meta.PreCommitTipSet
+ if info.PreCommitMessage != nil {
+ if err := checkMessagePrefix(*meta.PreCommitMessage); err != nil {
+ return SectorInfo{}, xerrors.Errorf("commit message prefix: %w", err)
+ }
+ info.PreCommitMessage = meta.PreCommitMessage
+ }
+
+ // check provided seed
+ if len(meta.SeedValue) != abi.RandomnessLength {
+ return SectorInfo{}, xerrors.Errorf("seed randomness had wrong length %d", len(meta.SeedValue))
+ }
+
+ maddrBuf := new(bytes.Buffer)
+ if err := m.maddr.MarshalCBOR(maddrBuf); err != nil {
+ return SectorInfo{}, xerrors.Errorf("marshal miner address for seed check: %w", err)
+ }
+ rand, err := m.Api.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_InteractiveSealChallengeSeed, meta.SeedEpoch, maddrBuf.Bytes(), ts.Key())
+ if err != nil {
+ return SectorInfo{}, xerrors.Errorf("generating check seed: %w", err)
+ }
+ if !bytes.Equal(rand, meta.SeedValue) {
+ return SectorInfo{}, xerrors.Errorf("provided(%x) and generated(%x) seeds differ", meta.SeedValue, rand)
+ }
+
+ info.SeedValue = meta.SeedValue
+ info.SeedEpoch = meta.SeedEpoch
+
+ info.Proof = meta.CommitProof
+ validatePoRep = true
+
+ fallthrough
+ case PreCommitting:
+ // check provided ticket
+ if len(meta.TicketValue) != abi.RandomnessLength {
+ return SectorInfo{}, xerrors.Errorf("ticket randomness had wrong length %d", len(meta.TicketValue))
+ }
+
+ maddrBuf := new(bytes.Buffer)
+ if err := m.maddr.MarshalCBOR(maddrBuf); err != nil {
+ return SectorInfo{}, xerrors.Errorf("marshal miner address for ticket check: %w", err)
+ }
+ rand, err := m.Api.StateGetRandomnessFromTickets(ctx, crypto.DomainSeparationTag_SealRandomness, meta.TicketEpoch, maddrBuf.Bytes(), ts.Key())
+ if err != nil {
+ return SectorInfo{}, xerrors.Errorf("generating check ticket: %w", err)
+ }
+ if !bytes.Equal(rand, meta.TicketValue) {
+ return SectorInfo{}, xerrors.Errorf("provided(%x) and generated(%x) tickets differ", meta.TicketValue, rand)
+ }
+
+ info.TicketValue = meta.TicketValue
+ info.TicketEpoch = meta.TicketEpoch
+
+ info.PreCommit1Out = meta.PreCommit1Out
+
+ // check CommD/R
+ if meta.CommD == nil || meta.CommR == nil {
+ return SectorInfo{}, xerrors.Errorf("both CommR/CommD cids need to be set for sectors in PreCommitting and later states")
+ }
+
+ dp := meta.CommD.Prefix()
+ if dp.Version != 1 || dp.Codec != cid.FilCommitmentUnsealed || dp.MhType != multihash.SHA2_256_TRUNC254_PADDED || dp.MhLength != 32 {
+ return SectorInfo{}, xerrors.Errorf("CommD cid has wrong prefix")
+ }
+
+ rp := meta.CommR.Prefix()
+ if rp.Version != 1 || rp.Codec != cid.FilCommitmentSealed || rp.MhType != multihash.POSEIDON_BLS12_381_A1_FC1 || rp.MhLength != 32 {
+ return SectorInfo{}, xerrors.Errorf("CommR cid has wrong prefix")
+ }
+
+ info.CommD = meta.CommD
+ info.CommR = meta.CommR
+
+ if meta.DataSealed == nil {
+ return SectorInfo{}, xerrors.Errorf("expected DataSealed to be set")
+ }
+ if meta.DataCache == nil {
+ return SectorInfo{}, xerrors.Errorf("expected DataCache to be set")
+ }
+ info.RemoteDataSealed = meta.DataSealed // todo make head requests to check?
+ info.RemoteDataCache = meta.DataCache
+
+ if meta.RemoteCommit1Endpoint != "" {
+ // validate the url
+ if _, err := url.Parse(meta.RemoteCommit1Endpoint); err != nil {
+ return SectorInfo{}, xerrors.Errorf("parsing remote c1 endpoint url: %w", err)
+ }
+
+ info.RemoteCommit1Endpoint = meta.RemoteCommit1Endpoint
+ }
+
+ if meta.RemoteCommit2Endpoint != "" {
+ // validate the url
+ if _, err := url.Parse(meta.RemoteCommit2Endpoint); err != nil {
+ return SectorInfo{}, xerrors.Errorf("parsing remote c2 endpoint url: %w", err)
+ }
+
+ info.RemoteCommit2Endpoint = meta.RemoteCommit2Endpoint
+ }
+
+ // If we get a sector after PC2, and remote C1 endpoint is set, assume that we're getting finalized sector data
+ if info.RemoteCommit1Endpoint != "" {
+ info.RemoteDataFinalized = true
+ }
+
+ fallthrough
+ case GetTicket, Packing:
+ info.Return = ReturnState(meta.State)
+ info.State = ReceiveSector
+
+ info.SectorNumber = meta.Sector.Number
+ info.Pieces = meta.Pieces
+ info.SectorType = meta.Type
+
+ if meta.RemoteSealingDoneEndpoint != "" {
+ // validate the url
+ if _, err := url.Parse(meta.RemoteSealingDoneEndpoint); err != nil {
+ return SectorInfo{}, xerrors.Errorf("parsing remote sealing-done endpoint url: %w", err)
+ }
+
+ info.RemoteSealingDoneEndpoint = meta.RemoteSealingDoneEndpoint
+ }
+
+ if err := checkPieces(ctx, m.maddr, meta.Sector.Number, meta.Pieces, m.Api, false); err != nil {
+ return SectorInfo{}, xerrors.Errorf("checking pieces: %w", err)
+ }
+
+ if meta.DataUnsealed == nil {
+ return SectorInfo{}, xerrors.Errorf("expected DataUnsealed to be set")
+ }
+ info.RemoteDataUnsealed = meta.DataUnsealed
+
+ // some late checks which require previous checks
+ if validatePoRep {
+ ok, err := m.verif.VerifySeal(proof.SealVerifyInfo{
+ SealProof: meta.Type,
+ SectorID: meta.Sector,
+ DealIDs: nil,
+ Randomness: meta.TicketValue,
+ InteractiveRandomness: meta.SeedValue,
+ Proof: meta.CommitProof,
+ SealedCID: *meta.CommR,
+ UnsealedCID: *meta.CommD,
+ })
+ if err != nil {
+ return SectorInfo{}, xerrors.Errorf("validating seal proof: %w", err)
+ }
+ if !ok {
+ return SectorInfo{}, xerrors.Errorf("seal proof invalid")
+ }
+ }
+
+ return info, nil
+ default:
+ return SectorInfo{}, xerrors.Errorf("imported sector State in not supported")
+ }
+}
+
+func (m *Sealing) handleReceiveSector(ctx statemachine.Context, sector SectorInfo) error {
+ toFetch := map[storiface.SectorFileType]storiface.SectorLocation{}
+
+ for fileType, data := range map[storiface.SectorFileType]*storiface.SectorLocation{
+ storiface.FTUnsealed: sector.RemoteDataUnsealed,
+ storiface.FTSealed: sector.RemoteDataSealed,
+ storiface.FTCache: sector.RemoteDataCache,
+ } {
+ if data == nil {
+ continue
+ }
+
+ if data.Local {
+ // todo check exists
+ continue
+ }
+
+ toFetch[fileType] = *data
+ }
+
+ if len(toFetch) > 0 {
+ if err := m.sealer.DownloadSectorData(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber), sector.RemoteDataFinalized, toFetch); err != nil {
+ return xerrors.Errorf("downloading sector data: %w", err) // todo send err event
+ }
+ }
+
+ // todo data checks?
+
+ return ctx.Send(SectorReceived{})
+}
+
+func checkMessagePrefix(c cid.Cid) error {
+ p := c.Prefix()
+ if p.Version != 1 || p.MhLength != 32 || p.MhType != multihash.BLAKE2B_MIN+31 || p.Codec != cid.DagCBOR {
+ return xerrors.New("invalid message prefix")
+ }
+ return nil
+}
diff --git a/storage/pipeline/sealiface/config.go b/storage/pipeline/sealiface/config.go
index 0470db38e..2db155d5c 100644
--- a/storage/pipeline/sealiface/config.go
+++ b/storage/pipeline/sealiface/config.go
@@ -20,6 +20,10 @@ type Config struct {
PreferNewSectorsForDeals bool
+ MinUpgradeSectorExpiration uint64
+
+ MinTargetUpgradeSectorExpiration uint64
+
MaxUpgradingSectors uint64
MakeNewSectorForDeals bool
diff --git a/storage/pipeline/sealing.go b/storage/pipeline/sealing.go
index 8a1540d34..0fadb6131 100644
--- a/storage/pipeline/sealing.go
+++ b/storage/pipeline/sealing.go
@@ -15,7 +15,8 @@ import (
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
+ verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/go-state-types/network"
@@ -69,6 +70,7 @@ type SealingAPI interface {
StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error)
ChainReadObj(context.Context, cid.Cid) ([]byte, error)
StateMinerAllocated(context.Context, address.Address, types.TipSetKey) (*bitfield.BitField, error)
+ StateGetAllocationForPendingDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*verifregtypes.Allocation, error)
// Address selector
WalletBalance(context.Context, address.Address) (types.BigInt, error)
@@ -131,22 +133,59 @@ type Sealing struct {
}
type openSector struct {
- used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors
- number abi.SectorNumber
- ccUpdate bool
+ used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors
+ lastDealEnd abi.ChainEpoch
+ number abi.SectorNumber
+ ccUpdate bool
maybeAccept func(cid.Cid) error // called with inputLk
}
-func (o *openSector) dealFitsInLifetime(dealEnd abi.ChainEpoch, expF expFn) (bool, error) {
+func (o *openSector) checkDealAssignable(piece *pendingPiece, expF expFn) (bool, error) {
+ log := log.With(
+ "sector", o.number,
+
+ "deal", piece.deal.DealID,
+ "dealEnd", piece.deal.DealProposal.EndEpoch,
+ "dealStart", piece.deal.DealProposal.StartEpoch,
+ "dealClaimEnd", piece.claimTerms.claimTermEnd,
+
+ "lastAssignedDealEnd", o.lastDealEnd,
+ "update", o.ccUpdate,
+ )
+
+ // if there are deals assigned, check that no assigned deal expires after termMax
+ if o.lastDealEnd > piece.claimTerms.claimTermEnd {
+ log.Debugw("deal not assignable to sector", "reason", "term end beyond last assigned deal end")
+ return false, nil
+ }
+
+ // check that in case of upgrade sectors, sector expiration is at least deal expiration
if !o.ccUpdate {
return true, nil
}
- expiration, _, err := expF(o.number)
+ sectorExpiration, _, err := expF(o.number)
if err != nil {
+ log.Debugw("deal not assignable to sector", "reason", "error getting sector expiranion", "error", err)
return false, err
}
- return expiration >= dealEnd, nil
+
+ log = log.With(
+ "sectorExpiration", sectorExpiration,
+ )
+
+ // check that in case of upgrade sector, it's expiration isn't above deals claim TermMax
+ if sectorExpiration > piece.claimTerms.claimTermEnd {
+ log.Debugw("deal not assignable to sector", "reason", "term end beyond sector expiration")
+ return false, nil
+ }
+
+ if sectorExpiration < piece.deal.DealProposal.EndEpoch {
+ log.Debugw("deal not assignable to sector", "reason", "sector expiration less than deal expiration")
+ return false, nil
+ }
+
+ return true, nil
}
type pieceAcceptResp struct {
@@ -155,6 +194,11 @@ type pieceAcceptResp struct {
err error
}
+type pieceClaimBounds struct {
+ // dealStart + termMax
+ claimTermEnd abi.ChainEpoch
+}
+
type pendingPiece struct {
doneCh chan struct{}
resp *pieceAcceptResp
@@ -162,6 +206,8 @@ type pendingPiece struct {
size abi.UnpaddedPieceSize
deal api.PieceDealInfo
+ claimTerms pieceClaimBounds
+
data storiface.Data
assigned bool // assigned to a sector?
diff --git a/storage/pipeline/sector_state.go b/storage/pipeline/sector_state.go
index 4f81f5544..84c08f43b 100644
--- a/storage/pipeline/sector_state.go
+++ b/storage/pipeline/sector_state.go
@@ -31,6 +31,7 @@ var ExistSectorStateList = map[SectorState]struct{}{
SealPreCommit2Failed: {},
PreCommitFailed: {},
ComputeProofFailed: {},
+ RemoteCommitFailed: {},
CommitFailed: {},
PackingFailed: {},
FinalizeFailed: {},
@@ -52,6 +53,7 @@ var ExistSectorStateList = map[SectorState]struct{}{
UpdateReplica: {},
ProveReplicaUpdate: {},
SubmitReplicaUpdate: {},
+ WaitMutable: {},
ReplicaUpdateWait: {},
UpdateActivating: {},
ReleaseSectorKey: {},
@@ -63,6 +65,7 @@ var ExistSectorStateList = map[SectorState]struct{}{
ReleaseSectorKeyFailed: {},
FinalizeReplicaUpdateFailed: {},
AbortUpgrade: {},
+ ReceiveSector: {},
}
// cmd/lotus-miner/info.go defines CLI colors corresponding to these states
@@ -108,11 +111,15 @@ const (
UpdateReplica SectorState = "UpdateReplica"
ProveReplicaUpdate SectorState = "ProveReplicaUpdate"
SubmitReplicaUpdate SectorState = "SubmitReplicaUpdate"
+ WaitMutable SectorState = "WaitMutable"
ReplicaUpdateWait SectorState = "ReplicaUpdateWait"
FinalizeReplicaUpdate SectorState = "FinalizeReplicaUpdate"
UpdateActivating SectorState = "UpdateActivating"
ReleaseSectorKey SectorState = "ReleaseSectorKey"
+ // external import
+ ReceiveSector SectorState = "ReceiveSector"
+
// error modes
FailedUnrecoverable SectorState = "FailedUnrecoverable"
AddPieceFailed SectorState = "AddPieceFailed"
@@ -120,6 +127,7 @@ const (
SealPreCommit2Failed SectorState = "SealPreCommit2Failed"
PreCommitFailed SectorState = "PreCommitFailed"
ComputeProofFailed SectorState = "ComputeProofFailed"
+ RemoteCommitFailed SectorState = "RemoteCommitFailed"
CommitFailed SectorState = "CommitFailed"
PackingFailed SectorState = "PackingFailed" // TODO: deprecated, remove
FinalizeFailed SectorState = "FinalizeFailed"
@@ -153,9 +161,9 @@ func toStatState(st SectorState, finEarly bool) statSectorState {
switch st {
case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed, SnapDealsWaitDeals, SnapDealsAddPiece:
return sstStaging
- case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector, SnapDealsPacking, UpdateReplica, ProveReplicaUpdate, FinalizeReplicaUpdate:
+ case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector, SnapDealsPacking, UpdateReplica, ProveReplicaUpdate, FinalizeReplicaUpdate, ReceiveSector:
return sstSealing
- case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait, SubmitReplicaUpdate, ReplicaUpdateWait:
+ case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait, WaitMutable, SubmitReplicaUpdate, ReplicaUpdateWait:
if finEarly {
// we use statSectorState for throttling storage use. With FinalizeEarly
// we can consider sectors in states after CommitFinalize as finalized, so
@@ -178,6 +186,7 @@ func IsUpgradeState(st SectorState) bool {
UpdateReplica,
ProveReplicaUpdate,
SubmitReplicaUpdate,
+ WaitMutable,
SnapDealsAddPieceFailed,
SnapDealsDealsExpired,
diff --git a/storage/pipeline/states_failed.go b/storage/pipeline/states_failed.go
index c57bef61b..d952d8eda 100644
--- a/storage/pipeline/states_failed.go
+++ b/storage/pipeline/states_failed.go
@@ -10,21 +10,22 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-commp-utils/zerocomm"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-statemachine"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
"github.com/filecoin-project/lotus/chain/types"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
-const minRetryTime = 1 * time.Minute
+var MinRetryTime = 1 * time.Minute
func failedCooldown(ctx statemachine.Context, sector SectorInfo) error {
// TODO: Exponential backoff when we see consecutive failures
- retryStart := time.Unix(int64(sector.Log[len(sector.Log)-1].Timestamp), 0).Add(minRetryTime)
+ retryStart := time.Unix(int64(sector.Log[len(sector.Log)-1].Timestamp), 0).Add(MinRetryTime)
if len(sector.Log) > 0 && !time.Now().After(retryStart) {
log.Infof("%s(%d), waiting %s before retrying", sector.State, sector.SectorNumber, time.Until(retryStart))
select {
@@ -184,6 +185,18 @@ func (m *Sealing) handleComputeProofFailed(ctx statemachine.Context, sector Sect
return ctx.Send(SectorRetryComputeProof{})
}
+func (m *Sealing) handleRemoteCommitFailed(ctx statemachine.Context, sector SectorInfo) error {
+ if err := failedCooldown(ctx, sector); err != nil {
+ return err
+ }
+
+ if sector.InvalidProofs > 1 {
+ log.Errorw("consecutive remote commit fails", "sector", sector.SectorNumber, "c1url", sector.RemoteCommit1Endpoint, "c2url", sector.RemoteCommit2Endpoint)
+ }
+
+ return ctx.Send(SectorRetryComputeProof{})
+}
+
func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sector SectorInfo) error {
if err := failedCooldown(ctx, sector); err != nil {
return err
@@ -245,8 +258,9 @@ func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sect
return nil
}
if !active {
- log.Errorf("sector marked for upgrade %d no longer active, aborting upgrade", sector.SectorNumber)
- return ctx.Send(SectorAbortUpgrade{})
+ err := xerrors.Errorf("sector marked for upgrade %d no longer active, aborting upgrade", sector.SectorNumber)
+ log.Errorf(err.Error())
+ return ctx.Send(SectorAbortUpgrade{err})
}
return ctx.Send(SectorRetrySubmitReplicaUpdate{})
@@ -391,11 +405,6 @@ func (m *Sealing) handleDealsExpired(ctx statemachine.Context, sector SectorInfo
return xerrors.Errorf("sector is committed on-chain, but we're in DealsExpired")
}
- if sector.PreCommitInfo == nil {
- // TODO: Create a separate state which will remove those pieces, and go back to PC1
- log.Errorf("non-precommitted sector with expired deals, can't recover from this yet")
- }
-
// Not much to do here, we can't go back in time to commit this sector
return ctx.Send(SectorRemove{})
}
@@ -414,17 +423,22 @@ func (m *Sealing) handleAbortUpgrade(ctx statemachine.Context, sector SectorInfo
return xerrors.Errorf("should never reach AbortUpgrade as a non-CCUpdate sector")
}
+ m.cleanupAssignedDeals(sector)
+
// Remove snap deals replica if any
+ // This removes update / update-cache from all storage
if err := m.sealer.ReleaseReplicaUpgrade(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil {
return xerrors.Errorf("removing CC update files from sector storage")
}
- cfg, err := m.getConfig()
- if err != nil {
- return xerrors.Errorf("getting sealing config: %w", err)
+ // This removes the unsealed file from all storage
+ // note: we're not keeping anything unsealed because we're reverting to CC
+ if err := m.sealer.ReleaseUnsealed(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber), []storiface.Range{}); err != nil {
+ log.Error(err)
}
- if err := m.sealer.ReleaseUnsealed(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber), sector.keepUnsealedRanges(sector.CCPieces, true, cfg.AlwaysKeepUnsealedCopy)); err != nil {
+ // and makes sure sealed/cache files only exist in long-term-storage
+ if err := m.sealer.FinalizeSector(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil {
log.Error(err)
}
diff --git a/storage/pipeline/states_failed_test.go b/storage/pipeline/states_failed_test.go
index 0243af126..f6846c8f5 100644
--- a/storage/pipeline/states_failed_test.go
+++ b/storage/pipeline/states_failed_test.go
@@ -76,7 +76,7 @@ func TestStateRecoverDealIDs(t *testing.T) {
// TODO sctx should satisfy an interface so it can be useable for mocking. This will fail because we are passing in an empty context now to get this to build.
// https://github.com/filecoin-project/lotus/issues/7867
err := fakeSealing.HandleRecoverDealIDs(statemachine.Context{}, pipeline.SectorInfo{
- Pieces: []pipeline.Piece{
+ Pieces: []api2.SectorPiece{
{
DealInfo: &api2.PieceDealInfo{
DealID: dealId,
diff --git a/storage/pipeline/states_proving.go b/storage/pipeline/states_proving.go
index f4b957249..bed61a452 100644
--- a/storage/pipeline/states_proving.go
+++ b/storage/pipeline/states_proving.go
@@ -138,6 +138,12 @@ func (m *Sealing) handleProvingSector(ctx statemachine.Context, sector SectorInf
delete(m.available, m.minerSectorID(sector.SectorNumber))
m.inputLk.Unlock()
+ // guard against manual state updates from snap-deals states into Proving
+ // note: normally snap deals should be aborted through the abort command, but
+ // apparently sometimes some SPs would use update-state to force the sector back
+ // into the Proving state, breaking the deal input pipeline in the process.
+ m.cleanupAssignedDeals(sector)
+
// TODO: Watch termination
// TODO: Auto-extend if set
diff --git a/storage/pipeline/states_replica_update.go b/storage/pipeline/states_replica_update.go
index 3392b92e7..e1b9cfc30 100644
--- a/storage/pipeline/states_replica_update.go
+++ b/storage/pipeline/states_replica_update.go
@@ -10,7 +10,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-statemachine"
@@ -21,7 +21,12 @@ import (
)
func (m *Sealing) handleReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error {
- if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api, true); err != nil { // Sanity check state
+ // if the sector ended up not having any deals, abort the upgrade
+ if !sector.hasDeals() {
+ return ctx.Send(SectorAbortUpgrade{xerrors.New("sector had no deals")})
+ }
+
+ if err := checkPieces(ctx.Context(), m.maddr, sector.SectorNumber, sector.Pieces, m.Api, true); err != nil { // Sanity check state
return handleErrors(ctx, err, sector)
}
out, err := m.sealer.ReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.pieceInfos())
@@ -52,8 +57,9 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect
return nil
}
if !active {
- log.Errorf("sector marked for upgrade %d no longer active, aborting upgrade", sector.SectorNumber)
- return ctx.Send(SectorAbortUpgrade{})
+ err := xerrors.Errorf("sector marked for upgrade %d no longer active, aborting upgrade", sector.SectorNumber)
+ log.Errorf(err.Error())
+ return ctx.Send(SectorAbortUpgrade{err})
}
vanillaProofs, err := m.sealer.ProveReplicaUpdate1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed)
@@ -61,7 +67,7 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect
return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (1) failed: %w", err)})
}
- if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api, true); err != nil { // Sanity check state
+ if err := checkPieces(ctx.Context(), m.maddr, sector.SectorNumber, sector.Pieces, m.Api, true); err != nil { // Sanity check state
return handleErrors(ctx, err, sector)
}
@@ -92,6 +98,17 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec
log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err)
return nil
}
+
+ dlinfo, err := m.Api.StateMinerProvingDeadline(ctx.Context(), m.maddr, ts.Key())
+ if err != nil {
+ log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %w", err)
+ }
+ // if sector's deadline is immutable wait in a non error state
+ // sector's deadline is immutable if it is the current deadline or the next deadline
+ if sl.Deadline == dlinfo.Index || (dlinfo.Index+1)%dlinfo.WPoStPeriodDeadlines == sl.Deadline {
+ return ctx.Send(SectorDeadlineImmutable{})
+ }
+
updateProof, err := sector.SectorType.RegisteredUpdateProof()
if err != nil {
log.Errorf("failed to get update proof type from seal proof: %+v", err)
@@ -126,6 +143,10 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec
log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err)
return nil
}
+ if onChainInfo == nil {
+ return xerrors.Errorf("sector not found %d", sector.SectorNumber)
+ }
+
sp, err := m.currentSealProof(ctx.Context())
if err != nil {
log.Errorf("sealer failed to return current seal proof not proceeding: %+v", err)
@@ -182,6 +203,67 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec
return ctx.Send(SectorReplicaUpdateSubmitted{Message: mcid})
}
+func (m *Sealing) handleWaitMutable(ctx statemachine.Context, sector SectorInfo) error {
+ immutable := true
+ for immutable {
+ ts, err := m.Api.ChainHead(ctx.Context())
+ if err != nil {
+ log.Errorf("handleWaitMutable: api error, not proceeding: %+v", err)
+ return nil
+ }
+
+ sl, err := m.Api.StateSectorPartition(ctx.Context(), m.maddr, sector.SectorNumber, ts.Key())
+ if err != nil {
+ log.Errorf("handleWaitMutable: api error, not proceeding: %+v", err)
+ return nil
+ }
+
+ dlinfo, err := m.Api.StateMinerProvingDeadline(ctx.Context(), m.maddr, ts.Key())
+ if err != nil {
+ log.Errorf("handleWaitMutable: api error, not proceeding: %w", err)
+ return nil
+ }
+
+ sectorDeadlineOpen := sl.Deadline == dlinfo.Index
+ sectorDeadlineNext := (dlinfo.Index+1)%dlinfo.WPoStPeriodDeadlines == sl.Deadline
+ immutable = sectorDeadlineOpen || sectorDeadlineNext
+
+ // Sleep for immutable epochs
+ if immutable {
+ dlineEpochsRemaining := dlinfo.NextOpen() - ts.Height()
+ var targetEpoch abi.ChainEpoch
+ if sectorDeadlineOpen {
+ // sleep for remainder of deadline
+ targetEpoch = ts.Height() + dlineEpochsRemaining
+ } else {
+ // sleep for remainder of deadline and next one
+ targetEpoch = ts.Height() + dlineEpochsRemaining + dlinfo.WPoStChallengeWindow
+ }
+
+ atHeight := make(chan struct{})
+ err := m.events.ChainAt(ctx.Context(), func(context.Context, *types.TipSet, abi.ChainEpoch) error {
+ close(atHeight)
+ return nil
+ }, func(ctx context.Context, ts *types.TipSet) error {
+ log.Warn("revert in handleWaitMutable")
+ return nil
+ }, 5, targetEpoch)
+ if err != nil {
+ log.Errorf("handleWaitMutalbe: events error: api error, not proceeding: %w", err)
+ return nil
+ }
+
+ select {
+ case <-atHeight:
+ case <-ctx.Context().Done():
+ return ctx.Context().Err()
+ }
+ }
+
+ }
+ return ctx.Send(SectorDeadlineMutable{})
+}
+
func (m *Sealing) handleReplicaUpdateWait(ctx statemachine.Context, sector SectorInfo) error {
if sector.ReplicaUpdateMessage == nil {
log.Errorf("handleReplicaUpdateWait: no replica update message cid recorded")
@@ -227,7 +309,11 @@ func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector S
return xerrors.Errorf("getting sealing config: %w", err)
}
- if err := m.sealer.FinalizeReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.keepUnsealedRanges(sector.Pieces, false, cfg.AlwaysKeepUnsealedCopy)); err != nil {
+ if err := m.sealer.ReleaseUnsealed(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber), sector.keepUnsealedRanges(sector.Pieces, false, cfg.AlwaysKeepUnsealedCopy)); err != nil {
+ return ctx.Send(SectorFinalizeFailed{xerrors.Errorf("release unsealed: %w", err)})
+ }
+
+ if err := m.sealer.FinalizeReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil {
return ctx.Send(SectorFinalizeFailed{xerrors.Errorf("finalize sector: %w", err)})
}
@@ -235,6 +321,10 @@ func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector S
}
func (m *Sealing) handleUpdateActivating(ctx statemachine.Context, sector SectorInfo) error {
+ if sector.ReplicaUpdateMessage == nil {
+ return xerrors.Errorf("nil sector.ReplicaUpdateMessage!")
+ }
+
try := func() error {
mw, err := m.Api.StateWaitMsg(ctx.Context(), *sector.ReplicaUpdateMessage, build.MessageConfidence, api.LookbackNoLimit, true)
if err != nil {
@@ -253,7 +343,7 @@ func (m *Sealing) handleUpdateActivating(ctx statemachine.Context, sector Sector
lb := policy.GetWinningPoStSectorSetLookback(nv)
- targetHeight := mw.Height + lb + InteractivePoRepConfidence
+ targetHeight := mw.Height + lb
return m.events.ChainAt(context.Background(), func(context.Context, *types.TipSet, abi.ChainEpoch) error {
return ctx.Send(SectorUpdateActive{})
@@ -297,6 +387,6 @@ func handleErrors(ctx statemachine.Context, err error, sector SectorInfo) error
case *ErrExpiredDeals: // Probably not much we can do here, maybe re-pack the sector?
return ctx.Send(SectorDealsExpired{xerrors.Errorf("expired dealIDs in sector: %w", err)})
default:
- return xerrors.Errorf("checkPieces sanity check error: %w", err)
+ return xerrors.Errorf("checkPieces sanity check error: %w (%+v)", err, err)
}
}
diff --git a/storage/pipeline/states_sealing.go b/storage/pipeline/states_sealing.go
index 5ec8f077f..0608ead07 100644
--- a/storage/pipeline/states_sealing.go
+++ b/storage/pipeline/states_sealing.go
@@ -3,15 +3,19 @@ package sealing
import (
"bytes"
"context"
+ "encoding/json"
+ "io"
+ "net/http"
"github.com/ipfs/go-cid"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-commp-utils/zerocomm"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
"github.com/filecoin-project/go-state-types/network"
@@ -20,7 +24,6 @@ import (
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/policy"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader"
@@ -30,7 +33,7 @@ import (
var DealSectorPriority = 1024
var MaxTicketAge = policy.MaxPreCommitRandomnessLookback
-func (m *Sealing) handlePacking(ctx statemachine.Context, sector SectorInfo) error {
+func (m *Sealing) cleanupAssignedDeals(sector SectorInfo) {
m.inputLk.Lock()
// make sure we are not accepting deals into this sector
for _, c := range m.assignedPieces[m.minerSectorID(sector.SectorNumber)] {
@@ -48,6 +51,15 @@ func (m *Sealing) handlePacking(ctx statemachine.Context, sector SectorInfo) err
delete(m.openSectors, m.minerSectorID(sector.SectorNumber))
delete(m.assignedPieces, m.minerSectorID(sector.SectorNumber))
m.inputLk.Unlock()
+}
+
+func (m *Sealing) handlePacking(ctx statemachine.Context, sector SectorInfo) error {
+ m.cleanupAssignedDeals(sector)
+
+ // if this is a snapdeals sector, but it ended up not having any deals, abort the upgrade
+ if sector.State == SnapDealsPacking && !sector.hasDeals() {
+ return ctx.Send(SectorAbortUpgrade{xerrors.New("sector had no deals")})
+ }
log.Infow("performing filling up rest of the sector...", "sector", sector.SectorNumber)
@@ -153,7 +165,7 @@ func (m *Sealing) getTicket(ctx statemachine.Context, sector SectorInfo) (abi.Se
return nil, 0, allocated, xerrors.Errorf("getTicket: StateNetworkVersion: api error, not proceeding: %+v", err)
}
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return nil, 0, allocated, xerrors.Errorf("getTicket: actor version for network error, not proceeding: %w", err)
}
@@ -202,7 +214,7 @@ func (m *Sealing) handleGetTicket(ctx statemachine.Context, sector SectorInfo) e
}
func (m *Sealing) handlePreCommit1(ctx statemachine.Context, sector SectorInfo) error {
- if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api, false); err != nil { // Sanity check state
+ if err := checkPieces(ctx.Context(), m.maddr, sector.SectorNumber, sector.Pieces, m.Api, false); err != nil { // Sanity check state
switch err.(type) {
case *ErrApi:
log.Errorf("handlePreCommit1: api error, not proceeding: %+v", err)
@@ -240,7 +252,7 @@ func (m *Sealing) handlePreCommit1(ctx statemachine.Context, sector SectorInfo)
return nil
}
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
log.Errorf("handlePreCommit1: VersionForNetwork error, not proceeding: %w", err)
return nil
@@ -283,7 +295,7 @@ func (m *Sealing) handlePreCommit2(ctx statemachine.Context, sector SectorInfo)
})
}
-func (m *Sealing) preCommitParams(ctx statemachine.Context, sector SectorInfo) (*miner.SectorPreCommitInfo, big.Int, types.TipSetKey, error) {
+func (m *Sealing) preCommitInfo(ctx statemachine.Context, sector SectorInfo) (*miner.SectorPreCommitInfo, big.Int, types.TipSetKey, error) {
ts, err := m.Api.ChainHead(ctx.Context())
if err != nil {
log.Errorf("handlePreCommitting: api error, not proceeding: %+v", err)
@@ -327,7 +339,7 @@ func (m *Sealing) preCommitParams(ctx statemachine.Context, sector SectorInfo) (
return nil, big.Zero(), types.EmptyTSK, ctx.Send(SectorSealPreCommit1Failed{xerrors.Errorf("failed to get network version: %w", err)})
}
- av, err := actors.VersionForNetwork(nv)
+ av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return nil, big.Zero(), types.EmptyTSK, ctx.Send(SectorSealPreCommit1Failed{xerrors.Errorf("failed to get actors version: %w", err)})
}
@@ -381,14 +393,16 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf
}
}
- params, pcd, tsk, err := m.preCommitParams(ctx, sector)
+ info, pcd, tsk, err := m.preCommitInfo(ctx, sector)
if err != nil {
- return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitParams: %w", err)})
+ return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitInfo: %w", err)})
}
- if params == nil {
- return nil // event was sent in preCommitParams
+ if info == nil {
+ return nil // event was sent in preCommitInfo
}
+ params := infoToPreCommitSectorParams(info)
+
deposit, err := collateralSendAmount(ctx.Context(), m.Api, m.maddr, cfg, pcd)
if err != nil {
return err
@@ -418,7 +432,7 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf
return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("pushing message to mpool: %w", err)})
}
- return ctx.Send(SectorPreCommitted{Message: mcid, PreCommitDeposit: pcd, PreCommitInfo: *params})
+ return ctx.Send(SectorPreCommitted{Message: mcid, PreCommitDeposit: pcd, PreCommitInfo: *info})
}
func (m *Sealing) handleSubmitPreCommitBatch(ctx statemachine.Context, sector SectorInfo) error {
@@ -426,12 +440,12 @@ func (m *Sealing) handleSubmitPreCommitBatch(ctx statemachine.Context, sector Se
return ctx.Send(SectorSealPreCommit1Failed{xerrors.Errorf("sector had nil commR or commD")})
}
- params, deposit, _, err := m.preCommitParams(ctx, sector)
+ params, deposit, _, err := m.preCommitInfo(ctx, sector)
if err != nil {
- return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitParams: %w", err)})
+ return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("preCommitInfo: %w", err)})
}
if params == nil {
- return nil // event was sent in preCommitParams
+ return nil // event was sent in preCommitInfo
}
res, err := m.precommiter.AddPreCommit(ctx.Context(), sector, deposit, params)
@@ -562,18 +576,99 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo)
return ctx.Send(SectorCommitFailed{xerrors.Errorf("sector had nil commR or commD")})
}
- cids := storiface.SectorCids{
- Unsealed: *sector.CommD,
- Sealed: *sector.CommR,
- }
- c2in, err := m.sealer.SealCommit1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.TicketValue, sector.SeedValue, sector.pieceInfos(), cids)
- if err != nil {
- return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(1): %w", err)})
+ var c2in storiface.Commit1Out
+ if sector.RemoteCommit1Endpoint == "" {
+ // Local Commit1
+ cids := storiface.SectorCids{
+ Unsealed: *sector.CommD,
+ Sealed: *sector.CommR,
+ }
+ c2in, err = m.sealer.SealCommit1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.TicketValue, sector.SeedValue, sector.pieceInfos(), cids)
+ if err != nil {
+ return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(1): %w", err)})
+ }
+ } else {
+ // Remote Commit1
+
+ reqData := api.RemoteCommit1Params{
+ Ticket: sector.TicketValue,
+ Seed: sector.SeedValue,
+ Unsealed: *sector.CommD,
+ Sealed: *sector.CommR,
+ ProofType: sector.SectorType,
+ }
+ reqBody, err := json.Marshal(&reqData)
+ if err != nil {
+ return xerrors.Errorf("marshaling remote commit1 request: %w", err)
+ }
+
+ req, err := http.NewRequest("POST", sector.RemoteCommit1Endpoint, bytes.NewReader(reqBody))
+ if err != nil {
+ return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("creating new remote commit1 request: %w", err)})
+ }
+ req.Header.Set("Content-Type", "application/json")
+ req = req.WithContext(ctx.Context())
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("requesting remote commit1: %w", err)})
+ }
+
+ defer resp.Body.Close() //nolint:errcheck
+
+ if resp.StatusCode != http.StatusOK {
+ return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("remote commit1 received non-200 http response %s", resp.Status)})
+ }
+
+ c2in, err = io.ReadAll(resp.Body) // todo some len constraint
+ if err != nil {
+ return ctx.Send(SectorRemoteCommit1Failed{xerrors.Errorf("reading commit1 response: %w", err)})
+ }
}
- proof, err := m.sealer.SealCommit2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), c2in)
- if err != nil {
- return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(2): %w", err)})
+ var porepProof storiface.Proof
+
+ if sector.RemoteCommit2Endpoint == "" {
+ // Local Commit2
+
+ porepProof, err = m.sealer.SealCommit2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), c2in)
+ if err != nil {
+ return ctx.Send(SectorComputeProofFailed{xerrors.Errorf("computing seal proof failed(2): %w", err)})
+ }
+ } else {
+ // Remote Commit2
+
+ reqData := api.RemoteCommit2Params{
+ ProofType: sector.SectorType,
+ Sector: m.minerSectorID(sector.SectorNumber),
+
+ Commit1Out: c2in,
+ }
+ reqBody, err := json.Marshal(&reqData)
+ if err != nil {
+ return xerrors.Errorf("marshaling remote commit2 request: %w", err)
+ }
+
+ req, err := http.NewRequest("POST", sector.RemoteCommit2Endpoint, bytes.NewReader(reqBody))
+ if err != nil {
+ return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("creating new remote commit2 request: %w", err)})
+ }
+ req.Header.Set("Content-Type", "application/json")
+ req = req.WithContext(ctx.Context())
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("requesting remote commit2: %w", err)})
+ }
+
+ defer resp.Body.Close() //nolint:errcheck
+
+ if resp.StatusCode != http.StatusOK {
+ return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("remote commit2 received non-200 http response %s", resp.Status)})
+ }
+
+ porepProof, err = io.ReadAll(resp.Body) // todo some len constraint
+ if err != nil {
+ return ctx.Send(SectorRemoteCommit2Failed{xerrors.Errorf("reading commit2 response: %w", err)})
+ }
}
{
@@ -583,19 +678,19 @@ func (m *Sealing) handleCommitting(ctx statemachine.Context, sector SectorInfo)
return nil
}
- if err := m.checkCommit(ctx.Context(), sector, proof, ts.Key()); err != nil {
+ if err := m.checkCommit(ctx.Context(), sector, porepProof, ts.Key()); err != nil {
return ctx.Send(SectorCommitFailed{xerrors.Errorf("commit check error: %w", err)})
}
}
if cfg.FinalizeEarly {
return ctx.Send(SectorProofReady{
- Proof: proof,
+ Proof: porepProof,
})
}
return ctx.Send(SectorCommitted{
- Proof: proof,
+ Proof: porepProof,
})
}
@@ -767,7 +862,11 @@ func (m *Sealing) handleFinalizeSector(ctx statemachine.Context, sector SectorIn
return xerrors.Errorf("getting sealing config: %w", err)
}
- if err := m.sealer.FinalizeSector(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.keepUnsealedRanges(sector.Pieces, false, cfg.AlwaysKeepUnsealedCopy)); err != nil {
+ if err := m.sealer.ReleaseUnsealed(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber), sector.keepUnsealedRanges(sector.Pieces, false, cfg.AlwaysKeepUnsealedCopy)); err != nil {
+ return ctx.Send(SectorFinalizeFailed{xerrors.Errorf("release unsealed: %w", err)})
+ }
+
+ if err := m.sealer.FinalizeSector(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil {
return ctx.Send(SectorFinalizeFailed{xerrors.Errorf("finalize sector: %w", err)})
}
diff --git a/storage/pipeline/types.go b/storage/pipeline/types.go
index 5889588bd..6329b5666 100644
--- a/storage/pipeline/types.go
+++ b/storage/pipeline/types.go
@@ -7,7 +7,6 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/types"
@@ -23,18 +22,6 @@ type Context interface {
Send(evt interface{}) error
}
-// Piece is a tuple of piece and deal info
-type PieceWithDealInfo struct {
- Piece abi.PieceInfo
- DealInfo api.PieceDealInfo
-}
-
-// Piece is a tuple of piece info and optional deal
-type Piece struct {
- Piece abi.PieceInfo
- DealInfo *api.PieceDealInfo // nil for pieces which do not appear in deals (e.g. filler pieces)
-}
-
type Log struct {
Timestamp uint64
Trace string // for errors
@@ -62,7 +49,7 @@ type SectorInfo struct {
// Packing
CreationTime int64 // unix seconds
- Pieces []Piece
+ Pieces []api.SectorPiece
// PreCommit1
TicketValue abi.SealRandomness
@@ -74,7 +61,6 @@ type SectorInfo struct {
CommR *cid.Cid // SectorKey
Proof []byte
- PreCommitInfo *miner.SectorPreCommitInfo
PreCommitDeposit big.Int
PreCommitMessage *cid.Cid
PreCommitTipSet types.TipSetKey
@@ -91,7 +77,7 @@ type SectorInfo struct {
// CCUpdate
CCUpdate bool
- CCPieces []Piece
+ CCPieces []api.SectorPiece
UpdateSealed *cid.Cid
UpdateUnsealed *cid.Cid
ReplicaUpdateProof storiface.ReplicaUpdateProof
@@ -100,13 +86,22 @@ type SectorInfo struct {
// Faults
FaultReportMsg *cid.Cid
- // Recovery
+ // Recovery / Import
Return ReturnState
// Termination
TerminateMessage *cid.Cid
TerminatedAt abi.ChainEpoch
+ // Remote import
+ RemoteDataUnsealed *storiface.SectorLocation
+ RemoteDataSealed *storiface.SectorLocation
+ RemoteDataCache *storiface.SectorLocation
+ RemoteCommit1Endpoint string
+ RemoteCommit2Endpoint string
+ RemoteSealingDoneEndpoint string
+ RemoteDataFinalized bool
+
// Debug
LastErr string
@@ -163,7 +158,7 @@ func (t *SectorInfo) sealingCtx(ctx context.Context) context.Context {
// Returns list of offset/length tuples of sector data ranges which clients
// requested to keep unsealed
-func (t *SectorInfo) keepUnsealedRanges(pieces []Piece, invert, alwaysKeep bool) []storiface.Range {
+func (t *SectorInfo) keepUnsealedRanges(pieces []api.SectorPiece, invert, alwaysKeep bool) []storiface.Range {
var out []storiface.Range
var at abi.UnpaddedPieceSize
diff --git a/storage/pipeline/types_test.go b/storage/pipeline/types_test.go
index 69e102bf4..b8fbb113a 100644
--- a/storage/pipeline/types_test.go
+++ b/storage/pipeline/types_test.go
@@ -9,7 +9,7 @@ import (
cborutil "github.com/filecoin-project/go-cbor-util"
"github.com/filecoin-project/go-state-types/abi"
- markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
tutils "github.com/filecoin-project/specs-actors/v2/support/testing"
"github.com/filecoin-project/lotus/api"
@@ -43,7 +43,7 @@ func TestSectorInfoSerialization(t *testing.T) {
si := &SectorInfo{
State: "stateful",
SectorNumber: 234,
- Pieces: []Piece{{
+ Pieces: []api.SectorPiece{{
Piece: abi.PieceInfo{
Size: 5,
PieceCID: dummyCid,
diff --git a/storage/pipeline/upgrade_queue.go b/storage/pipeline/upgrade_queue.go
index 309e59573..9d9e1ca46 100644
--- a/storage/pipeline/upgrade_queue.go
+++ b/storage/pipeline/upgrade_queue.go
@@ -33,6 +33,9 @@ func (m *Sealing) MarkForUpgrade(ctx context.Context, id abi.SectorNumber) error
if err != nil {
return xerrors.Errorf("failed to read sector on chain info: %w", err)
}
+ if onChainInfo == nil {
+ return xerrors.Errorf("sector not found %d", id)
+ }
active, err := m.sectorActive(ctx, ts.Key(), id)
if err != nil {
diff --git a/storage/pipeline/utils.go b/storage/pipeline/utils.go
index 69a8f914c..3f8d534cb 100644
--- a/storage/pipeline/utils.go
+++ b/storage/pipeline/utils.go
@@ -10,6 +10,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/types"
@@ -111,3 +112,14 @@ func sendMsg(ctx context.Context, sa interface {
return smsg.Cid(), nil
}
+
+func infoToPreCommitSectorParams(info *miner.SectorPreCommitInfo) *miner.PreCommitSectorParams {
+ return &miner.PreCommitSectorParams{
+ SealProof: info.SealProof,
+ SectorNumber: info.SectorNumber,
+ SealedCID: info.SealedCID,
+ SealRandEpoch: info.SealRandEpoch,
+ DealIDs: info.DealIDs,
+ Expiration: info.Expiration,
+ }
+}
diff --git a/storage/sealer/faults.go b/storage/sealer/faults.go
index e05bbb7b8..db7b75bec 100644
--- a/storage/sealer/faults.go
+++ b/storage/sealer/faults.go
@@ -5,7 +5,6 @@ import (
"crypto/rand"
"fmt"
"sync"
- "time"
"golang.org/x/xerrors"
@@ -15,8 +14,6 @@ import (
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
-var PostCheckTimeout = 160 * time.Second
-
// FaultTracker TODO: Track things more actively
type FaultTracker interface {
CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storiface.SectorRef, rg storiface.RGetter) (map[abi.SectorID]string, error)
@@ -50,6 +47,12 @@ func (m *Manager) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof,
badLk.Unlock()
}
+ if m.partitionCheckTimeout > 0 {
+ var cancel2 context.CancelFunc
+ ctx, cancel2 = context.WithTimeout(ctx, m.partitionCheckTimeout)
+ defer cancel2()
+ }
+
var wg sync.WaitGroup
wg.Add(len(sectors))
@@ -57,7 +60,9 @@ func (m *Manager) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof,
select {
case throttle <- struct{}{}:
case <-ctx.Done():
- return nil, ctx.Err()
+ addBad(sector.ID, fmt.Sprintf("waiting for check worker: %s", ctx.Err()))
+ wg.Done()
+ continue
}
go func(sector storiface.SectorRef) {
@@ -107,8 +112,13 @@ func (m *Manager) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof,
return
}
- vctx, cancel2 := context.WithTimeout(ctx, PostCheckTimeout)
- defer cancel2()
+ vctx := ctx
+
+ if m.singleCheckTimeout > 0 {
+ var cancel2 context.CancelFunc
+ vctx, cancel2 = context.WithTimeout(ctx, m.singleCheckTimeout)
+ defer cancel2()
+ }
_, err = m.storage.GenerateSingleVanillaProof(vctx, sector.ID.Miner, storiface.PostSectorChallenge{
SealProof: sector.ProofType,
diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go
index cf4eddff0..e9ce5746e 100644
--- a/storage/sealer/ffiwrapper/sealer_cgo.go
+++ b/storage/sealer/ffiwrapper/sealer_cgo.go
@@ -11,9 +11,12 @@ import (
"encoding/base64"
"encoding/json"
"io"
+ "io/ioutil"
"math/bits"
"os"
+ "path/filepath"
"runtime"
+ "syscall"
"github.com/detailyang/go-fallocate"
"github.com/ipfs/go-cid"
@@ -28,6 +31,7 @@ import (
"github.com/filecoin-project/go-state-types/proof"
"github.com/filecoin-project/lotus/lib/nullreader"
+ spaths "github.com/filecoin-project/lotus/storage/paths"
nr "github.com/filecoin-project/lotus/storage/pipeline/lib/nullreader"
"github.com/filecoin-project/lotus/storage/sealer/fr32"
"github.com/filecoin-project/lotus/storage/sealer/partialfile"
@@ -60,7 +64,9 @@ func (sb *Sealer) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize,
log.Warnf("DataCid: cannot close pieceData reader %T because it is not an io.Closer", origPieceData)
return
}
- closer.Close() //nolint:errcheck
+ if err := closer.Close(); err != nil {
+ log.Warnw("closing pieceData in DataCid", "error", err)
+ }
}()
pieceData = io.LimitReader(io.MultiReader(
@@ -182,7 +188,19 @@ func (sb *Sealer) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize,
}, nil
}
-func (sb *Sealer) AddPiece(ctx context.Context, sector storiface.SectorRef, existingPieceSizes []abi.UnpaddedPieceSize, pieceSize abi.UnpaddedPieceSize, file storiface.Data) (abi.PieceInfo, error) {
+func (sb *Sealer) AddPiece(ctx context.Context, sector storiface.SectorRef, existingPieceSizes []abi.UnpaddedPieceSize, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (abi.PieceInfo, error) {
+ origPieceData := pieceData
+ defer func() {
+ closer, ok := origPieceData.(io.Closer)
+ if !ok {
+ log.Warnf("AddPiece: cannot close pieceData reader %T because it is not an io.Closer", origPieceData)
+ return
+ }
+ if err := closer.Close(); err != nil {
+ log.Warnw("closing pieceData in AddPiece", "error", err)
+ }
+ }()
+
// TODO: allow tuning those:
chunk := abi.PaddedPieceSize(4 << 20)
parallel := runtime.NumCPU()
@@ -248,7 +266,7 @@ func (sb *Sealer) AddPiece(ctx context.Context, sector storiface.SectorRef, exis
pw := fr32.NewPadWriter(w)
- pr := io.TeeReader(io.LimitReader(file, int64(pieceSize)), pw)
+ pr := io.TeeReader(io.LimitReader(pieceData, int64(pieceSize)), pw)
throttle := make(chan []byte, parallel)
piecePromises := make([]func() (abi.PieceInfo, error), 0)
@@ -387,7 +405,7 @@ func (sb *Sealer) pieceCid(spt abi.RegisteredSealProof, in []byte) (cid.Cid, err
}
func (sb *Sealer) tryDecodeUpdatedReplica(ctx context.Context, sector storiface.SectorRef, commD cid.Cid, unsealedPath string, randomness abi.SealRandomness) (bool, error) {
- replicaPath, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone, storiface.PathStorage)
+ replicaPath, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTNone, storiface.PathSealing)
if xerrors.Is(err, storiface.ErrSectorNotFound) {
return false, nil
} else if err != nil {
@@ -446,12 +464,12 @@ func (sb *Sealer) UnsealPiece(ctx context.Context, sector storiface.SectorRef, o
maxPieceSize := abi.PaddedPieceSize(ssize)
// try finding existing
- unsealedPath, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed, storiface.FTNone, storiface.PathStorage)
+ unsealedPath, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed, storiface.FTNone, storiface.PathSealing)
var pf *partialfile.PartialFile
switch {
case xerrors.Is(err, storiface.ErrSectorNotFound):
- unsealedPath, done, err = sb.sectors.AcquireSector(ctx, sector, storiface.FTNone, storiface.FTUnsealed, storiface.PathStorage)
+ unsealedPath, done, err = sb.sectors.AcquireSector(ctx, sector, storiface.FTNone, storiface.FTUnsealed, storiface.PathSealing)
if err != nil {
return xerrors.Errorf("acquire unsealed sector path (allocate): %w", err)
}
@@ -498,7 +516,7 @@ func (sb *Sealer) UnsealPiece(ctx context.Context, sector storiface.SectorRef, o
}
// Piece data sealed in sector
- srcPaths, srcDone, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache|storiface.FTSealed, storiface.FTNone, storiface.PathStorage)
+ srcPaths, srcDone, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache|storiface.FTSealed, storiface.FTNone, storiface.PathSealing)
if err != nil {
return xerrors.Errorf("acquire sealed sector paths: %w", err)
}
@@ -981,7 +999,7 @@ func (sb *Sealer) ReleaseSealed(ctx context.Context, sector storiface.SectorRef)
return xerrors.Errorf("not supported at this layer")
}
-func (sb *Sealer) freeUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
+func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
ssize, err := sector.ProofType.SectorSize()
if err != nil {
return err
@@ -1049,16 +1067,12 @@ func (sb *Sealer) freeUnsealed(ctx context.Context, sector storiface.SectorRef,
return nil
}
-func (sb *Sealer) FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
+func (sb *Sealer) FinalizeSector(ctx context.Context, sector storiface.SectorRef) error {
ssize, err := sector.ProofType.SectorSize()
if err != nil {
return err
}
- if err := sb.freeUnsealed(ctx, sector, keepUnsealed); err != nil {
- return err
- }
-
paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache, 0, storiface.PathStorage)
if err != nil {
return xerrors.Errorf("acquiring sector cache path: %w", err)
@@ -1068,13 +1082,47 @@ func (sb *Sealer) FinalizeSector(ctx context.Context, sector storiface.SectorRef
return ffi.ClearCache(uint64(ssize), paths.Cache)
}
-func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
+// FinalizeSectorInto is like FinalizeSector, but writes finalized sector cache into a new path
+func (sb *Sealer) FinalizeSectorInto(ctx context.Context, sector storiface.SectorRef, dest string) error {
ssize, err := sector.ProofType.SectorSize()
if err != nil {
return err
}
- if err := sb.freeUnsealed(ctx, sector, keepUnsealed); err != nil {
+ paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache, 0, storiface.PathStorage)
+ if err != nil {
+ return xerrors.Errorf("acquiring sector cache path: %w", err)
+ }
+ defer done()
+
+ files, err := ioutil.ReadDir(paths.Cache)
+ if err != nil {
+ return err
+ }
+ for _, file := range files {
+ if file.Name() != "t_aux" && file.Name() != "p_aux" {
+ // link all the non-aux files
+ if err := syscall.Link(filepath.Join(paths.Cache, file.Name()), filepath.Join(dest, file.Name())); err != nil {
+ return xerrors.Errorf("link %s: %w", file.Name(), err)
+ }
+ continue
+ }
+
+ d, err := os.ReadFile(filepath.Join(paths.Cache, file.Name()))
+ if err != nil {
+ return xerrors.Errorf("read %s: %w", file.Name(), err)
+ }
+ if err := os.WriteFile(filepath.Join(dest, file.Name()), d, 0666); err != nil {
+ return xerrors.Errorf("write %s: %w", file.Name(), err)
+ }
+ }
+
+ return ffi.ClearCache(uint64(ssize), dest)
+}
+
+func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) error {
+ ssize, err := sector.ProofType.SectorSize()
+ if err != nil {
return err
}
@@ -1105,16 +1153,6 @@ func (sb *Sealer) FinalizeReplicaUpdate(ctx context.Context, sector storiface.Se
return nil
}
-func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) error {
- // This call is meant to mark storage as 'freeable'. Given that unsealing is
- // very expensive, we don't remove data as soon as we can - instead we only
- // do that when we don't have free space for data that really needs it
-
- // This function should not be called at this layer, everything should be
- // handled in localworker
- return xerrors.Errorf("not supported at this layer")
-}
-
func (sb *Sealer) ReleaseReplicaUpgrade(ctx context.Context, sector storiface.SectorRef) error {
return xerrors.Errorf("not supported at this layer")
}
@@ -1127,6 +1165,39 @@ func (sb *Sealer) Remove(ctx context.Context, sector storiface.SectorRef) error
return xerrors.Errorf("not supported at this layer") // happens in localworker
}
+func (sb *Sealer) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error {
+ var todo storiface.SectorFileType
+ for fileType := range src {
+ todo |= fileType
+ }
+
+ ptype := storiface.PathSealing
+ if finalized {
+ ptype = storiface.PathStorage
+ }
+
+ paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTNone, todo, ptype)
+ if err != nil {
+ return xerrors.Errorf("failed to acquire sector paths: %w", err)
+ }
+ defer done()
+
+ for fileType, data := range src {
+ out := storiface.PathByType(paths, fileType)
+
+ if data.Local {
+ return xerrors.Errorf("sector(%v) with local data (%#v) requested in DownloadSectorData", sector, data)
+ }
+
+ _, err := spaths.FetchWithTemp(ctx, []string{data.URL}, out, data.HttpHeaders())
+ if err != nil {
+ return xerrors.Errorf("downloading sector data: %w", err)
+ }
+ }
+
+ return nil
+}
+
func GetRequiredPadding(oldLength abi.PaddedPieceSize, newPieceLength abi.PaddedPieceSize) ([]abi.PaddedPieceSize, abi.PaddedPieceSize) {
padPieces := make([]abi.PaddedPieceSize, 0)
diff --git a/storage/sealer/ffiwrapper/sealer_test.go b/storage/sealer/ffiwrapper/sealer_test.go
index fb6a2249c..dd0c1e184 100644
--- a/storage/sealer/ffiwrapper/sealer_test.go
+++ b/storage/sealer/ffiwrapper/sealer_test.go
@@ -327,7 +327,7 @@ func TestSealAndVerify(t *testing.T) {
post(t, sb, nil, s)
- if err := sb.FinalizeSector(context.TODO(), si, nil); err != nil {
+ if err := sb.FinalizeSector(context.TODO(), si); err != nil {
t.Fatalf("%+v", err)
}
@@ -390,7 +390,7 @@ func TestSealPoStNoCommit(t *testing.T) {
precommit := time.Now()
- if err := sb.FinalizeSector(context.TODO(), si, nil); err != nil {
+ if err := sb.FinalizeSector(context.TODO(), si); err != nil {
t.Fatal(err)
}
@@ -585,7 +585,7 @@ func BenchmarkWriteWithAlignment(b *testing.B) {
}
func openFDs(t *testing.T) int {
- dent, err := ioutil.ReadDir("/proc/self/fd")
+ dent, err := os.ReadDir("/proc/self/fd")
require.NoError(t, err)
var skip int
@@ -611,7 +611,7 @@ func requireFDsClosed(t *testing.T, start int) {
openNow := openFDs(t)
if start != openNow {
- dent, err := ioutil.ReadDir("/proc/self/fd")
+ dent, err := os.ReadDir("/proc/self/fd")
require.NoError(t, err)
for _, info := range dent {
@@ -991,3 +991,87 @@ func TestPoStChallengeAssumptions(t *testing.T) {
require.Len(t, c1.Challenges, 3)
}
}
+
+func TestDCAPCloses(t *testing.T) {
+ sz := abi.PaddedPieceSize(2 << 10).Unpadded()
+
+ cdir, err := ioutil.TempDir("", "sbtest-c-")
+ if err != nil {
+ t.Fatal(err)
+ }
+ miner := abi.ActorID(123)
+
+ sp := &basicfs.Provider{
+ Root: cdir,
+ }
+ sb, err := New(sp)
+ if err != nil {
+ t.Fatalf("%+v", err)
+ }
+ cleanup := func() {
+ if t.Failed() {
+ fmt.Printf("not removing %s\n", cdir)
+ return
+ }
+ if err := os.RemoveAll(cdir); err != nil {
+ t.Error(err)
+ }
+ }
+ t.Cleanup(cleanup)
+
+ t.Run("DataCid", func(t *testing.T) {
+ r := rand.New(rand.NewSource(0x7e5))
+
+ clr := &closeAssertReader{
+ Reader: io.LimitReader(r, int64(sz)),
+ }
+
+ c, err := sb.DataCid(context.TODO(), sz, clr)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ require.Equal(t, "baga6ea4seaqeje7jy4hufnybpo7ckxzujaigqbcxhdjq7ojb4b6xzgqdugkyciq", c.PieceCID.String())
+ require.True(t, clr.closed)
+ })
+
+ t.Run("AddPiece", func(t *testing.T) {
+ r := rand.New(rand.NewSource(0x7e5))
+
+ clr := &closeAssertReader{
+ Reader: io.LimitReader(r, int64(sz)),
+ }
+
+ c, err := sb.AddPiece(context.TODO(), storiface.SectorRef{
+ ID: abi.SectorID{
+ Miner: miner,
+ Number: 0,
+ },
+ ProofType: abi.RegisteredSealProof_StackedDrg2KiBV1_1,
+ }, nil, sz, clr)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ require.Equal(t, "baga6ea4seaqeje7jy4hufnybpo7ckxzujaigqbcxhdjq7ojb4b6xzgqdugkyciq", c.PieceCID.String())
+ require.True(t, clr.closed)
+ })
+
+}
+
+type closeAssertReader struct {
+ io.Reader
+ closed bool
+}
+
+func (c *closeAssertReader) Close() error {
+ if c.closed {
+ panic("double close")
+ }
+
+ c.closed = true
+
+ return nil
+}
+
+var _ io.Closer = &closeAssertReader{}
diff --git a/storage/sealer/manager.go b/storage/sealer/manager.go
index 6733674ff..336664ca8 100644
--- a/storage/sealer/manager.go
+++ b/storage/sealer/manager.go
@@ -5,7 +5,9 @@ import (
"errors"
"io"
"net/http"
+ "sort"
"sync"
+ "time"
"github.com/google/uuid"
"github.com/hashicorp/go-multierror"
@@ -18,6 +20,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-statestore"
+ "github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
@@ -70,6 +73,8 @@ type Manager struct {
work *statestore.StateStore
parallelCheckLimit int
+ singleCheckTimeout time.Duration
+ partitionCheckTimeout time.Duration
disableBuiltinWindowPoSt bool
disableBuiltinWinningPoSt bool
disallowRemoteFinalize bool
@@ -89,62 +94,18 @@ type result struct {
err error
}
-// ResourceFilteringStrategy is an enum indicating the kinds of resource
-// filtering strategies that can be configured for workers.
-type ResourceFilteringStrategy string
-
-const (
- // ResourceFilteringHardware specifies that available hardware resources
- // should be evaluated when scheduling a task against the worker.
- ResourceFilteringHardware = ResourceFilteringStrategy("hardware")
-
- // ResourceFilteringDisabled disables resource filtering against this
- // worker. The scheduler may assign any task to this worker.
- ResourceFilteringDisabled = ResourceFilteringStrategy("disabled")
-)
-
-type Config struct {
- ParallelFetchLimit int
-
- // Local worker config
- AllowAddPiece bool
- AllowPreCommit1 bool
- AllowPreCommit2 bool
- AllowCommit bool
- AllowUnseal bool
- AllowReplicaUpdate bool
- AllowProveReplicaUpdate2 bool
- AllowRegenSectorKey bool
-
- LocalWorkerName string
-
- // ResourceFiltering instructs the system which resource filtering strategy
- // to use when evaluating tasks against this worker. An empty value defaults
- // to "hardware".
- ResourceFiltering ResourceFilteringStrategy
-
- // PoSt config
- ParallelCheckLimit int
- DisableBuiltinWindowPoSt bool
- DisableBuiltinWinningPoSt bool
-
- DisallowRemoteFinalize bool
-
- Assigner string
-}
-
type StorageAuth http.Header
type WorkerStateStore *statestore.StateStore
type ManagerStateStore *statestore.StateStore
-func New(ctx context.Context, lstor *paths.Local, stor paths.Store, ls paths.LocalStorage, si paths.SectorIndex, sc Config, wss WorkerStateStore, mss ManagerStateStore) (*Manager, error) {
+func New(ctx context.Context, lstor *paths.Local, stor paths.Store, ls paths.LocalStorage, si paths.SectorIndex, sc config.SealerConfig, pc config.ProvingConfig, wss WorkerStateStore, mss ManagerStateStore) (*Manager, error) {
prover, err := ffiwrapper.New(&readonlyProvider{stor: lstor, index: si})
if err != nil {
return nil, xerrors.Errorf("creating prover instance: %w", err)
}
- sh, err := newScheduler(sc.Assigner)
+ sh, err := newScheduler(ctx, sc.Assigner)
if err != nil {
return nil, err
}
@@ -162,9 +123,11 @@ func New(ctx context.Context, lstor *paths.Local, stor paths.Store, ls paths.Loc
localProver: prover,
- parallelCheckLimit: sc.ParallelCheckLimit,
- disableBuiltinWindowPoSt: sc.DisableBuiltinWindowPoSt,
- disableBuiltinWinningPoSt: sc.DisableBuiltinWinningPoSt,
+ parallelCheckLimit: pc.ParallelCheckLimit,
+ singleCheckTimeout: time.Duration(pc.SingleCheckTimeout),
+ partitionCheckTimeout: time.Duration(pc.PartitionCheckTimeout),
+ disableBuiltinWindowPoSt: pc.DisableBuiltinWindowPoSt,
+ disableBuiltinWinningPoSt: pc.DisableBuiltinWinningPoSt,
disallowRemoteFinalize: sc.DisallowRemoteFinalize,
work: mss,
@@ -179,7 +142,10 @@ func New(ctx context.Context, lstor *paths.Local, stor paths.Store, ls paths.Loc
go m.sched.runSched()
localTasks := []sealtasks.TaskType{
- sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, sealtasks.TTFinalizeReplicaUpdate,
+ sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, sealtasks.TTFinalizeUnsealed, sealtasks.TTFinalizeReplicaUpdate,
+ }
+ if sc.AllowSectorDownload {
+ localTasks = append(localTasks, sealtasks.TTDownloadSector)
}
if sc.AllowAddPiece {
localTasks = append(localTasks, sealtasks.TTAddPiece, sealtasks.TTDataCid)
@@ -207,7 +173,7 @@ func New(ctx context.Context, lstor *paths.Local, stor paths.Store, ls paths.Loc
}
wcfg := WorkerConfig{
- IgnoreResourceFiltering: sc.ResourceFiltering == ResourceFilteringDisabled,
+ IgnoreResourceFiltering: sc.ResourceFiltering == config.ResourceFilteringDisabled,
TaskTypes: localTasks,
Name: sc.LocalWorkerName,
}
@@ -230,8 +196,8 @@ func (m *Manager) AddLocalStorage(ctx context.Context, path string) error {
return xerrors.Errorf("opening local path: %w", err)
}
- if err := m.ls.SetStorage(func(sc *paths.StorageConfig) {
- sc.StoragePaths = append(sc.StoragePaths, paths.LocalPath{Path: path})
+ if err := m.ls.SetStorage(func(sc *storiface.StorageConfig) {
+ sc.StoragePaths = append(sc.StoragePaths, storiface.LocalPath{Path: path})
}); err != nil {
return xerrors.Errorf("get storage config: %w", err)
}
@@ -264,8 +230,8 @@ func (m *Manager) DetachLocalStorage(ctx context.Context, path string) error {
// drop from the persisted storage.json
var found bool
- if err := m.ls.SetStorage(func(sc *paths.StorageConfig) {
- out := make([]paths.LocalPath, 0, len(sc.StoragePaths))
+ if err := m.ls.SetStorage(func(sc *storiface.StorageConfig) {
+ out := make([]storiface.LocalPath, 0, len(sc.StoragePaths))
for _, storagePath := range sc.StoragePaths {
if storagePath.Path != path {
out = append(out, storagePath)
@@ -392,6 +358,21 @@ func (m *Manager) SectorsUnsealPiece(ctx context.Context, sector storiface.Secto
return xerrors.Errorf("worker UnsealPiece call: %s", err)
}
+ // get a selector for moving unsealed sector into long-term storage
+ fetchSel := newMoveSelector(m.index, sector.ID, storiface.FTUnsealed, storiface.PathStorage, !m.disallowRemoteFinalize)
+
+ // move unsealed sector to long-term storage
+ // Possible TODO: Add an option to not keep the unsealed sector in long term storage?
+ err = m.sched.Schedule(ctx, sector, sealtasks.TTFetch, fetchSel,
+ m.schedFetch(sector, storiface.FTUnsealed, storiface.PathStorage, storiface.AcquireMove),
+ func(ctx context.Context, w Worker) error {
+ _, err := m.waitSimpleCall(ctx)(w.MoveStorage(ctx, sector, storiface.FTUnsealed))
+ return err
+ })
+ if err != nil {
+ return xerrors.Errorf("moving unsealed sector to long term storage: %w", err)
+ }
+
return nil
}
@@ -647,7 +628,27 @@ func (m *Manager) SealCommit2(ctx context.Context, sector storiface.SectorRef, p
return out, waitErr
}
-func (m *Manager) FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
+// sectorStorageType tries to figure out storage type for a given sector; expects only a single copy of the file in the
+// storage system
+func (m *Manager) sectorStorageType(ctx context.Context, sector storiface.SectorRef, ft storiface.SectorFileType) (sectorFound bool, ptype storiface.PathType, err error) {
+ stores, err := m.index.StorageFindSector(ctx, sector.ID, ft, 0, false)
+ if err != nil {
+ return false, "", xerrors.Errorf("finding sector: %w", err)
+ }
+ if len(stores) == 0 {
+ return false, "", nil
+ }
+
+ for _, store := range stores {
+ if store.CanSeal {
+ return true, storiface.PathSealing, nil
+ }
+ }
+
+ return true, storiface.PathStorage, nil
+}
+
+func (m *Manager) FinalizeSector(ctx context.Context, sector storiface.SectorRef) error {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
@@ -655,44 +656,38 @@ func (m *Manager) FinalizeSector(ctx context.Context, sector storiface.SectorRef
return xerrors.Errorf("acquiring sector lock: %w", err)
}
- // first check if the unsealed file exists anywhere; If it doesn't ignore it
- unsealed := storiface.FTUnsealed
- {
- unsealedStores, err := m.index.StorageFindSector(ctx, sector.ID, storiface.FTUnsealed, 0, false)
- if err != nil {
- return xerrors.Errorf("finding unsealed sector: %w", err)
- }
+ /*
+ We want to:
+ - Trim cache
+ - Move stuff to long-term storage
+ */
- if len(unsealedStores) == 0 { // Is some edge-cases unsealed sector may not exist already, that's fine
- unsealed = storiface.FTNone
- }
+ // remove redundant copies if there are any
+ if err := m.storage.RemoveCopies(ctx, sector.ID, storiface.FTUnsealed); err != nil {
+ return xerrors.Errorf("remove copies (sealed): %w", err)
+ }
+ if err := m.storage.RemoveCopies(ctx, sector.ID, storiface.FTSealed); err != nil {
+ return xerrors.Errorf("remove copies (sealed): %w", err)
+ }
+ if err := m.storage.RemoveCopies(ctx, sector.ID, storiface.FTCache); err != nil {
+ return xerrors.Errorf("remove copies (cache): %w", err)
}
- // Make sure that the sealed file is still in sealing storage; In case it already
- // isn't, we want to do finalize in long-term storage
- pathType := storiface.PathStorage
- {
- sealedStores, err := m.index.StorageFindSector(ctx, sector.ID, storiface.FTSealed, 0, false)
- if err != nil {
- return xerrors.Errorf("finding sealed sector: %w", err)
- }
-
- for _, store := range sealedStores {
- if store.CanSeal {
- pathType = storiface.PathSealing
- break
- }
- }
+ // Make sure that the cache files are still in sealing storage; In case not,
+ // we want to do finalize in long-term storage
+ _, cachePathType, err := m.sectorStorageType(ctx, sector, storiface.FTCache)
+ if err != nil {
+ return xerrors.Errorf("checking cache storage type: %w", err)
}
// do the cache trimming wherever the likely still very large cache lives.
// we really don't want to move it.
selector := newExistingSelector(m.index, sector.ID, storiface.FTCache, false)
- err := m.sched.Schedule(ctx, sector, sealtasks.TTFinalize, selector,
- m.schedFetch(sector, storiface.FTCache|unsealed, pathType, storiface.AcquireMove),
+ err = m.sched.Schedule(ctx, sector, sealtasks.TTFinalize, selector,
+ m.schedFetch(sector, storiface.FTCache, cachePathType, storiface.AcquireMove),
func(ctx context.Context, w Worker) error {
- _, err := m.waitSimpleCall(ctx)(w.FinalizeSector(ctx, sector, keepUnsealed))
+ _, err := m.waitSimpleCall(ctx)(w.FinalizeSector(ctx, sector))
return err
})
if err != nil {
@@ -703,9 +698,14 @@ func (m *Manager) FinalizeSector(ctx context.Context, sector storiface.SectorRef
fetchSel := newMoveSelector(m.index, sector.ID, storiface.FTCache|storiface.FTSealed, storiface.PathStorage, !m.disallowRemoteFinalize)
// only move the unsealed file if it still exists and needs moving
- moveUnsealed := unsealed
+ moveUnsealed := storiface.FTUnsealed
{
- if len(keepUnsealed) == 0 {
+ found, unsealedPathType, err := m.sectorStorageType(ctx, sector, storiface.FTUnsealed)
+ if err != nil {
+ return xerrors.Errorf("checking cache storage type: %w", err)
+ }
+
+ if !found || unsealedPathType == storiface.PathStorage {
moveUnsealed = storiface.FTNone
}
}
@@ -724,7 +724,7 @@ func (m *Manager) FinalizeSector(ctx context.Context, sector storiface.SectorRef
return nil
}
-func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
+func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) error {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
@@ -732,19 +732,6 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storiface.Se
return xerrors.Errorf("acquiring sector lock: %w", err)
}
- // first check if the unsealed file exists anywhere; If it doesn't ignore it
- moveUnsealed := storiface.FTUnsealed
- {
- unsealedStores, err := m.index.StorageFindSector(ctx, sector.ID, storiface.FTUnsealed, 0, false)
- if err != nil {
- return xerrors.Errorf("finding unsealed sector: %w", err)
- }
-
- if len(unsealedStores) == 0 { // Is some edge-cases unsealed sector may not exist already, that's fine
- moveUnsealed = storiface.FTNone
- }
- }
-
// Make sure that the update file is still in sealing storage; In case it already
// isn't, we want to do finalize in long-term storage
pathType := storiface.PathStorage
@@ -767,9 +754,9 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storiface.Se
selector := newExistingSelector(m.index, sector.ID, storiface.FTUpdateCache, false)
err := m.sched.Schedule(ctx, sector, sealtasks.TTFinalizeReplicaUpdate, selector,
- m.schedFetch(sector, storiface.FTCache|storiface.FTUpdateCache|moveUnsealed, pathType, storiface.AcquireMove),
+ m.schedFetch(sector, storiface.FTCache|storiface.FTUpdateCache, pathType, storiface.AcquireMove),
func(ctx context.Context, w Worker) error {
- _, err := m.waitSimpleCall(ctx)(w.FinalizeReplicaUpdate(ctx, sector, keepUnsealed))
+ _, err := m.waitSimpleCall(ctx)(w.FinalizeReplicaUpdate(ctx, sector))
return err
})
if err != nil {
@@ -779,11 +766,6 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storiface.Se
move := func(types storiface.SectorFileType) error {
// get a selector for moving stuff into long-term storage
fetchSel := newMoveSelector(m.index, sector.ID, types, storiface.PathStorage, !m.disallowRemoteFinalize)
- {
- if len(keepUnsealed) == 0 {
- moveUnsealed = storiface.FTNone
- }
- }
err = m.sched.Schedule(ctx, sector, sealtasks.TTFetch, fetchSel,
m.schedFetch(sector, types, storiface.PathStorage, storiface.AcquireMove),
@@ -799,8 +781,15 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storiface.Se
err = multierr.Append(move(storiface.FTUpdate|storiface.FTUpdateCache), move(storiface.FTCache))
err = multierr.Append(err, move(storiface.FTSealed)) // Sealed separate from cache just in case ReleaseSectorKey was already called
- if moveUnsealed != storiface.FTNone {
- err = multierr.Append(err, move(moveUnsealed))
+
+ {
+ unsealedStores, ferr := m.index.StorageFindSector(ctx, sector.ID, storiface.FTUnsealed, 0, false)
+ if err != nil {
+ err = multierr.Append(err, xerrors.Errorf("find unsealed sector before move: %w", ferr))
+ } else if len(unsealedStores) > 0 {
+ // if we found unsealed files, AND have been asked to keep at least one piece, move unsealed
+ err = multierr.Append(err, move(storiface.FTUnsealed))
+ }
}
if err != nil {
@@ -810,16 +799,7 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storiface.Se
return nil
}
-func (m *Manager) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) error {
- ssize, err := sector.ProofType.SectorSize()
- if err != nil {
- return err
- }
- if len(safeToFree) == 0 || safeToFree[0].Offset != 0 || safeToFree[0].Size.Padded() != abi.PaddedPieceSize(ssize) {
- // todo support partial free
- return nil
- }
-
+func (m *Manager) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
@@ -827,7 +807,25 @@ func (m *Manager) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRe
return xerrors.Errorf("acquiring sector lock: %w", err)
}
- return m.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true, nil)
+ found, pathType, err := m.sectorStorageType(ctx, sector, storiface.FTUnsealed)
+ if err != nil {
+ return xerrors.Errorf("checking cache storage type: %w", err)
+ }
+ if !found {
+ // already removed
+ return nil
+ }
+
+ selector := newExistingSelector(m.index, sector.ID, storiface.FTUnsealed, false)
+
+ return m.sched.Schedule(ctx, sector, sealtasks.TTFinalizeUnsealed, selector, m.schedFetch(sector, storiface.FTUnsealed, pathType, storiface.AcquireMove), func(ctx context.Context, w Worker) error {
+ _, err := m.waitSimpleCall(ctx)(w.ReleaseUnsealed(ctx, sector, keepUnsealed))
+ if err != nil {
+ return err
+ }
+
+ return nil
+ })
}
func (m *Manager) ReleaseSectorKey(ctx context.Context, sector storiface.SectorRef) error {
@@ -1084,6 +1082,78 @@ func (m *Manager) ProveReplicaUpdate2(ctx context.Context, sector storiface.Sect
return out, waitErr
}
+func (m *Manager) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error {
+ ctx, cancel := context.WithCancel(ctx)
+ defer cancel()
+
+ var toFetch storiface.SectorFileType
+
+ // get a sorted list of sectors files to make a consistent work key from
+ ents := make([]struct {
+ T storiface.SectorFileType
+ S storiface.SectorLocation
+ }, 0, len(src))
+ for fileType, data := range src {
+ if len(fileType.AllSet()) != 1 {
+ return xerrors.Errorf("sector data entry must be for a single file type")
+ }
+
+ toFetch |= fileType
+
+ ents = append(ents, struct {
+ T storiface.SectorFileType
+ S storiface.SectorLocation
+ }{T: fileType, S: data})
+ }
+ sort.Slice(ents, func(i, j int) bool {
+ return ents[i].T < ents[j].T
+ })
+
+ // get a work key
+ wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTDownloadSector, sector, ents)
+ if err != nil {
+ return xerrors.Errorf("getWork: %w", err)
+ }
+ defer cancel()
+
+ var waitErr error
+ waitRes := func() {
+ _, werr := m.waitWork(ctx, wk)
+ if werr != nil {
+ waitErr = werr
+ return
+ }
+ }
+
+ if wait { // already in progress
+ waitRes()
+ return waitErr
+ }
+
+ ptype := storiface.PathSealing
+ if finalized {
+ ptype = storiface.PathStorage
+ }
+
+ selector := newAllocSelector(m.index, toFetch, ptype)
+
+ err = m.sched.Schedule(ctx, sector, sealtasks.TTDownloadSector, selector, schedNop, func(ctx context.Context, w Worker) error {
+ err := m.startWork(ctx, w, wk)(w.DownloadSectorData(ctx, sector, finalized, src))
+ if err != nil {
+ return err
+ }
+
+ waitRes()
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ return waitErr
+}
+
func (m *Manager) ReturnDataCid(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error {
return m.returnResult(ctx, callID, pi, err)
}
@@ -1148,6 +1218,10 @@ func (m *Manager) ReturnReadPiece(ctx context.Context, callID storiface.CallID,
return m.returnResult(ctx, callID, ok, err)
}
+func (m *Manager) ReturnDownloadSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error {
+ return m.returnResult(ctx, callID, nil, err)
+}
+
func (m *Manager) ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error {
return m.returnResult(ctx, callID, nil, err)
}
diff --git a/storage/sealer/manager_test.go b/storage/sealer/manager_test.go
index 739cfdd24..a44f69a89 100644
--- a/storage/sealer/manager_test.go
+++ b/storage/sealer/manager_test.go
@@ -39,7 +39,7 @@ func init() {
logging.SetAllLoggers(logging.LevelDebug)
}
-type testStorage paths.StorageConfig
+type testStorage storiface.StorageConfig
func (t testStorage) DiskUsage(path string) (int64, error) {
return 1, nil // close enough
@@ -50,7 +50,7 @@ func newTestStorage(t *testing.T) *testStorage {
require.NoError(t, err)
{
- b, err := json.MarshalIndent(&paths.LocalStorageMeta{
+ b, err := json.MarshalIndent(&storiface.LocalStorageMeta{
ID: storiface.ID(uuid.New().String()),
Weight: 1,
CanSeal: true,
@@ -63,7 +63,7 @@ func newTestStorage(t *testing.T) *testStorage {
}
return &testStorage{
- StoragePaths: []paths.LocalPath{
+ StoragePaths: []storiface.LocalPath{
{Path: tp},
},
}
@@ -82,12 +82,12 @@ func (t testStorage) cleanup() {
}
}
-func (t testStorage) GetStorage() (paths.StorageConfig, error) {
- return paths.StorageConfig(t), nil
+func (t testStorage) GetStorage() (storiface.StorageConfig, error) {
+ return storiface.StorageConfig(t), nil
}
-func (t *testStorage) SetStorage(f func(*paths.StorageConfig)) error {
- f((*paths.StorageConfig)(t))
+func (t *testStorage) SetStorage(f func(*storiface.StorageConfig)) error {
+ f((*storiface.StorageConfig)(t))
return nil
}
@@ -110,7 +110,7 @@ func newTestMgr(ctx context.Context, t *testing.T, ds datastore.Datastore) (*Man
stor := paths.NewRemote(lstor, si, nil, 6000, &paths.DefaultPartialFileHandler{})
- sh, err := newScheduler("")
+ sh, err := newScheduler(ctx, "")
require.NoError(t, err)
m := &Manager{
@@ -148,7 +148,7 @@ func TestSimple(t *testing.T) {
defer cleanup()
localTasks := []sealtasks.TaskType{
- sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFetch,
+ sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed, sealtasks.TTFetch,
}
err := m.AddWorker(ctx, newTestWorker(WorkerConfig{
@@ -207,7 +207,7 @@ func TestSnapDeals(t *testing.T) {
localTasks := []sealtasks.TaskType{
sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit1, sealtasks.TTCommit2, sealtasks.TTFinalize,
sealtasks.TTFetch, sealtasks.TTReplicaUpdate, sealtasks.TTProveReplicaUpdate1, sealtasks.TTProveReplicaUpdate2, sealtasks.TTUnseal,
- sealtasks.TTRegenSectorKey,
+ sealtasks.TTRegenSectorKey, sealtasks.TTFinalizeUnsealed,
}
wds := datastore.NewMapDatastore()
@@ -304,13 +304,13 @@ func TestSnapDeals(t *testing.T) {
fmt.Printf("Decode\n")
// Remove unsealed data and decode for retrieval
- require.NoError(t, m.FinalizeSector(ctx, sid, nil))
+ require.NoError(t, m.ReleaseUnsealed(ctx, sid, nil))
startDecode := time.Now()
require.NoError(t, m.SectorsUnsealPiece(ctx, sid, 0, p1.Size.Unpadded(), ticket, &out.NewUnsealed))
fmt.Printf("Decode duration (%s): %s\n", ss.ShortString(), time.Since(startDecode))
// Remove just the first piece and decode for retrieval
- require.NoError(t, m.FinalizeSector(ctx, sid, []storiface.Range{{Offset: p1.Size.Unpadded(), Size: p2.Size.Unpadded()}}))
+ require.NoError(t, m.ReleaseUnsealed(ctx, sid, []storiface.Range{{Offset: p1.Size.Unpadded(), Size: p2.Size.Unpadded()}}))
require.NoError(t, m.SectorsUnsealPiece(ctx, sid, 0, p1.Size.Unpadded(), ticket, &out.NewUnsealed))
fmt.Printf("GSK\n")
@@ -320,7 +320,7 @@ func TestSnapDeals(t *testing.T) {
fmt.Printf("GSK duration (%s): %s\n", ss.ShortString(), time.Since(startGSK))
fmt.Printf("Remove data\n")
- require.NoError(t, m.FinalizeSector(ctx, sid, nil))
+ require.NoError(t, m.ReleaseUnsealed(ctx, sid, nil))
fmt.Printf("Release Sector Key\n")
require.NoError(t, m.ReleaseSectorKey(ctx, sid))
fmt.Printf("Unseal Replica\n")
@@ -336,7 +336,7 @@ func TestSnarkPackV2(t *testing.T) {
localTasks := []sealtasks.TaskType{
sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit1, sealtasks.TTCommit2, sealtasks.TTFinalize,
sealtasks.TTFetch, sealtasks.TTReplicaUpdate, sealtasks.TTProveReplicaUpdate1, sealtasks.TTProveReplicaUpdate2, sealtasks.TTUnseal,
- sealtasks.TTRegenSectorKey,
+ sealtasks.TTRegenSectorKey, sealtasks.TTFinalizeUnsealed,
}
wds := datastore.NewMapDatastore()
@@ -476,7 +476,7 @@ func TestRedoPC1(t *testing.T) {
defer cleanup()
localTasks := []sealtasks.TaskType{
- sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFetch,
+ sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed, sealtasks.TTFetch,
}
tw := newTestWorker(WorkerConfig{
@@ -531,7 +531,7 @@ func TestRestartManager(t *testing.T) {
defer cleanup()
localTasks := []sealtasks.TaskType{
- sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFetch,
+ sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed, sealtasks.TTFetch,
}
tw := newTestWorker(WorkerConfig{
@@ -702,7 +702,7 @@ func TestReenableWorker(t *testing.T) {
defer cleanup()
localTasks := []sealtasks.TaskType{
- sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFetch,
+ sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed, sealtasks.TTFetch,
}
wds := datastore.NewMapDatastore()
diff --git a/storage/sealer/mock/mock.go b/storage/sealer/mock/mock.go
index 5b0afd35c..6e88b86a5 100644
--- a/storage/sealer/mock/mock.go
+++ b/storage/sealer/mock/mock.go
@@ -497,15 +497,15 @@ func (mgr *SectorMgr) StageFakeData(mid abi.ActorID, spt abi.RegisteredSealProof
return id, []abi.PieceInfo{pi}, nil
}
-func (mgr *SectorMgr) FinalizeSector(context.Context, storiface.SectorRef, []storiface.Range) error {
+func (mgr *SectorMgr) FinalizeSector(context.Context, storiface.SectorRef) error {
return nil
}
-func (mgr *SectorMgr) FinalizeReplicaUpdate(context.Context, storiface.SectorRef, []storiface.Range) error {
+func (mgr *SectorMgr) FinalizeReplicaUpdate(context.Context, storiface.SectorRef) error {
return nil
}
-func (mgr *SectorMgr) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) error {
+func (mgr *SectorMgr) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
return nil
}
@@ -517,6 +517,10 @@ func (mgr *SectorMgr) ReleaseSectorKey(ctx context.Context, sector storiface.Sec
return nil
}
+func (mgr *SectorMgr) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error {
+ return xerrors.Errorf("not supported")
+}
+
func (mgr *SectorMgr) Remove(ctx context.Context, sector storiface.SectorRef) error {
mgr.lk.Lock()
defer mgr.lk.Unlock()
@@ -613,6 +617,10 @@ func (mgr *SectorMgr) ReturnFinalizeReplicaUpdate(ctx context.Context, callID st
panic("not supported")
}
+func (mgr *SectorMgr) ReturnDownloadSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error {
+ panic("not supported")
+}
+
func (m mockVerifProver) VerifySeal(svi prooftypes.SealVerifyInfo) (bool, error) {
plen, err := svi.SealProof.ProofSize()
if err != nil {
diff --git a/storage/sealer/mock/util.go b/storage/sealer/mock/util.go
index 5e6e3ecd3..48055b4d0 100644
--- a/storage/sealer/mock/util.go
+++ b/storage/sealer/mock/util.go
@@ -10,7 +10,7 @@ import (
commcid "github.com/filecoin-project/go-fil-commcid"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
- "github.com/filecoin-project/go-state-types/builtin/v8/market"
+ "github.com/filecoin-project/go-state-types/builtin/v9/market"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet/key"
@@ -72,7 +72,7 @@ func PreSeal(spt abi.RegisteredSealProof, maddr address.Address, sectors int) (*
ProviderCollateral: big.Zero(),
ClientCollateral: big.Zero(),
}
- preseal.DealClientKey = k
+ preseal.DealClientKey = k.KeyInfo
genm.Sectors[i] = preseal
}
diff --git a/storage/sealer/piece_provider_test.go b/storage/sealer/piece_provider_test.go
index c4c71bc53..ea2866e5d 100644
--- a/storage/sealer/piece_provider_test.go
+++ b/storage/sealer/piece_provider_test.go
@@ -21,6 +21,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-statestore"
+ "github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
@@ -30,7 +31,7 @@ import (
// only uses miner and does NOT use any remote worker.
func TestPieceProviderSimpleNoRemoteWorker(t *testing.T) {
// Set up sector storage manager
- sealerCfg := Config{
+ sealerCfg := config.SealerConfig{
ParallelFetchLimit: 10,
AllowAddPiece: true,
AllowPreCommit1: true,
@@ -89,7 +90,7 @@ func TestReadPieceRemoteWorkers(t *testing.T) {
logging.SetAllLoggers(logging.LevelDebug)
// miner's worker can only add pieces to an unsealed sector.
- sealerCfg := Config{
+ sealerCfg := config.SealerConfig{
ParallelFetchLimit: 10,
AllowAddPiece: true,
AllowPreCommit1: false,
@@ -106,7 +107,7 @@ func TestReadPieceRemoteWorkers(t *testing.T) {
// the unsealed file from the miner.
ppt.addRemoteWorker(t, []sealtasks.TaskType{
sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit1,
- sealtasks.TTFetch, sealtasks.TTFinalize,
+ sealtasks.TTFetch, sealtasks.TTFinalize, sealtasks.TTFinalizeUnsealed,
})
// create a worker that can ONLY unseal and fetch
@@ -198,7 +199,7 @@ func generatePieceData(size uint64) []byte {
return bz
}
-func newPieceProviderTestHarness(t *testing.T, mgrConfig Config, sectorProofType abi.RegisteredSealProof) *pieceProviderTestHarness {
+func newPieceProviderTestHarness(t *testing.T, mgrConfig config.SealerConfig, sectorProofType abi.RegisteredSealProof) *pieceProviderTestHarness {
ctx := context.Background()
// listen on tcp socket to create an http server later
address := "0.0.0.0:0"
@@ -217,7 +218,7 @@ func newPieceProviderTestHarness(t *testing.T, mgrConfig Config, sectorProofType
wsts := statestore.New(namespace.Wrap(dstore, datastore.NewKey("/worker/calls")))
smsts := statestore.New(namespace.Wrap(dstore, datastore.NewKey("/stmgr/calls")))
- mgr, err := New(ctx, localStore, remoteStore, storage, index, mgrConfig, wsts, smsts)
+ mgr, err := New(ctx, localStore, remoteStore, storage, index, mgrConfig, config.ProvingConfig{}, wsts, smsts)
require.NoError(t, err)
// start a http server on the manager to serve sector file requests.
@@ -351,7 +352,8 @@ func (p *pieceProviderTestHarness) readPiece(t *testing.T, offset storiface.Unpa
}
func (p *pieceProviderTestHarness) finalizeSector(t *testing.T, keepUnseal []storiface.Range) {
- require.NoError(t, p.mgr.FinalizeSector(p.ctx, p.sector, keepUnseal))
+ require.NoError(t, p.mgr.ReleaseUnsealed(p.ctx, p.sector, keepUnseal))
+ require.NoError(t, p.mgr.FinalizeSector(p.ctx, p.sector))
}
func (p *pieceProviderTestHarness) shutdown(t *testing.T) {
diff --git a/storage/sealer/sched.go b/storage/sealer/sched.go
index 335bb1249..c2b7d6a2d 100644
--- a/storage/sealer/sched.go
+++ b/storage/sealer/sched.go
@@ -10,6 +10,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
+ "github.com/filecoin-project/lotus/metrics"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
)
@@ -42,15 +43,23 @@ const mib = 1 << 20
type WorkerAction func(ctx context.Context, w Worker) error
+type SchedWorker interface {
+ TaskTypes(context.Context) (map[sealtasks.TaskType]struct{}, error)
+ Paths(context.Context) ([]storiface.StoragePath, error)
+ Utilization() float64
+}
+
type WorkerSelector interface {
// Ok is true if worker is acceptable for performing a task.
// If any worker is preferred for a task, other workers won't be considered for that task.
- Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, a *WorkerHandle) (ok, preferred bool, err error)
+ Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, a SchedWorker) (ok, preferred bool, err error)
- Cmp(ctx context.Context, task sealtasks.TaskType, a, b *WorkerHandle) (bool, error) // true if a is preferred over b
+ Cmp(ctx context.Context, task sealtasks.TaskType, a, b SchedWorker) (bool, error) // true if a is preferred over b
}
type Scheduler struct {
+ mctx context.Context // metrics context
+
assigner Assigner
workersLk sync.RWMutex
@@ -79,10 +88,6 @@ type Scheduler struct {
type WorkerHandle struct {
workerRpc Worker
- tasksCache map[sealtasks.TaskType]struct{}
- tasksUpdate time.Time
- tasksLk sync.Mutex
-
Info storiface.WorkerInfo
preparing *ActiveResources // use with WorkerHandle.lk
@@ -146,7 +151,7 @@ type rmRequest struct {
res chan error
}
-func newScheduler(assigner string) (*Scheduler, error) {
+func newScheduler(ctx context.Context, assigner string) (*Scheduler, error) {
var a Assigner
switch assigner {
case "", "utilization":
@@ -158,6 +163,7 @@ func newScheduler(assigner string) (*Scheduler, error) {
}
return &Scheduler{
+ mctx: ctx,
assigner: a,
Workers: map[storiface.WorkerID]*WorkerHandle{},
@@ -366,6 +372,9 @@ func (sh *Scheduler) trySched() {
sh.workersLk.RLock()
defer sh.workersLk.RUnlock()
+ done := metrics.Timer(sh.mctx, metrics.SchedAssignerCycleDuration)
+ defer done()
+
sh.assigner.TrySched(sh)
}
diff --git a/storage/sealer/sched_assigner_common.go b/storage/sealer/sched_assigner_common.go
index 09ff82a89..bf92dbf15 100644
--- a/storage/sealer/sched_assigner_common.go
+++ b/storage/sealer/sched_assigner_common.go
@@ -5,6 +5,11 @@ import (
"math/rand"
"sort"
"sync"
+
+ "go.opencensus.io/stats"
+
+ "github.com/filecoin-project/lotus/metrics"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
)
type WindowSelector func(sh *Scheduler, queueLen int, acceptableWindows [][]int, windows []SchedWindow) int
@@ -33,9 +38,17 @@ func (a *AssignerCommon) TrySched(sh *Scheduler) {
*/
+ cachedWorkers := &schedWorkerCache{
+ Workers: sh.Workers,
+ cached: map[storiface.WorkerID]*cachedSchedWorker{},
+ }
+
windowsLen := len(sh.OpenWindows)
queueLen := sh.SchedQueue.Len()
+ stats.Record(sh.mctx, metrics.SchedCycleOpenWindows.M(int64(windowsLen)))
+ stats.Record(sh.mctx, metrics.SchedCycleQueueSize.M(int64(queueLen)))
+
log.Debugf("SCHED %d queued; %d open windows", queueLen, windowsLen)
if windowsLen == 0 || queueLen == 0 {
@@ -52,6 +65,12 @@ func (a *AssignerCommon) TrySched(sh *Scheduler) {
// Step 1
throttle := make(chan struct{}, windowsLen)
+ partDone := metrics.Timer(sh.mctx, metrics.SchedAssignerCandidatesDuration)
+ defer func() {
+ // call latest value of partDone in case we error out somewhere
+ partDone()
+ }()
+
var wg sync.WaitGroup
wg.Add(queueLen)
for i := 0; i < queueLen; i++ {
@@ -69,7 +88,7 @@ func (a *AssignerCommon) TrySched(sh *Scheduler) {
var havePreferred bool
for wnd, windowRequest := range sh.OpenWindows {
- worker, ok := sh.Workers[windowRequest.Worker]
+ worker, ok := cachedWorkers.Get(windowRequest.Worker)
if !ok {
log.Errorf("worker referenced by windowRequest not found (worker: %s)", windowRequest.Worker)
// TODO: How to move forward here?
@@ -131,8 +150,8 @@ func (a *AssignerCommon) TrySched(sh *Scheduler) {
return acceptableWindows[sqi][i] < acceptableWindows[sqi][j] // nolint:scopelint
}
- wi := sh.Workers[wii]
- wj := sh.Workers[wji]
+ wi, _ := cachedWorkers.Get(wii)
+ wj, _ := cachedWorkers.Get(wji)
rpcCtx, cancel := context.WithTimeout(task.Ctx, SelectorTimeout)
defer cancel()
@@ -148,13 +167,17 @@ func (a *AssignerCommon) TrySched(sh *Scheduler) {
wg.Wait()
- log.Debugf("SCHED windows: %+v", windows)
log.Debugf("SCHED Acceptable win: %+v", acceptableWindows)
// Step 2
+ partDone()
+ partDone = metrics.Timer(sh.mctx, metrics.SchedAssignerWindowSelectionDuration)
+
scheduled := a.WindowSel(sh, queueLen, acceptableWindows, windows)
// Step 3
+ partDone()
+ partDone = metrics.Timer(sh.mctx, metrics.SchedAssignerSubmitDuration)
if scheduled == 0 {
return
diff --git a/storage/sealer/sched_post.go b/storage/sealer/sched_post.go
index 64986726f..1055227d8 100644
--- a/storage/sealer/sched_post.go
+++ b/storage/sealer/sched_post.go
@@ -169,6 +169,12 @@ func (ps *poStScheduler) watch(wid storiface.WorkerID, worker *WorkerHandle) {
}()
for {
+ select {
+ case <-heartbeatTimer.C:
+ case <-worker.closingMgr:
+ return
+ }
+
sctx, scancel := context.WithTimeout(ctx, paths.HeartbeatInterval/2)
curSes, err := worker.workerRpc.Session(sctx)
scancel()
@@ -177,12 +183,7 @@ func (ps *poStScheduler) watch(wid storiface.WorkerID, worker *WorkerHandle) {
log.Warnw("failed to check worker session", "error", err)
ps.disable(wid)
- select {
- case <-heartbeatTimer.C:
- continue
- case <-worker.closingMgr:
- return
- }
+ continue
}
if storiface.WorkerID(curSes) != wid {
diff --git a/storage/sealer/sched_resources.go b/storage/sealer/sched_resources.go
index 88725f6ba..487e294a2 100644
--- a/storage/sealer/sched_resources.go
+++ b/storage/sealer/sched_resources.go
@@ -1,9 +1,7 @@
package sealer
import (
- "context"
"sync"
- "time"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
@@ -185,20 +183,3 @@ func (wh *WorkerHandle) Utilization() float64 {
return u
}
-
-var tasksCacheTimeout = 30 * time.Second
-
-func (wh *WorkerHandle) TaskTypes(ctx context.Context) (t map[sealtasks.TaskType]struct{}, err error) {
- wh.tasksLk.Lock()
- defer wh.tasksLk.Unlock()
-
- if wh.tasksCache == nil || time.Now().Sub(wh.tasksUpdate) > tasksCacheTimeout {
- wh.tasksCache, err = wh.workerRpc.TaskTypes(ctx)
- if err != nil {
- return nil, err
- }
- wh.tasksUpdate = time.Now()
- }
-
- return wh.tasksCache, nil
-}
diff --git a/storage/sealer/sched_test.go b/storage/sealer/sched_test.go
index a30a4d261..2eed1ce73 100644
--- a/storage/sealer/sched_test.go
+++ b/storage/sealer/sched_test.go
@@ -19,6 +19,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
prooftypes "github.com/filecoin-project/go-state-types/proof"
+ "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer/fsutil"
"github.com/filecoin-project/lotus/storage/sealer/sealtasks"
@@ -67,6 +68,10 @@ type schedTestWorker struct {
ignoreResources bool
}
+func (s *schedTestWorker) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) {
+ panic("implement me")
+}
+
func (s *schedTestWorker) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (storiface.CallID, error) {
panic("implement me")
}
@@ -87,11 +92,11 @@ func (s *schedTestWorker) SealCommit2(ctx context.Context, sector storiface.Sect
panic("implement me")
}
-func (s *schedTestWorker) FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
+func (s *schedTestWorker) FinalizeSector(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) {
panic("implement me")
}
-func (s *schedTestWorker) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) (storiface.CallID, error) {
+func (s *schedTestWorker) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
panic("implement me")
}
@@ -123,7 +128,7 @@ func (s *schedTestWorker) GenerateSectorKeyFromData(ctx context.Context, sector
panic("implement me")
}
-func (s *schedTestWorker) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
+func (s *schedTestWorker) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) {
panic("implement me")
}
@@ -222,7 +227,7 @@ func addTestWorker(t *testing.T, sched *Scheduler, index *paths.Index, name stri
}
func TestSchedStartStop(t *testing.T) {
- sched, err := newScheduler("")
+ sched, err := newScheduler(context.Background(), "")
require.NoError(t, err)
go sched.runSched()
@@ -352,7 +357,7 @@ func TestSched(t *testing.T) {
return func(t *testing.T) {
index := paths.NewIndex(nil)
- sched, err := newScheduler("")
+ sched, err := newScheduler(ctx, "")
require.NoError(t, err)
sched.testSync = make(chan struct{})
@@ -583,18 +588,28 @@ func TestSched(t *testing.T) {
type slowishSelector bool
-func (s slowishSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, a *WorkerHandle) (bool, bool, error) {
- time.Sleep(200 * time.Microsecond)
+func (s slowishSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, a SchedWorker) (bool, bool, error) {
+ // note: we don't care about output here, just the time those calls take
+ // (selector Ok/Cmp is called in the scheduler)
+ _, _ = a.Paths(ctx)
+ _, _ = a.TaskTypes(ctx)
return bool(s), false, nil
}
-func (s slowishSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b *WorkerHandle) (bool, error) {
- time.Sleep(100 * time.Microsecond)
+func (s slowishSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b SchedWorker) (bool, error) {
+ // note: we don't care about output here, just the time those calls take
+ // (selector Ok/Cmp is called in the scheduler)
+ _, _ = a.Paths(ctx)
return true, nil
}
var _ WorkerSelector = slowishSelector(true)
+type tw struct {
+ api.Worker
+ io.Closer
+}
+
func BenchmarkTrySched(b *testing.B) {
logging.SetAllLoggers(logging.LevelInfo)
defer logging.SetAllLoggers(logging.LevelDebug)
@@ -605,14 +620,25 @@ func BenchmarkTrySched(b *testing.B) {
for i := 0; i < b.N; i++ {
b.StopTimer()
- sched, err := newScheduler("")
+ var whnd api.WorkerStruct
+ whnd.Internal.TaskTypes = func(p0 context.Context) (map[sealtasks.TaskType]struct{}, error) {
+ time.Sleep(100 * time.Microsecond)
+ return nil, nil
+ }
+ whnd.Internal.Paths = func(p0 context.Context) ([]storiface.StoragePath, error) {
+ time.Sleep(100 * time.Microsecond)
+ return nil, nil
+ }
+
+ sched, err := newScheduler(ctx, "")
require.NoError(b, err)
sched.Workers[storiface.WorkerID{}] = &WorkerHandle{
- workerRpc: nil,
+ workerRpc: &tw{Worker: &whnd},
Info: storiface.WorkerInfo{
Hostname: "t",
Resources: decentWorkerResources,
},
+ Enabled: true,
preparing: NewActiveResources(),
active: NewActiveResources(),
}
diff --git a/storage/sealer/sched_worker_cache.go b/storage/sealer/sched_worker_cache.go
new file mode 100644
index 000000000..a17bf5674
--- /dev/null
+++ b/storage/sealer/sched_worker_cache.go
@@ -0,0 +1,69 @@
+package sealer
+
+import (
+ "context"
+ "sync"
+
+ "github.com/filecoin-project/lotus/lib/lazy"
+ "github.com/filecoin-project/lotus/storage/sealer/sealtasks"
+ "github.com/filecoin-project/lotus/storage/sealer/storiface"
+)
+
+// schedWorkerCache caches scheduling-related calls to workers
+type schedWorkerCache struct {
+ Workers map[storiface.WorkerID]*WorkerHandle
+
+ lk sync.Mutex
+ cached map[storiface.WorkerID]*cachedSchedWorker
+}
+
+func (s *schedWorkerCache) Get(id storiface.WorkerID) (*cachedSchedWorker, bool) {
+ s.lk.Lock()
+ defer s.lk.Unlock()
+
+ if _, found := s.cached[id]; !found {
+ if _, found := s.Workers[id]; !found {
+ return nil, false
+ }
+
+ whnd := s.Workers[id]
+
+ s.cached[id] = &cachedSchedWorker{
+ tt: lazy.MakeLazyCtx(whnd.workerRpc.TaskTypes),
+ paths: lazy.MakeLazyCtx(whnd.workerRpc.Paths),
+ utilization: lazy.MakeLazy(func() (float64, error) {
+ return whnd.Utilization(), nil
+ }),
+
+ Enabled: whnd.Enabled,
+ Info: whnd.Info,
+ }
+ }
+
+ return s.cached[id], true
+}
+
+type cachedSchedWorker struct {
+ tt *lazy.LazyCtx[map[sealtasks.TaskType]struct{}]
+ paths *lazy.LazyCtx[[]storiface.StoragePath]
+ utilization *lazy.Lazy[float64]
+
+ Enabled bool
+ Info storiface.WorkerInfo
+}
+
+func (c *cachedSchedWorker) TaskTypes(ctx context.Context) (map[sealtasks.TaskType]struct{}, error) {
+ return c.tt.Val(ctx)
+}
+
+func (c *cachedSchedWorker) Paths(ctx context.Context) ([]storiface.StoragePath, error) {
+ return c.paths.Get(ctx)
+}
+
+func (c *cachedSchedWorker) Utilization() float64 {
+ // can't error
+ v, _ := c.utilization.Val()
+ return v
+}
+
+var _ SchedWorker = &cachedSchedWorker{}
diff --git a/storage/sealer/sealtasks/task.go b/storage/sealer/sealtasks/task.go
index 53aa1cbc7..bbf33b159 100644
--- a/storage/sealer/sealtasks/task.go
+++ b/storage/sealer/sealtasks/task.go
@@ -20,7 +20,8 @@ const (
TTCommit1 TaskType = "seal/v0/commit/1"
TTCommit2 TaskType = "seal/v0/commit/2"
- TTFinalize TaskType = "seal/v0/finalize"
+ TTFinalize TaskType = "seal/v0/finalize"
+ TTFinalizeUnsealed TaskType = "seal/v0/finalizeunsealed"
TTFetch TaskType = "seal/v0/fetch"
TTUnseal TaskType = "seal/v0/unseal"
@@ -31,6 +32,8 @@ const (
TTRegenSectorKey TaskType = "seal/v0/regensectorkey"
TTFinalizeReplicaUpdate TaskType = "seal/v0/finalize/replicaupdate"
+ TTDownloadSector TaskType = "seal/v0/download/sector"
+
TTGenerateWindowPoSt TaskType = "post/v0/windowproof"
TTGenerateWinningPoSt TaskType = "post/v0/winningproof"
)
@@ -48,11 +51,13 @@ var order = map[TaskType]int{
TTCommit1: 2,
TTUnseal: 1,
- TTFetch: -1,
- TTFinalize: -2,
+ TTFetch: -1,
+ TTDownloadSector: -2,
+ TTFinalize: -3,
+ TTFinalizeUnsealed: -4,
- TTGenerateWindowPoSt: -3,
- TTGenerateWinningPoSt: -4, // most priority
+ TTGenerateWindowPoSt: -5,
+ TTGenerateWinningPoSt: -6, // most priority
}
var shortNames = map[TaskType]string{
@@ -64,7 +69,8 @@ var shortNames = map[TaskType]string{
TTCommit1: "C1",
TTCommit2: "C2",
- TTFinalize: "FIN",
+ TTFinalize: "FIN",
+ TTFinalizeUnsealed: "FUS",
TTFetch: "GET",
TTUnseal: "UNS",
@@ -75,6 +81,8 @@ var shortNames = map[TaskType]string{
TTRegenSectorKey: "GSK",
TTFinalizeReplicaUpdate: "FRU",
+ TTDownloadSector: "DL",
+
TTGenerateWindowPoSt: "WDP",
TTGenerateWinningPoSt: "WNP",
}
diff --git a/storage/sealer/selector_alloc.go b/storage/sealer/selector_alloc.go
index ce64820f7..130f74461 100644
--- a/storage/sealer/selector_alloc.go
+++ b/storage/sealer/selector_alloc.go
@@ -26,7 +26,7 @@ func newAllocSelector(index paths.SectorIndex, alloc storiface.SectorFileType, p
}
}
-func (s *allocSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd *WorkerHandle) (bool, bool, error) {
+func (s *allocSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd SchedWorker) (bool, bool, error) {
tasks, err := whnd.TaskTypes(ctx)
if err != nil {
return false, false, xerrors.Errorf("getting supported worker task types: %w", err)
@@ -35,7 +35,7 @@ func (s *allocSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi
return false, false, nil
}
- paths, err := whnd.workerRpc.Paths(ctx)
+ paths, err := whnd.Paths(ctx)
if err != nil {
return false, false, xerrors.Errorf("getting worker paths: %w", err)
}
@@ -71,7 +71,7 @@ func (s *allocSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi
return requested == storiface.FTNone, false, nil
}
-func (s *allocSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b *WorkerHandle) (bool, error) {
+func (s *allocSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b SchedWorker) (bool, error) {
return a.Utilization() < b.Utilization(), nil
}
diff --git a/storage/sealer/selector_existing.go b/storage/sealer/selector_existing.go
index 830213f1e..c1e082db8 100644
--- a/storage/sealer/selector_existing.go
+++ b/storage/sealer/selector_existing.go
@@ -28,7 +28,7 @@ func newExistingSelector(index paths.SectorIndex, sector abi.SectorID, alloc sto
}
}
-func (s *existingSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd *WorkerHandle) (bool, bool, error) {
+func (s *existingSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd SchedWorker) (bool, bool, error) {
tasks, err := whnd.TaskTypes(ctx)
if err != nil {
return false, false, xerrors.Errorf("getting supported worker task types: %w", err)
@@ -37,7 +37,7 @@ func (s *existingSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt
return false, false, nil
}
- paths, err := whnd.workerRpc.Paths(ctx)
+ paths, err := whnd.Paths(ctx)
if err != nil {
return false, false, xerrors.Errorf("getting worker paths: %w", err)
}
@@ -78,7 +78,7 @@ func (s *existingSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt
return requested == storiface.FTNone, false, nil
}
-func (s *existingSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b *WorkerHandle) (bool, error) {
+func (s *existingSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b SchedWorker) (bool, error) {
return a.Utilization() < b.Utilization(), nil
}
diff --git a/storage/sealer/selector_move.go b/storage/sealer/selector_move.go
index c1f402456..fde4b3c59 100644
--- a/storage/sealer/selector_move.go
+++ b/storage/sealer/selector_move.go
@@ -30,7 +30,7 @@ func newMoveSelector(index paths.SectorIndex, sector abi.SectorID, alloc storifa
}
}
-func (s *moveSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd *WorkerHandle) (bool, bool, error) {
+func (s *moveSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd SchedWorker) (bool, bool, error) {
tasks, err := whnd.TaskTypes(ctx)
if err != nil {
return false, false, xerrors.Errorf("getting supported worker task types: %w", err)
@@ -39,7 +39,7 @@ func (s *moveSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.
return false, false, nil
}
- paths, err := whnd.workerRpc.Paths(ctx)
+ paths, err := whnd.Paths(ctx)
if err != nil {
return false, false, xerrors.Errorf("getting worker paths: %w", err)
}
@@ -99,7 +99,7 @@ func (s *moveSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.
return (ok && s.allowRemote) || pref, pref, nil
}
-func (s *moveSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b *WorkerHandle) (bool, error) {
+func (s *moveSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b SchedWorker) (bool, error) {
return a.Utilization() < b.Utilization(), nil
}
diff --git a/storage/sealer/selector_task.go b/storage/sealer/selector_task.go
index cc12b514e..805fcbbd0 100644
--- a/storage/sealer/selector_task.go
+++ b/storage/sealer/selector_task.go
@@ -19,7 +19,7 @@ func newTaskSelector() *taskSelector {
return &taskSelector{}
}
-func (s *taskSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd *WorkerHandle) (bool, bool, error) {
+func (s *taskSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.RegisteredSealProof, whnd SchedWorker) (bool, bool, error) {
tasks, err := whnd.TaskTypes(ctx)
if err != nil {
return false, false, xerrors.Errorf("getting supported worker task types: %w", err)
@@ -29,7 +29,7 @@ func (s *taskSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.
return supported, false, nil
}
-func (s *taskSelector) Cmp(ctx context.Context, _ sealtasks.TaskType, a, b *WorkerHandle) (bool, error) {
+func (s *taskSelector) Cmp(ctx context.Context, _ sealtasks.TaskType, a, b SchedWorker) (bool, error) {
atasks, err := a.TaskTypes(ctx)
if err != nil {
return false, xerrors.Errorf("getting supported worker task types: %w", err)
diff --git a/storage/sealer/storiface/cbor_gen.go b/storage/sealer/storiface/cbor_gen.go
index 5b4623175..73a299dec 100644
--- a/storage/sealer/storiface/cbor_gen.go
+++ b/storage/sealer/storiface/cbor_gen.go
@@ -153,3 +153,315 @@ func (t *CallID) UnmarshalCBOR(r io.Reader) (err error) {
return nil
}
+func (t *SecDataHttpHeader) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write([]byte{162}); err != nil {
+ return err
+ }
+
+ // t.Key (string) (string)
+ if len("Key") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"Key\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Key"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("Key")); err != nil {
+ return err
+ }
+
+ if len(t.Key) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.Key was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Key))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.Key)); err != nil {
+ return err
+ }
+
+ // t.Value (string) (string)
+ if len("Value") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"Value\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Value"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("Value")); err != nil {
+ return err
+ }
+
+ if len(t.Value) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.Value was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Value))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.Value)); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (t *SecDataHttpHeader) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = SecDataHttpHeader{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajMap {
+ return fmt.Errorf("cbor input should be of type map")
+ }
+
+ if extra > cbg.MaxLength {
+ return fmt.Errorf("SecDataHttpHeader: map struct too large (%d)", extra)
+ }
+
+ var name string
+ n := extra
+
+ for i := uint64(0); i < n; i++ {
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ name = string(sval)
+ }
+
+ switch name {
+ // t.Key (string) (string)
+ case "Key":
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.Key = string(sval)
+ }
+ // t.Value (string) (string)
+ case "Value":
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.Value = string(sval)
+ }
+
+ default:
+ // Field doesn't exist on this type, so ignore it
+ cbg.ScanForLinks(r, func(cid.Cid) {})
+ }
+ }
+
+ return nil
+}
+func (t *SectorLocation) MarshalCBOR(w io.Writer) error {
+ if t == nil {
+ _, err := w.Write(cbg.CborNull)
+ return err
+ }
+
+ cw := cbg.NewCborWriter(w)
+
+ if _, err := cw.Write([]byte{163}); err != nil {
+ return err
+ }
+
+ // t.Local (bool) (bool)
+ if len("Local") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"Local\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Local"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("Local")); err != nil {
+ return err
+ }
+
+ if err := cbg.WriteBool(w, t.Local); err != nil {
+ return err
+ }
+
+ // t.URL (string) (string)
+ if len("URL") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"URL\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("URL"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("URL")); err != nil {
+ return err
+ }
+
+ if len(t.URL) > cbg.MaxLength {
+ return xerrors.Errorf("Value in field t.URL was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.URL))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string(t.URL)); err != nil {
+ return err
+ }
+
+ // t.Headers ([]storiface.SecDataHttpHeader) (slice)
+ if len("Headers") > cbg.MaxLength {
+ return xerrors.Errorf("Value in field \"Headers\" was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("Headers"))); err != nil {
+ return err
+ }
+ if _, err := io.WriteString(w, string("Headers")); err != nil {
+ return err
+ }
+
+ if len(t.Headers) > cbg.MaxLength {
+ return xerrors.Errorf("Slice value in field t.Headers was too long")
+ }
+
+ if err := cw.WriteMajorTypeHeader(cbg.MajArray, uint64(len(t.Headers))); err != nil {
+ return err
+ }
+ for _, v := range t.Headers {
+ if err := v.MarshalCBOR(cw); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (t *SectorLocation) UnmarshalCBOR(r io.Reader) (err error) {
+ *t = SectorLocation{}
+
+ cr := cbg.NewCborReader(r)
+
+ maj, extra, err := cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
+
+ if maj != cbg.MajMap {
+ return fmt.Errorf("cbor input should be of type map")
+ }
+
+ if extra > cbg.MaxLength {
+ return fmt.Errorf("SectorLocation: map struct too large (%d)", extra)
+ }
+
+ var name string
+ n := extra
+
+ for i := uint64(0); i < n; i++ {
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ name = string(sval)
+ }
+
+ switch name {
+ // t.Local (bool) (bool)
+ case "Local":
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+ if maj != cbg.MajOther {
+ return fmt.Errorf("booleans must be major type 7")
+ }
+ switch extra {
+ case 20:
+ t.Local = false
+ case 21:
+ t.Local = true
+ default:
+ return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra)
+ }
+ // t.URL (string) (string)
+ case "URL":
+
+ {
+ sval, err := cbg.ReadString(cr)
+ if err != nil {
+ return err
+ }
+
+ t.URL = string(sval)
+ }
+ // t.Headers ([]storiface.SecDataHttpHeader) (slice)
+ case "Headers":
+
+ maj, extra, err = cr.ReadHeader()
+ if err != nil {
+ return err
+ }
+
+ if extra > cbg.MaxLength {
+ return fmt.Errorf("t.Headers: array too large (%d)", extra)
+ }
+
+ if maj != cbg.MajArray {
+ return fmt.Errorf("expected cbor array")
+ }
+
+ if extra > 0 {
+ t.Headers = make([]SecDataHttpHeader, extra)
+ }
+
+ for i := 0; i < int(extra); i++ {
+
+ var v SecDataHttpHeader
+ if err := v.UnmarshalCBOR(cr); err != nil {
+ return err
+ }
+
+ t.Headers[i] = v
+ }
+
+ default:
+ // Field doesn't exist on this type, so ignore it
+ cbg.ScanForLinks(r, func(cid.Cid) {})
+ }
+ }
+
+ return nil
+}
diff --git a/storage/sealer/storiface/filetype.go b/storage/sealer/storiface/filetype.go
index 4660dd2a7..ec3c5450c 100644
--- a/storage/sealer/storiface/filetype.go
+++ b/storage/sealer/storiface/filetype.go
@@ -83,7 +83,7 @@ func (t SectorFileType) String() string {
case FTUpdateCache:
return "update-cache"
default:
- return fmt.Sprintf("", t)
+ return fmt.Sprintf("", t, (t & ((1 << FileTypes) - 1)).Strings())
}
}
diff --git a/storage/sealer/storiface/storage.go b/storage/sealer/storiface/storage.go
index 2271c95b0..b63c0480d 100644
--- a/storage/sealer/storiface/storage.go
+++ b/storage/sealer/storiface/storage.go
@@ -3,6 +3,7 @@ package storiface
import (
"context"
"io"
+ "net/http"
"github.com/ipfs/go-cid"
@@ -62,13 +63,17 @@ type Sealer interface {
SealCommit1(ctx context.Context, sector SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids SectorCids) (Commit1Out, error)
SealCommit2(ctx context.Context, sector SectorRef, c1o Commit1Out) (Proof, error)
- FinalizeSector(ctx context.Context, sector SectorRef, keepUnsealed []Range) error
+ FinalizeSector(ctx context.Context, sector SectorRef) error
// ReleaseUnsealed marks parts of the unsealed sector file as safe to drop
// (called by the fsm on restart, allows storage to keep no persistent
// state about unsealed fast-retrieval copies)
- ReleaseUnsealed(ctx context.Context, sector SectorRef, safeToFree []Range) error
+ ReleaseUnsealed(ctx context.Context, sector SectorRef, keepUnsealed []Range) error
+ // ReleaseSectorKey removes `sealed` from all storage
+ // called after successful sector upgrade
ReleaseSectorKey(ctx context.Context, sector SectorRef) error
+ // ReleaseReplicaUpgrade removes `update` / `update-cache` from all storage
+ // called when aborting sector upgrade
ReleaseReplicaUpgrade(ctx context.Context, sector SectorRef) error
// Removes all data associated with the specified sector
@@ -84,7 +89,9 @@ type Sealer interface {
// GenerateSectorKeyFromData computes sector key given unsealed data and updated replica
GenerateSectorKeyFromData(ctx context.Context, sector SectorRef, unsealed cid.Cid) error
- FinalizeReplicaUpdate(ctx context.Context, sector SectorRef, keepUnsealed []Range) error
+ FinalizeReplicaUpdate(ctx context.Context, sector SectorRef) error
+
+ DownloadSectorData(ctx context.Context, sector SectorRef, finalized bool, src map[SectorFileType]SectorLocation) error
}
type Unsealer interface {
@@ -119,3 +126,92 @@ type Prover interface {
AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error)
}
+
+type SectorLocation struct {
+ // Local when set to true indicates to lotus that sector data is already
+ // available locally; When set lotus will skip fetching sector data, and
+ // only check that sector data exists in sector storage
+ Local bool
+
+ // URL to the sector data
+ // For sealed/unsealed sector, lotus expects octet-stream
+ // For cache, lotus expects a tar archive with cache files
+ // Valid schemas:
+ // - http:// / https://
+ URL string
+
+ // optional http headers to use when requesting sector data
+ Headers []SecDataHttpHeader
+}
+
+func (sd *SectorLocation) HttpHeaders() http.Header {
+ out := http.Header{}
+ for _, header := range sd.Headers {
+ out[header.Key] = append(out[header.Key], header.Value)
+ }
+ return out
+}
+
+// note: we can't use http.Header as that's backed by a go map, which is all kinds of messy
+type SecDataHttpHeader struct {
+ Key string
+ Value string
+}
+
+// StorageConfig .lotusstorage/storage.json
+type StorageConfig struct {
+ StoragePaths []LocalPath
+}
+
+type LocalPath struct {
+ Path string
+}
+
+// LocalStorageMeta [path]/sectorstore.json
+type LocalStorageMeta struct {
+ ID ID
+
+ // A high weight means data is more likely to be stored in this path
+ Weight uint64 // 0 = readonly
+
+ // Intermediate data for the sealing process will be stored here
+ CanSeal bool
+
+ // Finalized sectors that will be proved over time will be stored here
+ CanStore bool
+
+ // MaxStorage specifies the maximum number of bytes to use for sector storage
+ // (0 = unlimited)
+ MaxStorage uint64
+
+ // List of storage groups this path belongs to
+ Groups []string
+
+ // List of storage groups to which data from this path can be moved. If none
+ // are specified, allow to all
+ AllowTo []string
+
+ // AllowTypes lists sector file types which are allowed to be put into this
+ // path. If empty, all file types are allowed.
+ //
+ // Valid values:
+ // - "unsealed"
+ // - "sealed"
+ // - "cache"
+ // - "update"
+ // - "update-cache"
+ // Any other value will generate a warning and be ignored.
+ AllowTypes []string
+
+ // DenyTypes lists sector file types which aren't allowed to be put into this
+ // path.
+ //
+ // Valid values:
+ // - "unsealed"
+ // - "sealed"
+ // - "cache"
+ // - "update"
+ // - "update-cache"
+ // Any other value will generate a warning and be ignored.
+ DenyTypes []string
+}
diff --git a/storage/sealer/storiface/worker.go b/storage/sealer/storiface/worker.go
index 5d2781ec8..3cbf9f737 100644
--- a/storage/sealer/storiface/worker.go
+++ b/storage/sealer/storiface/worker.go
@@ -124,8 +124,8 @@ type WorkerCalls interface {
SealPreCommit2(ctx context.Context, sector SectorRef, pc1o PreCommit1Out) (CallID, error)
SealCommit1(ctx context.Context, sector SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids SectorCids) (CallID, error)
SealCommit2(ctx context.Context, sector SectorRef, c1o Commit1Out) (CallID, error)
- FinalizeSector(ctx context.Context, sector SectorRef, keepUnsealed []Range) (CallID, error)
- FinalizeReplicaUpdate(ctx context.Context, sector SectorRef, keepUnsealed []Range) (CallID, error)
+ FinalizeSector(ctx context.Context, sector SectorRef) (CallID, error)
+ FinalizeReplicaUpdate(ctx context.Context, sector SectorRef) (CallID, error)
ReleaseUnsealed(ctx context.Context, sector SectorRef, safeToFree []Range) (CallID, error)
ReplicaUpdate(ctx context.Context, sector SectorRef, pieces []abi.PieceInfo) (CallID, error)
ProveReplicaUpdate1(ctx context.Context, sector SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (CallID, error)
@@ -134,6 +134,7 @@ type WorkerCalls interface {
MoveStorage(ctx context.Context, sector SectorRef, types SectorFileType) (CallID, error)
UnsealPiece(context.Context, SectorRef, UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (CallID, error)
Fetch(context.Context, SectorRef, SectorFileType, PathType, AcquireMode) (CallID, error)
+ DownloadSectorData(ctx context.Context, sector SectorRef, finalized bool, src map[SectorFileType]SectorLocation) (CallID, error)
// sync
GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error)
@@ -215,5 +216,6 @@ type WorkerReturn interface {
ReturnMoveStorage(ctx context.Context, callID CallID, err *CallError) error
ReturnUnsealPiece(ctx context.Context, callID CallID, err *CallError) error
ReturnReadPiece(ctx context.Context, callID CallID, ok bool, err *CallError) error
+ ReturnDownloadSector(ctx context.Context, callID CallID, err *CallError) error
ReturnFetch(ctx context.Context, callID CallID, err *CallError) error
}
diff --git a/storage/sealer/tarutil/systar.go b/storage/sealer/tarutil/systar.go
index 2d7bc34a5..4372cc8c7 100644
--- a/storage/sealer/tarutil/systar.go
+++ b/storage/sealer/tarutil/systar.go
@@ -3,9 +3,9 @@ package tarutil
import (
"archive/tar"
"io"
- "io/ioutil"
"os"
"path/filepath"
+ "strings"
logging "github.com/ipfs/go-log/v2"
"golang.org/x/xerrors"
@@ -13,38 +13,110 @@ import (
var log = logging.Logger("tarutil") // nolint
-func ExtractTar(body io.Reader, dir string, buf []byte) error {
+var CacheFileConstraints = map[string]int64{
+ "p_aux": 64,
+ "t_aux": 10240,
+
+ "sc-02-data-tree-r-last.dat": 10_000_000, // small sectors
+
+ "sc-02-data-tree-r-last-0.dat": 10_000_000,
+ "sc-02-data-tree-r-last-1.dat": 10_000_000,
+ "sc-02-data-tree-r-last-2.dat": 10_000_000,
+ "sc-02-data-tree-r-last-3.dat": 10_000_000,
+ "sc-02-data-tree-r-last-4.dat": 10_000_000,
+ "sc-02-data-tree-r-last-5.dat": 10_000_000,
+ "sc-02-data-tree-r-last-6.dat": 10_000_000,
+ "sc-02-data-tree-r-last-7.dat": 10_000_000,
+
+ "sc-02-data-tree-r-last-8.dat": 10_000_000,
+ "sc-02-data-tree-r-last-9.dat": 10_000_000,
+ "sc-02-data-tree-r-last-10.dat": 10_000_000,
+ "sc-02-data-tree-r-last-11.dat": 10_000_000,
+ "sc-02-data-tree-r-last-12.dat": 10_000_000,
+ "sc-02-data-tree-r-last-13.dat": 10_000_000,
+ "sc-02-data-tree-r-last-14.dat": 10_000_000,
+ "sc-02-data-tree-r-last-15.dat": 10_000_000,
+
+ "sc-02-data-layer-1.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-2.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-3.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-4.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-5.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-6.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-7.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-8.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-9.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-10.dat": 65 << 30, // 1x sector size + small buffer
+ "sc-02-data-layer-11.dat": 65 << 30, // 1x sector size + small buffer
+
+ "sc-02-data-tree-c-0.dat": 5 << 30, // ~4.6G
+ "sc-02-data-tree-c-1.dat": 5 << 30,
+ "sc-02-data-tree-c-2.dat": 5 << 30,
+ "sc-02-data-tree-c-3.dat": 5 << 30,
+ "sc-02-data-tree-c-4.dat": 5 << 30,
+ "sc-02-data-tree-c-5.dat": 5 << 30,
+ "sc-02-data-tree-c-6.dat": 5 << 30,
+ "sc-02-data-tree-c-7.dat": 5 << 30,
+
+ "sc-02-data-tree-c-8.dat": 5 << 30,
+ "sc-02-data-tree-c-9.dat": 5 << 30,
+ "sc-02-data-tree-c-10.dat": 5 << 30,
+ "sc-02-data-tree-c-11.dat": 5 << 30,
+ "sc-02-data-tree-c-12.dat": 5 << 30,
+ "sc-02-data-tree-c-13.dat": 5 << 30,
+ "sc-02-data-tree-c-14.dat": 5 << 30,
+ "sc-02-data-tree-c-15.dat": 5 << 30,
+
+ "sc-02-data-tree-d.dat": 130 << 30, // 2x sector size, ~130G accunting for small buffer on 64G sectors
+}
+
+func ExtractTar(body io.Reader, dir string, buf []byte) (int64, error) {
if err := os.MkdirAll(dir, 0755); err != nil { // nolint
- return xerrors.Errorf("mkdir: %w", err)
+ return 0, xerrors.Errorf("mkdir: %w", err)
}
tr := tar.NewReader(body)
+ var read int64
for {
header, err := tr.Next()
switch err {
default:
- return err
+ return read, err
case io.EOF:
- return nil
+ return read, nil
case nil:
}
- //nolint:gosec
- f, err := os.Create(filepath.Join(dir, header.Name))
- if err != nil {
- //nolint:gosec
- return xerrors.Errorf("creating file %s: %w", filepath.Join(dir, header.Name), err)
+ sz, found := CacheFileConstraints[header.Name]
+ if !found {
+ return read, xerrors.Errorf("tar file %#v isn't expected", header.Name)
+ }
+ if header.Size > sz {
+ return read, xerrors.Errorf("tar file %#v is bigger than expected: %d > %d", header.Name, header.Size, sz)
}
- // This data is coming from a trusted source, no need to check the size.
- //nolint:gosec
- if _, err := io.CopyBuffer(f, tr, buf); err != nil {
- return err
+ out := filepath.Join(dir, header.Name) //nolint:gosec
+
+ if !strings.HasPrefix(out, filepath.Clean(dir)) {
+ return read, xerrors.Errorf("unsafe tar path %#v (must be within %#v)", out, filepath.Clean(dir))
+ }
+
+ f, err := os.Create(out)
+ if err != nil {
+ return read, xerrors.Errorf("creating file %s: %w", out, err)
+ }
+
+ ltr := io.LimitReader(tr, header.Size)
+
+ r, err := io.CopyBuffer(f, ltr, buf)
+ read += r
+ if err != nil {
+ return read, err
}
if err := f.Close(); err != nil {
- return err
+ return read, err
}
}
}
@@ -52,13 +124,18 @@ func ExtractTar(body io.Reader, dir string, buf []byte) error {
func TarDirectory(dir string, w io.Writer, buf []byte) error {
tw := tar.NewWriter(w)
- files, err := ioutil.ReadDir(dir)
+ files, err := os.ReadDir(dir)
if err != nil {
return err
}
for _, file := range files {
- h, err := tar.FileInfoHeader(file, "")
+ info, err := file.Info()
+ if err != nil {
+ return xerrors.Errorf("getting file info for file %s: %w", file.Name(), err)
+ }
+
+ h, err := tar.FileInfoHeader(info, "")
if err != nil {
return xerrors.Errorf("getting header for file %s: %w", file.Name(), err)
}
diff --git a/storage/sealer/teststorage_test.go b/storage/sealer/teststorage_test.go
index f88aa9355..a074dc20a 100644
--- a/storage/sealer/teststorage_test.go
+++ b/storage/sealer/teststorage_test.go
@@ -21,6 +21,10 @@ type testExec struct {
apch chan chan apres
}
+func (t *testExec) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) error {
+ panic("implement me")
+}
+
func (t *testExec) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (abi.PieceInfo, error) {
panic("implement me")
}
@@ -57,11 +61,11 @@ func (t *testExec) SealCommit2(ctx context.Context, sector storiface.SectorRef,
panic("implement me")
}
-func (t *testExec) FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
+func (t *testExec) FinalizeSector(ctx context.Context, sector storiface.SectorRef) error {
panic("implement me")
}
-func (t *testExec) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) error {
+func (t *testExec) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
panic("implement me")
}
@@ -97,7 +101,7 @@ func (t *testExec) GenerateSectorKeyFromData(ctx context.Context, sector storifa
panic("implement me")
}
-func (t *testExec) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) error {
+func (t *testExec) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) error {
panic("implement me")
}
diff --git a/storage/sealer/worker_local.go b/storage/sealer/worker_local.go
index 1311f2f2c..7f141780c 100644
--- a/storage/sealer/worker_local.go
+++ b/storage/sealer/worker_local.go
@@ -202,6 +202,7 @@ const (
ReleaseUnsealed ReturnType = "ReleaseUnsealed"
MoveStorage ReturnType = "MoveStorage"
UnsealPiece ReturnType = "UnsealPiece"
+ DownloadSector ReturnType = "DownloadSector"
Fetch ReturnType = "Fetch"
)
@@ -255,6 +256,7 @@ var returnFunc = map[ReturnType]func(context.Context, storiface.CallID, storifac
FinalizeReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnFinalizeReplicaUpdate),
MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage),
UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece),
+ DownloadSector: rfunc(storiface.WorkerReturn.ReturnDownloadSector),
Fetch: rfunc(storiface.WorkerReturn.ReturnFetch),
}
@@ -479,35 +481,36 @@ func (l *LocalWorker) GenerateSectorKeyFromData(ctx context.Context, sector stor
})
}
-func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
+func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) {
sb, err := l.executor()
if err != nil {
return storiface.UndefCall, err
}
return l.asyncCall(ctx, sector, FinalizeSector, func(ctx context.Context, ci storiface.CallID) (interface{}, error) {
- if err := sb.FinalizeSector(ctx, sector, keepUnsealed); err != nil {
- return nil, xerrors.Errorf("finalizing sector: %w", err)
- }
-
- if len(keepUnsealed) == 0 {
- if err := l.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true, nil); err != nil {
- return nil, xerrors.Errorf("removing unsealed data: %w", err)
- }
- }
-
- return nil, err
+ return nil, sb.FinalizeSector(ctx, sector)
})
}
-func (l *LocalWorker) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
+func (l *LocalWorker) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) {
sb, err := l.executor()
if err != nil {
return storiface.UndefCall, err
}
return l.asyncCall(ctx, sector, FinalizeReplicaUpdate, func(ctx context.Context, ci storiface.CallID) (interface{}, error) {
- if err := sb.FinalizeReplicaUpdate(ctx, sector, keepUnsealed); err != nil {
+ return nil, sb.FinalizeReplicaUpdate(ctx, sector)
+ })
+}
+
+func (l *LocalWorker) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
+ sb, err := l.executor()
+ if err != nil {
+ return storiface.UndefCall, err
+ }
+
+ return l.asyncCall(ctx, sector, ReleaseUnsealed, func(ctx context.Context, ci storiface.CallID) (interface{}, error) {
+ if err := sb.ReleaseUnsealed(ctx, sector, keepUnsealed); err != nil {
return nil, xerrors.Errorf("finalizing sector: %w", err)
}
@@ -521,10 +524,6 @@ func (l *LocalWorker) FinalizeReplicaUpdate(ctx context.Context, sector storifac
})
}
-func (l *LocalWorker) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, safeToFree []storiface.Range) (storiface.CallID, error) {
- return storiface.UndefCall, xerrors.Errorf("implement me")
-}
-
func (l *LocalWorker) Remove(ctx context.Context, sector abi.SectorID) error {
var err error
@@ -586,6 +585,17 @@ func (l *LocalWorker) UnsealPiece(ctx context.Context, sector storiface.SectorRe
})
}
+func (l *LocalWorker) DownloadSectorData(ctx context.Context, sector storiface.SectorRef, finalized bool, src map[storiface.SectorFileType]storiface.SectorLocation) (storiface.CallID, error) {
+ sb, err := l.executor()
+ if err != nil {
+ return storiface.UndefCall, err
+ }
+
+ return l.asyncCall(ctx, sector, DownloadSector, func(ctx context.Context, ci storiface.CallID) (interface{}, error) {
+ return nil, sb.DownloadSectorData(ctx, sector, finalized, src)
+ })
+}
+
func (l *LocalWorker) GenerateWinningPoSt(ctx context.Context, ppt abi.RegisteredPoStProof, mid abi.ActorID, sectors []storiface.PostSectorChallenge, randomness abi.PoStRandomness) ([]proof.PoStProof, error) {
sb, err := l.executor()
if err != nil {
diff --git a/storage/sealer/worker_tracked.go b/storage/sealer/worker_tracked.go
index 970ba9a69..7fce400a0 100644
--- a/storage/sealer/worker_tracked.go
+++ b/storage/sealer/worker_tracked.go
@@ -183,8 +183,12 @@ func (t *trackedWorker) SealCommit2(ctx context.Context, sector storiface.Sector
return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTCommit2, func() (storiface.CallID, error) { return t.Worker.SealCommit2(ctx, sector, c1o) })
}
-func (t *trackedWorker) FinalizeSector(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
- return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalize, func() (storiface.CallID, error) { return t.Worker.FinalizeSector(ctx, sector, keepUnsealed) })
+func (t *trackedWorker) FinalizeSector(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) {
+ return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalize, func() (storiface.CallID, error) { return t.Worker.FinalizeSector(ctx, sector) })
+}
+
+func (t *trackedWorker) ReleaseUnsealed(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
+ return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalizeUnsealed, func() (storiface.CallID, error) { return t.Worker.ReleaseUnsealed(ctx, sector, keepUnsealed) })
}
func (t *trackedWorker) DataCid(ctx context.Context, pieceSize abi.UnpaddedPieceSize, pieceData storiface.Data) (storiface.CallID, error) {
@@ -225,8 +229,8 @@ func (t *trackedWorker) ProveReplicaUpdate2(ctx context.Context, sector storifac
})
}
-func (t *trackedWorker) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef, keepUnsealed []storiface.Range) (storiface.CallID, error) {
- return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalizeReplicaUpdate, func() (storiface.CallID, error) { return t.Worker.FinalizeReplicaUpdate(ctx, sector, keepUnsealed) })
+func (t *trackedWorker) FinalizeReplicaUpdate(ctx context.Context, sector storiface.SectorRef) (storiface.CallID, error) {
+ return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTFinalizeReplicaUpdate, func() (storiface.CallID, error) { return t.Worker.FinalizeReplicaUpdate(ctx, sector) })
}
var _ Worker = &trackedWorker{}
diff --git a/storage/wdpost/wdpost_changehandler.go b/storage/wdpost/wdpost_changehandler.go
index 5778aaf9d..266b8b042 100644
--- a/storage/wdpost/wdpost_changehandler.go
+++ b/storage/wdpost/wdpost_changehandler.go
@@ -6,7 +6,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/lotus/chain/types"
diff --git a/storage/wdpost/wdpost_changehandler_test.go b/storage/wdpost/wdpost_changehandler_test.go
index 3e7ca3f49..dac6c4558 100644
--- a/storage/wdpost/wdpost_changehandler_test.go
+++ b/storage/wdpost/wdpost_changehandler_test.go
@@ -13,7 +13,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
tutils "github.com/filecoin-project/specs-actors/support/testing"
diff --git a/storage/wdpost/wdpost_journal.go b/storage/wdpost/wdpost_journal.go
index b4c790eb0..406628f68 100644
--- a/storage/wdpost/wdpost_journal.go
+++ b/storage/wdpost/wdpost_journal.go
@@ -4,7 +4,7 @@ import (
"github.com/ipfs/go-cid"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/dline"
)
diff --git a/storage/wdpost/wdpost_run.go b/storage/wdpost/wdpost_run.go
index 0501923b0..0518bd760 100644
--- a/storage/wdpost/wdpost_run.go
+++ b/storage/wdpost/wdpost_run.go
@@ -7,6 +7,7 @@ import (
"github.com/ipfs/go-cid"
"go.opencensus.io/trace"
+ "go.uber.org/zap"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
@@ -14,7 +15,7 @@ import (
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/go-state-types/network"
@@ -253,6 +254,14 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, manual bool, di
ctx, span := trace.StartSpan(ctx, "storage.runPoStCycle")
defer span.End()
+ start := time.Now()
+
+ log := log.WithOptions(zap.Fields(zap.Time("cycle", start)))
+ log.Infow("starting PoSt cycle", "manual", manual, "ts", ts, "deadline", di.Index)
+ defer func() {
+ log.Infow("post cycle done", "took", time.Now().Sub(start))
+ }()
+
if !manual {
// TODO: extract from runPoStCycle, run on fault cutoff boundaries
s.asyncFaultRecover(di, ts)
@@ -286,7 +295,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, manual bool, di
// Split partitions into batches, so as not to exceed the number of sectors
// allowed in a single message
- partitionBatches, err := s.batchPartitions(partitions, nv)
+ partitionBatches, err := s.BatchPartitions(partitions, nv)
if err != nil {
return nil, err
}
@@ -492,7 +501,9 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, manual bool, di
return posts, nil
}
-func (s *WindowPoStScheduler) batchPartitions(partitions []api.Partition, nv network.Version) ([][]api.Partition, error) {
+// Note: Partition order within batches must match original partition order in order
+// for code following the user code to work
+func (s *WindowPoStScheduler) BatchPartitions(partitions []api.Partition, nv network.Version) ([][]api.Partition, error) {
// We don't want to exceed the number of sectors allowed in a message.
// So given the number of sectors in a partition, work out the number of
// partitions that can be in a message without exceeding sectors per
@@ -524,21 +535,33 @@ func (s *WindowPoStScheduler) batchPartitions(partitions []api.Partition, nv net
}
}
- // The number of messages will be:
- // ceiling(number of partitions / partitions per message)
- batchCount := len(partitions) / partitionsPerMsg
- if len(partitions)%partitionsPerMsg != 0 {
- batchCount++
- }
+ batches := [][]api.Partition{}
- // Split the partitions into batches
- batches := make([][]api.Partition, 0, batchCount)
- for i := 0; i < len(partitions); i += partitionsPerMsg {
- end := i + partitionsPerMsg
- if end > len(partitions) {
- end = len(partitions)
+ currBatch := []api.Partition{}
+ for _, partition := range partitions {
+ recSectors, err := partition.RecoveringSectors.Count()
+ if err != nil {
+ return nil, err
}
- batches = append(batches, partitions[i:end])
+
+ // Only add single partition to a batch if it contains recovery sectors
+ // and has the below user config set
+ if s.singleRecoveringPartitionPerPostMessage && recSectors > 0 {
+ if len(currBatch) > 0 {
+ batches = append(batches, currBatch)
+ currBatch = []api.Partition{}
+ }
+ batches = append(batches, []api.Partition{partition})
+ } else {
+ if len(currBatch) >= partitionsPerMsg {
+ batches = append(batches, currBatch)
+ currBatch = []api.Partition{}
+ }
+ currBatch = append(currBatch, partition)
+ }
+ }
+ if len(currBatch) > 0 {
+ batches = append(batches, currBatch)
}
return batches, nil
diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go
index 9e9854a7c..2474ce77b 100644
--- a/storage/wdpost/wdpost_run_faults.go
+++ b/storage/wdpost/wdpost_run_faults.go
@@ -14,7 +14,7 @@ import (
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/lotus/api"
diff --git a/storage/wdpost/wdpost_run_test.go b/storage/wdpost/wdpost_run_test.go
index 466fd6905..140e0886e 100644
--- a/storage/wdpost/wdpost_run_test.go
+++ b/storage/wdpost/wdpost_run_test.go
@@ -13,9 +13,10 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
+ actorstypes "github.com/filecoin-project/go-state-types/actors"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
- minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ minertypes "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/go-state-types/network"
@@ -52,7 +53,7 @@ func (m *mockStorageMinerAPI) StateMinerInfo(ctx context.Context, a address.Addr
}
func (m *mockStorageMinerAPI) StateNetworkVersion(ctx context.Context, key types.TipSetKey) (network.Version, error) {
- return build.NewestNetworkVersion, nil
+ return build.TestNetworkVersion, nil
}
func (m *mockStorageMinerAPI) StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) {
@@ -176,6 +177,26 @@ func (m mockFaultTracker) CheckProvable(ctx context.Context, pp abi.RegisteredPo
return map[abi.SectorID]string{}, nil
}
+func generatePartition(sectorCount uint64, recoverySectorCount uint64) api.Partition {
+ var partition api.Partition
+ sectors := bitfield.New()
+ recoverySectors := bitfield.New()
+ for s := uint64(0); s < sectorCount; s++ {
+ sectors.Set(s)
+ }
+ for s := uint64(0); s < recoverySectorCount; s++ {
+ recoverySectors.Set(s)
+ }
+ partition = api.Partition{
+ AllSectors: sectors,
+ FaultySectors: bitfield.New(),
+ RecoveringSectors: recoverySectors,
+ LiveSectors: sectors,
+ ActiveSectors: sectors,
+ }
+ return partition
+}
+
// TestWDPostDoPost verifies that doPost will send the correct number of window
// PoST messages for a given number of partitions
func TestWDPostDoPost(t *testing.T) {
@@ -367,6 +388,55 @@ func TestWDPostDoPostPartLimitConfig(t *testing.T) {
}
}
+// TestBatchPartitionsRecoverySectors tests if the batches with recovery sectors
+// contain only single partitions while keeping all the partitions in order
+func TestBatchPartitionsRecoverySectors(t *testing.T) {
+
+ proofType := abi.RegisteredPoStProof_StackedDrgWindow2KiBV1
+ postAct := tutils.NewIDAddr(t, 100)
+
+ mockStgMinerAPI := newMockStorageMinerAPI()
+
+ userPartLimit := 4
+
+ scheduler := &WindowPoStScheduler{
+ api: mockStgMinerAPI,
+ prover: &mockProver{},
+ verifier: &mockVerif{},
+ faultTracker: &mockFaultTracker{},
+ proofType: proofType,
+ actor: postAct,
+ journal: journal.NilJournal(),
+ addrSel: &ctladdr.AddressSelector{},
+
+ maxPartitionsPerPostMessage: userPartLimit,
+ singleRecoveringPartitionPerPostMessage: true,
+ }
+
+ var partitions []api.Partition
+ for p := 0; p < 4; p++ {
+ partitions = append(partitions, generatePartition(100, 0))
+ }
+ for p := 0; p < 2; p++ {
+ partitions = append(partitions, generatePartition(100, 10))
+ }
+ for p := 0; p < 6; p++ {
+ partitions = append(partitions, generatePartition(100, 0))
+ }
+ partitions = append(partitions, generatePartition(100, 10))
+
+ expectedBatchLens := []int{4, 1, 1, 4, 2, 1}
+
+ batches, err := scheduler.BatchPartitions(partitions, network.Version16)
+ require.NoError(t, err)
+
+ require.Equal(t, len(batches), 6)
+
+ for i, batch := range batches {
+ require.Equal(t, len(batch), expectedBatchLens[i])
+ }
+}
+
// TestWDPostDeclareRecoveriesPartLimitConfig verifies that declareRecoveries will send the correct number of
// DeclareFaultsRecovered messages for a given number of partitions based on user config
func TestWDPostDeclareRecoveriesPartLimitConfig(t *testing.T) {
@@ -500,7 +570,7 @@ func (m *mockStorageMinerAPI) StateMinerProvingDeadline(ctx context.Context, add
}
func (m *mockStorageMinerAPI) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) {
- code, ok := actors.GetActorCodeID(actors.Version7, actors.MinerKey)
+ code, ok := actors.GetActorCodeID(actorstypes.Version7, actors.MinerKey)
if !ok {
return nil, xerrors.Errorf("failed to get miner actor code ID for actors version %d", actors.Version7)
}
diff --git a/storage/wdpost/wdpost_sched.go b/storage/wdpost/wdpost_sched.go
index 66722e283..29c39ad9e 100644
--- a/storage/wdpost/wdpost_sched.go
+++ b/storage/wdpost/wdpost_sched.go
@@ -12,7 +12,7 @@ import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/builtin/v8/miner"
+ "github.com/filecoin-project/go-state-types/builtin/v9/miner"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/dline"
"github.com/filecoin-project/go-state-types/network"
@@ -64,18 +64,19 @@ type NodeAPI interface {
// WindowPoStScheduler watches the chain though the changeHandler, which in turn
// turn calls the scheduler when the time arrives to do work.
type WindowPoStScheduler struct {
- api NodeAPI
- feeCfg config.MinerFeeConfig
- addrSel *ctladdr.AddressSelector
- prover storiface.ProverPoSt
- verifier storiface.Verifier
- faultTracker sealer.FaultTracker
- proofType abi.RegisteredPoStProof
- partitionSectors uint64
- disablePreChecks bool
- maxPartitionsPerPostMessage int
- maxPartitionsPerRecoveryMessage int
- ch *changeHandler
+ api NodeAPI
+ feeCfg config.MinerFeeConfig
+ addrSel *ctladdr.AddressSelector
+ prover storiface.ProverPoSt
+ verifier storiface.Verifier
+ faultTracker sealer.FaultTracker
+ proofType abi.RegisteredPoStProof
+ partitionSectors uint64
+ disablePreChecks bool
+ maxPartitionsPerPostMessage int
+ maxPartitionsPerRecoveryMessage int
+ singleRecoveringPartitionPerPostMessage bool
+ ch *changeHandler
actor address.Address
@@ -102,18 +103,19 @@ func NewWindowedPoStScheduler(api NodeAPI,
}
return &WindowPoStScheduler{
- api: api,
- feeCfg: cfg,
- addrSel: as,
- prover: sp,
- verifier: verif,
- faultTracker: ft,
- proofType: mi.WindowPoStProofType,
- partitionSectors: mi.WindowPoStPartitionSectors,
- disablePreChecks: pcfg.DisableWDPoStPreChecks,
- maxPartitionsPerPostMessage: pcfg.MaxPartitionsPerPoStMessage,
- maxPartitionsPerRecoveryMessage: pcfg.MaxPartitionsPerRecoveryMessage,
- actor: actor,
+ api: api,
+ feeCfg: cfg,
+ addrSel: as,
+ prover: sp,
+ verifier: verif,
+ faultTracker: ft,
+ proofType: mi.WindowPoStProofType,
+ partitionSectors: mi.WindowPoStPartitionSectors,
+ disablePreChecks: pcfg.DisableWDPoStPreChecks,
+ maxPartitionsPerPostMessage: pcfg.MaxPartitionsPerPoStMessage,
+ maxPartitionsPerRecoveryMessage: pcfg.MaxPartitionsPerRecoveryMessage,
+ singleRecoveringPartitionPerPostMessage: pcfg.SingleRecoveringPartitionPerPostMessage,
+ actor: actor,
evtTypes: [...]journal.EventType{
evtTypeWdPoStScheduler: j.RegisterEventType("wdpost", "scheduler"),
evtTypeWdPoStProofs: j.RegisterEventType("wdpost", "proofs_processed"),
diff --git a/testplans/DELVING.md b/testplans/DELVING.md
deleted file mode 100644
index 4c2d36390..000000000
--- a/testplans/DELVING.md
+++ /dev/null
@@ -1,193 +0,0 @@
-# Delving into the unknown
-
-This write-up summarises how to debug what appears to be a mischievous Lotus
-instance during our Testground tests. It also goes enumerates which assets are
-useful to report suspicious behaviours upstream, in a way that they are
-actionable.
-
-## Querying the Lotus RPC API
-
-The `local:docker` and `cluster:k8s` map ports that you specify in the
-composition.toml, so you can access them externally.
-
-All our compositions should carry this fragment:
-
-```toml
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-```
-
-This tells Testground to expose the following ports:
-
-* `6060` => Go pprof.
-* `1234` => Lotus full node RPC.
-* `2345` => Lotus storage miner RPC.
-
-### `local:docker`
-
-1. Install the `lotus` binary on your host.
-2. Find the container that you want to connect to in `docker ps`.
- * Note that our _container names_ are slightly long, and they're the last
- field on every line, so if your terminal is wrapping text, the port
- numbers will end up ABOVE the friendly/recognizable container name (e.g. `tg-lotus-soup-deals-e2e-acfc60bc1727-miners-1`).
- * The testground output displays the _container ID_ inside coloured angle
- brackets, so if you spot something spurious in a particular node, you can
- hone in on that one, e.g. `<< 54dd5ad916b2 >>`.
-
- ```
- ⟩ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 54dd5ad916b2 be3c18d7f0d4 "/testplan" 10 seconds ago Up 8 seconds 0.0.0.0:32788->1234/tcp, 0.0.0.0:32783->2345/tcp, 0.0.0.0:32773->6060/tcp, 0.0.0.0:32777->6060/tcp tg-lotus-soup-deals-e2e-acfc60bc1727-clients-2
- 53757489ce71 be3c18d7f0d4 "/testplan" 10 seconds ago Up 8 seconds 0.0.0.0:32792->1234/tcp, 0.0.0.0:32790->2345/tcp, 0.0.0.0:32781->6060/tcp, 0.0.0.0:32786->6060/tcp tg-lotus-soup-deals-e2e-acfc60bc1727-clients-1
- 9d3e83b71087 be3c18d7f0d4 "/testplan" 10 seconds ago Up 8 seconds 0.0.0.0:32791->1234/tcp, 0.0.0.0:32789->2345/tcp, 0.0.0.0:32779->6060/tcp, 0.0.0.0:32784->6060/tcp tg-lotus-soup-deals-e2e-acfc60bc1727-clients-0
- 7bd60e75ed0e be3c18d7f0d4 "/testplan" 10 seconds ago Up 8 seconds 0.0.0.0:32787->1234/tcp, 0.0.0.0:32782->2345/tcp, 0.0.0.0:32772->6060/tcp, 0.0.0.0:32776->6060/tcp tg-lotus-soup-deals-e2e-acfc60bc1727-miners-1
- dff229d7b342 be3c18d7f0d4 "/testplan" 10 seconds ago Up 9 seconds 0.0.0.0:32778->1234/tcp, 0.0.0.0:32774->2345/tcp, 0.0.0.0:32769->6060/tcp, 0.0.0.0:32770->6060/tcp tg-lotus-soup-deals-e2e-acfc60bc1727-miners-0
- 4cd67690e3b8 be3c18d7f0d4 "/testplan" 11 seconds ago Up 8 seconds 0.0.0.0:32785->1234/tcp, 0.0.0.0:32780->2345/tcp, 0.0.0.0:32771->6060/tcp, 0.0.0.0:32775->6060/tcp tg-lotus-soup-deals-e2e-acfc60bc1727-bootstrapper-0
- aeb334adf88d iptestground/sidecar:edge "testground sidecar …" 43 hours ago Up About an hour 0.0.0.0:32768->6060/tcp testground-sidecar
- c1157500282b influxdb:1.8 "/entrypoint.sh infl…" 43 hours ago Up 25 seconds 0.0.0.0:8086->8086/tcp testground-influxdb
- 99ca4c07fecc redis "docker-entrypoint.s…" 43 hours ago Up About an hour 0.0.0.0:6379->6379/tcp testground-redis
- bf25c87488a5 bitnami/grafana "/run.sh" 43 hours ago Up 26 seconds 0.0.0.0:3000->3000/tcp testground-grafana
- cd1d6383eff7 goproxy/goproxy "/goproxy" 45 hours ago Up About a minute 8081/tcp testground-goproxy
- ```
-
-3. Take note of the port mapping. Imagine in the output above, we want to query
- `54dd5ad916b2`. We'd use `localhost:32788`, as it forwards to the container's
- 1234 port (Lotus Full Node RPC).
-4. Run your Lotus CLI command setting the `FULLNODE_API_INFO` env variable,
- which is a multiaddr:
-
- ```sh
- $ FULLNODE_API_INFO=":/ip4/127.0.0.1/tcp/$port/http" lotus chain list
- [...]
- ```
-
----
-
-Alternatively, you could download gawk and setup a script in you .bashrc or .zshrc similar to:
-
-```
-lprt() {
- NAME=$1
- PORT=$2
-
- docker ps --format "table {{.Names}}" | grep $NAME | xargs -I {} docker port {} $PORT | gawk --field-separator=":" '{print $2}'
-}
-
-envs() {
- NAME=$1
-
- local REMOTE_PORT_1234=$(lprt $NAME 1234)
- local REMOTE_PORT_2345=$(lprt $NAME 2345)
-
- export FULLNODE_API_INFO=":/ip4/127.0.0.1/tcp/$REMOTE_PORT_1234/http"
- export STORAGE_API_INFO=":/ip4/127.0.0.1/tcp/$REMOTE_PORT_2345/http"
-
- echo "Setting \$FULLNODE_API_INFO to $FULLNODE_API_INFO"
- echo "Setting \$STORAGE_API_INFO to $STORAGE_API_INFO"
-}
-```
-
-Then call commands like:
-```
-envs miners-0
-lotus chain list
-```
-
-### `cluster:k8s`
-
-Similar to `local:docker`, you pick a pod that you want to connect to and port-forward 1234 and 2345 to that specific pod, such as:
-
-```
-export PODNAME="tg-lotus-soup-ae620dfb2e19-miners-0"
-kubectl port-forward pods/$PODNAME 1234:1234 2345:2345
-
-export FULLNODE_API_INFO=":/ip4/127.0.0.1/tcp/1234/http"
-export STORAGE_API_INFO=":/ip4/127.0.0.1/tcp/2345/http"
-lotus-storage-miner storage-deals list
-lotus-storage-miner storage-deals get-ask
-```
-
-### Useful commands / checks
-
-* **Making sure miners are on the same chain:** compare outputs of `lotus chain list`.
-* **Checking deals:** `lotus client list-deals`.
-* **Sector queries:** `lotus-storage-miner info` , `lotus-storage-miner proving info`
-* **Sector sealing errors:**
- * `STORAGE_API_INFO=":/ip4/127.0.0.1/tcp/53624/http" FULLNODE_API_INFO=":/ip4/127.0.0.1/tcp/53623/http" lotus-storage-miner sector info`
- * `STORAGE_API_INFO=":/ip4/127.0.0.1/tcp/53624/http" FULLNODE_API_INFO=":/ip4/127.0.0.1/tcp/53623/http" lotus-storage-miner sector status `
- * `STORAGE_API_INFO=":/ip4/127.0.0.1/tcp/53624/http" FULLNODE_API_INFO=":/ip4/127.0.0.1/tcp/53623/http" lotus-storage-miner sector status --log `
-
-## Viewing logs of a particular container `local:docker`
-
-This works for both started and stopped containers. Just get the container ID
-(in double angle brackets in Testground output, on every log line), and do a:
-
-```shell script
-$ docker logs $container_id
-```
-
-## Accessing the golang instrumentation
-
-Testground exposes a pprof endpoint under local port 6060, which both
-`local:docker` and `cluster:k8s` map.
-
-For `local:docker`, see above to figure out which host port maps to the
-container's 6060 port.
-
-## Acquiring a goroutine dump
-
-When things appear to be stuck, get a goroutine dump.
-
-```shell script
-$ wget -o goroutine.out http://localhost:${pprof_port}/debug/pprof/goroutine?debug=2
-```
-
-You can use whyrusleeping/stackparse to extract a summary:
-
-```shell script
-$ go get https://github.com/whyrusleeping/stackparse
-$ stackparse --summary goroutine.out
-```
-
-## Acquiring a CPU profile
-
-When the CPU appears to be spiking/rallying, grab a CPU profile.
-
-```shell script
-$ wget -o profile.out http://localhost:${pprof_port}/debug/pprof/profile
-```
-
-Analyse it using `go tool pprof`. Usually, generating a `png` graph is useful:
-
-```shell script
-$ go tool pprof profile.out
-File: testground
-Type: cpu
-Time: Jul 3, 2020 at 12:00am (WEST)
-Duration: 30.07s, Total samples = 2.81s ( 9.34%)
-Entering interactive mode (type "help" for commands, "o" for options)
-(pprof) png
-Generating report in profile003.png
-```
-
-## Submitting actionable reports / findings
-
-This is useful both internally (within the Oni team, so that peers can help) and
-externally (when submitting a finding upstream).
-
-We don't need to play the full bug-hunting game on Lotus, but it's tremendously
-useful to provide the necessary data so that any reports are actionable.
-
-These include:
-
-* test outputs (use `testground collect`).
-* stack traces that appear in logs (whether panics or not).
-* output of relevant Lotus CLI commands.
-* if this is some kind of blockage / deadlock, goroutine dumps.
-* if this is a CPU hotspot, a CPU profile would be useful.
-* if this is a memory issue, a heap dump would be useful.
-
-**When submitting bugs upstream (Lotus), make sure to indicate:**
-
-* Lotus commit.
-* FFI commit.
diff --git a/testplans/Makefile b/testplans/Makefile
deleted file mode 100644
index 38f46baa8..000000000
--- a/testplans/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-SHELL = /bin/bash
-
-.DEFAULT_GOAL := download-proofs
-
-download-proofs:
- go run github.com/filecoin-project/go-paramfetch/paramfetch 2048 ./docker-images/proof-parameters.json
-
-build-images:
- docker build -t "iptestground/oni-buildbase:v15-lotus" -f "docker-images/Dockerfile.oni-buildbase" "docker-images"
- docker build -t "iptestground/oni-runtime:v10" -f "docker-images/Dockerfile.oni-runtime" "docker-images"
- docker build -t "iptestground/oni-runtime:v10-debug" -f "docker-images/Dockerfile.oni-runtime-debug" "docker-images"
-
-push-images:
- docker push iptestground/oni-buildbase:v15-lotus
- docker push iptestground/oni-runtime:v10
- docker push iptestground/oni-runtime:v10-debug
-
-pull-images:
- docker pull iptestground/oni-buildbase:v15-lotus
- docker pull iptestground/oni-runtime:v10
- docker pull iptestground/oni-runtime:v10-debug
-
-.PHONY: download-proofs build-images push-images pull-images
diff --git a/testplans/README-old-from-oni.md b/testplans/README-old-from-oni.md
deleted file mode 100644
index 1a6b5debe..000000000
--- a/testplans/README-old-from-oni.md
+++ /dev/null
@@ -1,254 +0,0 @@
-# Project Oni 👹
-
-Our mandate is:
-
-> To verify the successful end-to-end outcome of the filecoin protocol and filecoin implementations, under a variety of real-world and simulated scenarios.
-
-➡️ Find out more about our goals, requirements, execution plan, and team culture, in our [Project Description](https://docs.google.com/document/d/16jYL--EWYpJhxT9bakYq7ZBGLQ9SB940Wd1lTDOAbNE).
-
-## Table of Contents
-
-- [Testing topics](#testing-topics)
-- [Repository contents](#repository-contents)
-- [Running the test cases](#running-the-test-cases)
-- [Catalog](#catalog)
-- [Debugging](#debugging)
-- [Dependencies](#dependencies)
-- [Docker images changelog](#docker-images-changelog)
-- [Team](#team)
-
-## Testing topics
-
-These are the topics we are currently centering our testing efforts on. Our testing efforts include fault induction, stress tests, and end-to-end testing.
-
-* **slashing:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fslashing)
- * We are recreating the scenarios that lead to slashing, as they are not readily seen in mono-client testnets.
- * Context: slashing is the negative economic consequence of penalising a miner that has breached protocol by deducing FIL and/or removing their power from the network.
-* **windowed PoSt/sector proving faults:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fsector-proving)
- * We are recreating the proving fault scenarios and triggering them in an accelerated fasion (by modifying the system configuration), so that we're able to verify that the sector state transitions properly through the different milestones (temporary faults, termination, etc.), and under chain fork conditions.
- * Context: every 24 hours there are 36 windows where miners need to submit their proofs of sector liveness, correctness, and validity. Failure to do so will mark a sector as faulted, and will eventually terminate the sector, triggering slashing consequences for the miner.
-* **syncing/fork selection:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fsync-forks)
- * Newly bootstrapped clients, and paused-then-resumed clients, are able to latch on to the correct chain even in the presence of a large number of forks in the network, either in the present, or throughout history.
-* **present-time mining/tipset assembly:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fmining-present)
- * Induce forks in the network, create network partitions, simulate chain halts, long-range forks, etc. Stage many kinds of convoluted chain shapes, and network partitions, and ensure that miners are always able to arrive to consensus when disruptions subside.
-* **catch-up/rush mining:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fmining-rush)
- * Induce network-wide, or partition-wide arrests, and investigate what the resulting chain is after the system is allowed to recover.
- * Context: catch-up/rush mining is a dedicated pathway in the mining logic that brings the chain up to speed with present time, in order to recover from network halts. Basically it entails producing backdated blocks in a hot loop. Imagine all miners recover in unison from a network-wide disruption; miners will produce blocks for their winning rounds, and will label losing rounds as _null rounds_. In the current implementation, there is no time for block propagation, so miners will produce solo-chains, and the assumption is that when all these chains hit the network, the _fork choice rule_ will pick the heaviest one. Unfortunately this process is brittle and unbalanced, as it favours the miner that held the highest power before the disruption commenced.
-* **storage and retrieval deals:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fdeals)
- * end-to-end flows where clients store and retrieve pieces from miners, including stress testing the system.
-* **payment channels:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fpaych)
- * stress testing payment channels via excessive lane creation, excessive payment voucher atomisation, and redemption.
-* **drand incidents and impact on the filecoin network/protocol/chain:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fdrand)
- * drand total unavailabilities, drand catch-ups, drand slowness, etc.
-* **mempool message selection:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fmempool)
- * soundness of message selection logic; potentially targeted attacks against miners by flooding their message pools with different kinds of messages.
-* **presealing:** [_(view test scenarios)_](https://github.com/filecoin-project/oni/issues?q=is%3Aissue+sort%3Aupdated-desc+label%3Atopic%2Fpresealing)
- * TBD, anything related to this worth testing?
-
-## Repository contents
-
-This repository consists of [test plans](https://docs.testground.ai/concepts-and-architecture/test-structure) built to be run on [Testground](https://github.com/testground/testground).
-
-The source code for the various test cases can be found in the [`lotus-soup` directory](https://github.com/filecoin-project/oni/tree/master/lotus-soup).
-
-## Running the test cases
-
-If you are unfamiliar with Testground, we strongly suggest you read the Testground [Getting Started guide](https://docs.testground.ai/getting-started) in order to learn how to install Testground and how to use it.
-
-You can find various [composition files](https://docs.testground.ai/running-test-plans#composition-runs) describing various test scenarios built as part of Project Oni at [`lotus-soup/_compositions` directory](https://github.com/filecoin-project/oni/tree/master/lotus-soup/_compositions).
-
-We've designed the test cases so that you can run them via the `local:exec`, `local:docker` and the `cluster:k8s` runners. Note that Lotus miners are quite resource intensive, requiring gigabytes of memory. Hence you would have to run these test cases on a beafy machine (when using `local:docker` and `local:exec`), or on a Kubernetes cluster (when using `cluster:k8s`).
-
-Here are the basics of how to run the baseline deals end-to-end test case:
-
-### Running the baseline deals end-to-end test case
-
-1. Compile and Install Testground from source code.
- * See the [Getting Started](https://github.com/testground/testground#getting-started) section of the README for instructions.
-
-2. Run a Testground daemon
-
-```
-testground daemon
-```
-
-3. Download required Docker images for the `lotus-soup` test plan
-
-```
-make pull-images
-```
-
-Alternatively you can build them locally with
-
-```
-make build-images
-```
-
-4. Import the `lotus-soup` test plan into your Testground home directory
-
-```
-testground plan import --from ./lotus-soup
-```
-
-5. Init the `filecoin-ffi` Git submodule in the `extra` folder.
-
-```
-git submodule update --init --recursive
-```
-
-6. Compile the `filecoin-ffi` version locally (necessary if you use `local:exec`)
-
-```
-cd extra/filecoin-ffi
-make
-```
-
-7. Run a composition for the baseline deals end-to-end test case
-
-```
-testground run composition -f ./lotus-soup/_compositions/baseline-docker-5-1.toml
-```
-
-## Batch-running randomised test cases
-
-The Oni testkit supports [range parameters](https://github.com/filecoin-project/oni/blob/master/lotus-soup/testkit/testenv_ranges.go),
-which test cases can use to generate random values, either at the instance level
-(each instance computes a random value within range), or at the run level (one
-instance computes the values, and propagates them to all other instances via the
-sync service).
-
-For example:
-
-```toml
-latency_range = '["20ms", "500ms"]'
-loss_range = '[0, 0.2]'
-```
-
-Could pick a random latency between 20ms and 500ms, and a packet loss
-probability between 0 and 0.2. We could apply those values through the
-`netclient.ConfigureNetwork` Testground SDK API.
-
-Randomized range-based parameters are specially interesting when combined with
-batch runs, as it enables Monte Carlo approaches to testing.
-
-The Oni codebase includes a batch test run driver in package `lotus-soup/runner`.
-You can point it at a composition file that uses range parameters and tell it to
-run N iterations of the test:
-
-```shell script
-$ go run ./runner -runs 5 _compositions/net-chaos/latency.toml
-```
-
-This will run the test as many times as instructed, and will place all outputs
-in a temporary directory. You can pass a concrete output directory with
-the `-output` flag.
-
-## Catalog
-
-### Test cases part of `lotus-soup`
-
-* `deals-e2e` - Deals end-to-end test case. Clients pick a miner at random, start a deal, wait for it to be sealed, and try to retrieve from another random miner who offers back the data.
-* `drand-halting` - Test case that instructs Drand with a sequence of halt/resume/wait events, while running deals between clients and miners at the same time.
-* `deals-stress` - Deals stress test case. Clients pick a miner and send multiple deals (concurrently or serially) in order to test how many deals miners can handle.
-* `paych-stress` - A test case exercising various payment channel stress tests.
-
-### Compositions part of `lotus-soup`
-
-* `baseline-docker-5-1.toml` - Runs a `baseline` test (deals e2e test) with a network of 5 clients and 1 miner targeting `local:docker`
-* `baseline-k8s-10-3.toml` - Runs a `baseline` test (deals e2e test) with a network of 10 clients and 3 miner targeting `cluster:k8s`
-* `baseline-k8s-3-1.toml` - Runs a `baseline` test (deals e2e test) with a network of 3 clients and 1 miner targeting `cluster:k8s`
-* `baseline-k8s-3-2.toml` - Runs a `baseline` test (deals e2e test) with a network of 3 clients and 2 miner targeting `cluster:k8s`
-* `baseline.toml` - Runs a `baseline` test (deals e2e test) with a network of 3 clients and 2 miner targeting `local:exec`. You have to manually download the proof parameters and place them in `/var/tmp`.
-* `deals-stress-concurrent-natural-k8s.toml`
-* `deals-stress-concurrent-natural.toml`
-* `deals-stress-concurrent.toml`
-* `deals-stress-serial-natural.toml`
-* `deals-stress-serial.toml`
-* `drand-halt.toml`
-* `local-drand.toml`
-* `natural.toml`
-* `paych-stress.toml`
-* `pubsub-tracer.toml`
-
-
-## Debugging
-
-Find commands and how-to guides on debugging test plans at [DELVING.md](https://github.com/filecoin-project/oni/blob/master/DELVING.md)
-
-1. Querying the Lotus RPC API
-
-2. Useful commands / checks
-
-* Making sure miners are on the same chain
-
-* Checking deals
-
-* Sector queries
-
-* Sector sealing errors
-
-## Dependencies
-
-Our current test plan `lotus-soup` is building programatically the Lotus filecoin implementation and therefore requires all it's dependencies. The build process is slightly more complicated than a normal Go project, because we are binding a bit of Rust code. Lotus codebase is in Go, however its `proofs` and `crypto` libraries are in Rust (BLS signatures, SNARK verification, etc.).
-
-Depending on the runner you want to use to run the test plan, these dependencies are included in the build process in a different way, which you should be aware of should you require to use the test plan with a newer version of Lotus:
-
-### Filecoin FFI libraries
-
-* `local:docker`
-
-The Rust libraries are included in the Filecoin FFI Git submodule, which is part of the `iptestground/oni-buildbase` image. If the FFI changes on Lotus, we have to rebuild this image with the `make build-images` command, where X is the next version (see [Docker images changelog](#docker-images-changelog)
-below).
-
-* `local:exec`
-
-The Rust libraries are included via the `extra` directory. Make sure that the test plan reference to Lotus in `go.mod` and the `extra` directory are pointing to the same commit of the FFI git submodule. You also need to compile the `extra/filecoin-ffi` libraries with `make`.
-
-* `cluster:k8s`
-
-The same process as for `local:docker`, however you need to make sure that the respective `iptestground/oni-buildbase` image is available as a public Docker image, so that the Kubernetes cluster can download it.
-
-### proof parameters
-
-Additional to the Filecoin FFI Git submodules, we are also bundling `proof parameters` in the `iptestground/oni-runtime` image. If these change, you will need to rebuild that image with `make build-images` command, where X is the next version.
-
-## Docker images changelog
-
-### oni-buildbase
-
-* `v1` => initial image locking in Filecoin FFI commit ca281af0b6c00314382a75ae869e5cb22c83655b.
-* `v2` => no changes; released only for aligning both images to aesthetically please @nonsense :D
-* `v3` => locking in Filecoin FFI commit 5342c7c97d1a1df4650629d14f2823d52889edd9.
-* `v4` => locking in Filecoin FFI commit 6a143e06f923f3a4f544c7a652e8b4df420a3d28.
-* `v5` => locking in Filecoin FFI commit cddc56607e1d851ea6d09d49404bd7db70cb3c2e.
-* `v6` => locking in Filecoin FFI commit 40569104603407c999d6c9e4c3f1228cbd4d0e5c.
-* `v7` => add Filecoin-BLST repo to buildbase.
-* `v8` => locking in Filecoin FFI commit f640612a1a1f7a2d.
-* `v9` => locking in Filecoin FFI commit 57e38efe4943f09d3127dcf6f0edd614e6acf68e and Filecoin-BLST commit 8609119cf4595d1741139c24378fcd8bc4f1c475.
-
-
-### oni-runtime
-
-* `v1` => initial image with 2048 parameters.
-* `v2` => adds auxiliary tools: `net-tools netcat traceroute iputils-ping wget vim curl telnet iproute2 dnsutils`.
-* `v3` => bump proof parameters from v27 to v28
-
-### oni-runtime-debug
-
-* `v1` => initial image
-* `v2` => locking in Lotus commit e21ea53
-* `v3` => locking in Lotus commit d557c40
-* `v4` => bump proof parameters from v27 to v28
-* `v5` => locking in Lotus commit 1a170e18a
-
-
-## Team
-
-* [@raulk](https://github.com/raulk) (Captain + TL)
-* [@nonsense](https://github.com/nonsense) (Testground TG + engineer)
-* [@yusefnapora](https://github.com/yusefnapora) (engineer and technical writer)
-* [@vyzo](https://github.com/vyzo) (engineer)
-* [@schomatis](https://github.com/schomatis) (advisor)
-* [@willscott](https://github.com/willscott) (engineer)
-* [@alanshaw](https://github.com/alanshaw) (engineer)
-
diff --git a/testplans/README.md b/testplans/README.md
deleted file mode 100644
index bab10e690..000000000
--- a/testplans/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Testground testplans for Lotus
-
-This directory consists of [testplans](https://docs.testground.ai/concepts-and-architecture/test-structure) built to be run on [Testground](https://github.com/testground/testground) that exercise Lotus on [TaaS](https://ci.testground.ipfs.team).
-
-## Table of Contents
-
-- [Testing topics](#testing-topics)
-- [Running the test cases](#running-the-test-cases)
-
-## Testing topics
-
-* **storage and retrieval deals:**
- * end-to-end flows where clients store and retrieve pieces from miners, including stress testing the system.
-* **payment channels:**
- * stress testing payment channels via excessive lane creation, excessive payment voucher atomisation, and redemption.
-
-## Running the test cases
-
-If you are unfamiliar with Testground, we strongly suggest you read the Testground [Getting Started guide](https://docs.testground.ai/getting-started) in order to learn how to install Testground and how to use it.
-
-You can find various [composition files](https://docs.testground.ai/running-test-plans#composition-runs) describing various test scenarios built as part of Project Oni at [`lotus-soup/_compositions` directory](https://github.com/filecoin-project/oni/tree/master/lotus-soup/_compositions).
-
-We've designed the test cases so that you can run them via the `local:exec`, `local:docker` and the `cluster:k8s` runners. Note that Lotus miners are quite resource intensive, requiring gigabytes of memory. Hence you would have to run these test cases on a beafy machine (when using `local:docker` and `local:exec`), or on a Kubernetes cluster (when using `cluster:k8s`).
-
-Here are the basics of how to run the baseline deals end-to-end test case:
-
-### Running the baseline deals end-to-end test case
-
-1. Compile and Install Testground from source code.
- * See the [Getting Started](https://github.com/testground/testground#getting-started) section of the README for instructions.
-
-2. Run a Testground daemon
-
-```
-testground daemon
-```
-
-3. Download required Docker images for the `lotus-soup` test plan
-
-```
-make pull-images
-```
-
-Alternatively you can build them locally with
-
-```
-make build-images
-```
-
-4. Import the `lotus-soup` test plan into your Testground home directory
-
-```
-testground plan import --from ./lotus-soup
-```
-
-6. Run a composition for the baseline deals end-to-end test case
-
-```
-testground run composition -f ./lotus-soup/_compositions/baseline-docker-5-1.toml
-```
diff --git a/testplans/composer/Dockerfile b/testplans/composer/Dockerfile
deleted file mode 100644
index d53bef7e4..000000000
--- a/testplans/composer/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM golang:1.18.1-buster as tg-build
-
-ARG TESTGROUND_REF="oni"
-WORKDIR /usr/src
-RUN git clone https://github.com/testground/testground.git
-RUN cd testground && git checkout $TESTGROUND_REF && go build .
-
-FROM python:3.8-buster
-
-WORKDIR /usr/src/app
-
-COPY --from=tg-build /usr/src/testground/testground /usr/bin/testground
-
-RUN mkdir /composer && chmod 777 /composer
-RUN mkdir /testground && chmod 777 /testground
-
-ENV HOME /composer
-ENV TESTGROUND_HOME /testground
-ENV LISTEN_PORT 5006
-ENV TESTGROUND_DAEMON_HOST host.docker.internal
-
-VOLUME /testground/plans
-
-
-COPY requirements.txt ./
-RUN pip install -r requirements.txt
-COPY . .
-
-CMD panel serve --address 0.0.0.0 --port $LISTEN_PORT composer.ipynb
diff --git a/testplans/composer/Makefile b/testplans/composer/Makefile
deleted file mode 100644
index 60f022110..000000000
--- a/testplans/composer/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-all: docker
-
-docker:
- docker build -t "iptestground/composer:latest" .
diff --git a/testplans/composer/README.md b/testplans/composer/README.md
deleted file mode 100644
index 82cd130cb..000000000
--- a/testplans/composer/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Testground Composer
-
-This is a work-in-progress UI for configuring and running testground compositions.
-
-The app code lives in [./app](./app), and there's a thin Jupyter notebook shell in [composer.ipynb](./composer.ipynb).
-
-## Running
-
-You can either run the app in docker, or in a local python virtualenv. Docker is recommended unless you're hacking
-on the code for Composer itself.
-
-### Running with docker
-
-Run the `./composer.sh` script to build a container with the latest source and run it. The first build
-will take a little while since it needs to build testground and fetch a bunch of python dependencies.
-
-You can skip the build if you set `SKIP_BUILD=true` when running `composer.sh`, and you can rebuild
-manually with `make docker`.
-
-The contents of `$TESTGROUND_HOME/plans` will be sync'd to a temporary directory and read-only mounted
-into the container.
-
-After building and starting the container, the script will open a browser to the composer UI.
-
-You should be able to load an existing composition or create a new one from one of the plans in
-`$TESTGROUND_HOME/plans`.
-
-Right now docker only supports the standalone webapp UI; to run the UI in a Jupyter notebook, see below.
-
-### Running with local python
-
-To run without docker, make a python3 virtual environment somewhere and activate it:
-
-```shell
-# make a virtualenv called "venv" in the current directory
-python3 -m venv ./venv
-
-# activate (bash/zsh):
-source ./venv/bin/activate
-
-# activate (fish):
-source ./venv/bin/activate.fish
-```
-
-Then install the python dependencies:
-
-```shell
-pip install -r requirements.txt
-```
-
-And start the UI:
-
-```shell
-panel serve composer.ipynb
-```
-
-That will start the standalone webapp UI. If you want a Jupyter notebook instead, run:
-
-```
-jupyter notebook
-```
-
-and open `composer.ipynb` in the Jupyter file picker.
\ No newline at end of file
diff --git a/testplans/composer/app/app.py b/testplans/composer/app/app.py
deleted file mode 100644
index c8d4aa3c1..000000000
--- a/testplans/composer/app/app.py
+++ /dev/null
@@ -1,94 +0,0 @@
-import param
-import panel as pn
-import toml
-from .util import get_plans, get_manifest
-from .composition import Composition
-from .runner import TestRunner
-
-STAGE_WELCOME = 'Welcome'
-STAGE_CONFIG_COMPOSITION = 'Configure'
-STAGE_RUN_TEST = 'Run'
-
-
-class Welcome(param.Parameterized):
- composition = param.Parameter()
- composition_picker = pn.widgets.FileInput(accept='.toml')
- plan_picker = param.Selector()
- ready = param.Boolean()
-
- def __init__(self, **params):
- super().__init__(**params)
- self.composition_picker.param.watch(self._composition_updated, 'value')
- self.param.watch(self._plan_selected, 'plan_picker')
- self.param['plan_picker'].objects = ['Select a Plan'] + get_plans()
-
- def panel(self):
- tabs = pn.Tabs(
- ('New Compostion', self.param['plan_picker']),
- ('Existing Composition', self.composition_picker),
- )
-
- return pn.Column(
- "Either choose an existing composition or select a plan to create a new composition:",
- tabs,
- )
-
- def _composition_updated(self, *args):
- print('composition updated')
- content = self.composition_picker.value.decode('utf8')
- comp_toml = toml.loads(content)
- manifest = get_manifest(comp_toml['global']['plan'])
- self.composition = Composition.from_dict(comp_toml, manifest=manifest)
- print('existing composition: {}'.format(self.composition))
- self.ready = True
-
- def _plan_selected(self, evt):
- if evt.new == 'Select a Plan':
- return
- print('plan selected: {}'.format(evt.new))
- manifest = get_manifest(evt.new)
- self.composition = Composition(manifest=manifest, add_default_group=True)
- print('new composition: ', self.composition)
- self.ready = True
-
-
-class ConfigureComposition(param.Parameterized):
- composition = param.Parameter()
-
- @param.depends('composition')
- def panel(self):
- if self.composition is None:
- return pn.Pane("no composition :(")
- print('composition: ', self.composition)
- return self.composition.panel()
-
-
-class WorkflowPipeline(object):
- def __init__(self):
- stages = [
- (STAGE_WELCOME, Welcome(), dict(ready_parameter='ready')),
- (STAGE_CONFIG_COMPOSITION, ConfigureComposition()),
- (STAGE_RUN_TEST, TestRunner()),
- ]
-
- self.pipeline = pn.pipeline.Pipeline(debug=True, stages=stages)
-
- def panel(self):
- return pn.Column(
- pn.Row(
- self.pipeline.title,
- self.pipeline.network,
- self.pipeline.prev_button,
- self.pipeline.next_button,
- ),
- self.pipeline.stage,
- sizing_mode='stretch_width',
- )
-
-
-class App(object):
- def __init__(self):
- self.workflow = WorkflowPipeline()
-
- def ui(self):
- return self.workflow.panel().servable("Testground Composer")
diff --git a/testplans/composer/app/composition.py b/testplans/composer/app/composition.py
deleted file mode 100644
index f12034f8c..000000000
--- a/testplans/composer/app/composition.py
+++ /dev/null
@@ -1,328 +0,0 @@
-import param
-import panel as pn
-import toml
-from .util import get_manifest, print_err
-
-
-def value_dict(parameterized, renames=None, stringify=False):
- d = dict()
- if renames is None:
- renames = dict()
- for name, p in parameterized.param.objects().items():
- if name == 'name':
- continue
- if name in renames:
- name = renames[name]
- val = p.__get__(parameterized, type(p))
- if isinstance(val, param.Parameterized):
- try:
- val = val.to_dict()
- except:
- val = value_dict(val, renames=renames)
- if stringify:
- val = str(val)
- d[name] = val
- return d
-
-
-def make_group_params_class(testcase):
- """Returns a subclass of param.Parameterized whose params are defined by the
- 'params' dict inside of the given testcase dict"""
- tc_params = dict()
- for name, p in testcase.get('params', {}).items():
- tc_params[name] = make_param(p)
-
- name = 'Test Params for testcase {}'.format(testcase.get('name', ''))
- cls = param.parameterized_class(name, tc_params, GroupParamsBase)
- return cls
-
-
-def make_param(pdef):
- """
- :param pdef: a parameter definition dict from a testground plan manifest
- :return: a param.Parameter that has the type, bounds, default value, etc from the definition
- """
- typ = pdef['type'].lower()
- if typ == 'int':
- return num_param(pdef, cls=param.Integer)
- elif typ == 'float':
- return num_param(pdef)
- elif typ.startswith('bool'):
- return bool_param(pdef)
- else:
- return str_param(pdef)
-
-
-def num_param(pdef, cls=param.Number):
- lo = pdef.get('min', None)
- hi = pdef.get('max', None)
- bounds = (lo, hi)
- if lo == hi and lo is not None:
- bounds = None
-
- default_val = pdef.get('default', None)
- if default_val is not None:
- if cls == param.Integer:
- default_val = int(default_val)
- else:
- default_val = float(default_val)
- return cls(default=default_val, bounds=bounds, doc=pdef.get('desc', ''))
-
-
-def bool_param(pdef):
- default_val = str(pdef.get('default', 'false')).lower() == 'true'
- return param.Boolean(
- doc=pdef.get('desc', ''),
- default=default_val
- )
-
-
-def str_param(pdef):
- return param.String(
- default=pdef.get('default', ''),
- doc=pdef.get('desc', ''),
- )
-
-
-class Base(param.Parameterized):
- @classmethod
- def from_dict(cls, d):
- return cls(**d)
-
- def to_dict(self):
- return value_dict(self)
-
-
-class GroupParamsBase(Base):
- def to_dict(self):
- return value_dict(self, stringify=True)
-
-
-class Metadata(Base):
- composition_name = param.String()
- author = param.String()
-
- @classmethod
- def from_dict(cls, d):
- d['composition_name'] = d.get('name', '')
- del d['name']
- return Metadata(**d)
-
- def to_dict(self):
- return value_dict(self, {'composition_name': 'name'})
-
-
-class Global(Base):
- plan = param.String()
- case = param.Selector()
- builder = param.String()
- runner = param.String()
-
- # TODO: link to instance counts in groups
- total_instances = param.Integer()
- # TODO: add ui widget for key/value maps instead of using Dict param type
- build_config = param.Dict(default={}, allow_None=True)
- run_config = param.Dict(default={}, allow_None=True)
-
- def set_manifest(self, manifest):
- if manifest is None:
- return
- print('manifest:', manifest)
- self.plan = manifest['name']
- cases = [tc['name'] for tc in manifest['testcases']]
- self.param['case'].objects = cases
- print('global config updated manifest. cases:', self.param['case'].objects)
- if len(cases) != 0:
- self.case = cases[0]
-
- if 'defaults' in manifest:
- print('manifest defaults', manifest['defaults'])
- if self.builder == '':
- self.builder = manifest['defaults'].get('builder', '')
- if self.runner == '':
- self.runner = manifest['defaults'].get('runner', '')
-
-
-class Resources(Base):
- memory = param.String(allow_None=True)
- cpu = param.String(allow_None=True)
-
-
-class Instances(Base):
- count = param.Integer(allow_None=True)
- percentage = param.Number(allow_None=True)
-
-
-class Dependency(Base):
- module = param.String()
- version = param.String()
-
-
-class Build(Base):
- selectors = param.List(class_=str, allow_None=True)
- dependencies = param.List(allow_None=True)
-
-
-class Run(Base):
- artifact = param.String(allow_None=True)
- test_params = param.Parameter(instantiate=True)
-
- def __init__(self, params_class=None, **params):
- super().__init__(**params)
- if params_class is not None:
- self.test_params = params_class()
-
- @classmethod
- def from_dict(cls, d, params_class=None):
- return Run(artifact=d.get('artifact', None), params_class=params_class)
-
- def panel(self):
- return pn.Column(
- self.param['artifact'],
- pn.Param(self.test_params)
- )
-
-
-class Group(Base):
- id = param.String()
- instances = param.Parameter(Instances(), instantiate=True)
- resources = param.Parameter(Resources(), allow_None=True, instantiate=True)
- build = param.Parameter(Build(), instantiate=True)
- run = param.Parameter(Run(), instantiate=True)
-
- def __init__(self, params_class=None, **params):
- super().__init__(**params)
- if params_class is not None:
- self.run = Run(params_class=params_class)
- self._set_name(self.id)
-
- @classmethod
- def from_dict(cls, d, params_class=None):
- return Group(
- id=d['id'],
- resources=Resources.from_dict(d.get('resources', {})),
- instances=Instances.from_dict(d.get('instances', {})),
- build=Build.from_dict(d.get('build', {})),
- run=Run.from_dict(d.get('params', {}), params_class=params_class),
- )
-
- def panel(self):
- print('rendering groups panel for ' + self.id)
- return pn.Column(
- "**Group: {}**".format(self.id),
- self.param['id'],
- self.instances,
- self.resources,
- self.build,
- self.run.panel(),
- )
-
-
-class Composition(param.Parameterized):
- metadata = param.Parameter(Metadata(), instantiate=True)
- global_config = param.Parameter(Global(), instantiate=True)
-
- groups = param.List(precedence=-1)
- group_tabs = pn.Tabs()
- groups_ui = None
-
- def __init__(self, manifest=None, add_default_group=False, **params):
- super(Composition, self).__init__(**params)
- self.manifest = manifest
- self.testcase_param_classes = dict()
- self._set_manifest(manifest)
- if add_default_group:
- self._add_group()
-
- @classmethod
- def from_dict(cls, d, manifest=None):
- if manifest is None:
- try:
- manifest = get_manifest(d['global']['plan'])
- except FileNotFoundError:
- print_err("Unable to find manifest for test plan {}. Please import into $TESTGROUND_HOME/plans and try again".format(d['global']['plan']))
-
- c = Composition(
- manifest=manifest,
- metadata=Metadata.from_dict(d.get('metadata', {})),
- global_config=Global.from_dict(d.get('global', {})),
- )
- params_class = c._params_class_for_current_testcase()
- c.groups = [Group.from_dict(g, params_class=params_class) for g in d.get('groups', [])]
-
- return c
-
- @classmethod
- def from_toml_file(cls, filename, manifest=None):
- with open(filename, 'rt') as f:
- d = toml.load(f)
- return cls.from_dict(d, manifest=manifest)
-
- @param.depends('groups', watch=True)
- def panel(self):
- add_group_button = pn.widgets.Button(name='Add Group')
- add_group_button.on_click(self._add_group)
-
- self._refresh_tabs()
-
- if self.groups_ui is None:
- self.groups_ui = pn.Column(
- add_group_button,
- self.group_tabs,
- )
-
- return pn.Row(
- pn.Column(self.metadata, self.global_config),
- self.groups_ui,
- )
-
- def _set_manifest(self, manifest):
- if manifest is None:
- return
-
- g = self.global_config
- print('global conifg: ', g)
- g.set_manifest(manifest)
- for tc in manifest.get('testcases', []):
- self.testcase_param_classes[tc['name']] = make_group_params_class(tc)
-
- def _params_class_for_current_testcase(self):
- case = self.global_config.case
- cls = self.testcase_param_classes.get(case, None)
- if cls is None:
- print_err("No testcase found in manifest named " + case)
- return cls
-
- def _add_group(self, *args):
- group_id = 'group-{}'.format(len(self.groups) + 1)
- g = Group(id=group_id, params_class=self._params_class_for_current_testcase())
- g.param.watch(self._refresh_tabs, 'id')
- groups = self.groups
- groups.append(g)
- self.groups = groups
- self.group_tabs.active = len(groups)-1
-
- @param.depends("global_config.case", watch=True)
- def _test_case_changed(self):
- print('test case changed', self.global_config.case)
- cls = self._params_class_for_current_testcase()
- for g in self.groups:
- g.run.test_params = cls()
- self._refresh_tabs()
-
- def _refresh_tabs(self, *args):
- self.group_tabs[:] = [(g.id, g.panel()) for g in self.groups]
-
- def to_dict(self):
- return {
- 'metadata': value_dict(self.metadata, renames={'composition_name': 'name'}),
- 'global': value_dict(self.global_config),
- 'groups': [g.to_dict() for g in self.groups]
- }
-
- def to_toml(self):
- return toml.dumps(self.to_dict())
-
- def write_to_file(self, filename):
- with open(filename, 'wt') as f:
- toml.dump(self.to_dict(), f)
diff --git a/testplans/composer/app/runner.py b/testplans/composer/app/runner.py
deleted file mode 100644
index 6eb368795..000000000
--- a/testplans/composer/app/runner.py
+++ /dev/null
@@ -1,111 +0,0 @@
-import os
-import panel as pn
-import param
-from panel.io.server import unlocked
-from tornado.ioloop import IOLoop, PeriodicCallback
-from tornado.process import Subprocess
-from subprocess import STDOUT
-from bokeh.models.widgets import Div
-from ansi2html import Ansi2HTMLConverter
-
-from .composition import Composition
-
-TESTGROUND = 'testground'
-
-
-class AnsiColorText(pn.widgets.Widget):
- style = param.Dict(default=None, doc="""
- Dictionary of CSS property:value pairs to apply to this Div.""")
-
- value = param.Parameter(default=None)
-
- _format = '{value}
'
-
- _rename = {'name': None, 'value': 'text'}
-
- # _target_transforms = {'value': 'target.text.split(": ")[0]+": "+value'}
- #
- # _source_transforms = {'value': 'value.split(": ")[1]'}
-
- _widget_type = Div
-
- _converter = Ansi2HTMLConverter(inline=True)
-
- def _process_param_change(self, msg):
- msg = super(AnsiColorText, self)._process_property_change(msg)
- if 'value' in msg:
- text = str(msg.pop('value'))
- text = self._converter.convert(text)
- msg['text'] = text
- return msg
-
- def scroll_down(self):
- # TODO: figure out how to automatically scroll down as text is added
- pass
-
-
-class CommandRunner(param.Parameterized):
- command_output = param.String()
-
- def __init__(self, **params):
- super().__init__(**params)
- self._output_lines = []
- self.proc = None
- self._updater = PeriodicCallback(self._refresh_output, callback_time=1000)
-
- @pn.depends('command_output')
- def panel(self):
- return pn.Param(self.param, show_name=False, sizing_mode='stretch_width', widgets={
- 'command_output': dict(
- type=AnsiColorText,
- sizing_mode='stretch_width',
- height=800)
- })
-
- def run(self, *cmd):
- self.command_output = ''
- self._output_lines = []
- self.proc = Subprocess(cmd, stdout=Subprocess.STREAM, stderr=STDOUT)
- self._get_next_line()
- self._updater.start()
-
- def _get_next_line(self):
- if self.proc is None:
- return
- loop = IOLoop.current()
- loop.add_future(self.proc.stdout.read_until(bytes('\n', encoding='utf8')), self._append_output)
-
- def _append_output(self, future):
- self._output_lines.append(future.result().decode('utf8'))
- self._get_next_line()
-
- def _refresh_output(self):
- text = ''.join(self._output_lines)
- if len(text) != len(self.command_output):
- with unlocked():
- self.command_output = text
-
-
-class TestRunner(param.Parameterized):
- composition = param.ClassSelector(class_=Composition, precedence=-1)
- testground_daemon_endpoint = param.String(default="{}:8042".format(os.environ.get('TESTGROUND_DAEMON_HOST', 'localhost')))
- run_test = param.Action(lambda self: self.run())
- runner = CommandRunner()
-
- def __init__(self, **params):
- super().__init__(**params)
-
- def run(self):
- # TODO: temp file management - maybe we should mount a volume and save there?
- filename = '/tmp/composition.toml'
- self.composition.write_to_file(filename)
-
- self.runner.run(TESTGROUND, '--endpoint', self.testground_daemon_endpoint, 'run', 'composition', '-f', filename)
-
- def panel(self):
- return pn.Column(
- self.param['testground_daemon_endpoint'],
- self.param['run_test'],
- self.runner.panel(),
- sizing_mode='stretch_width',
- )
diff --git a/testplans/composer/app/util.py b/testplans/composer/app/util.py
deleted file mode 100644
index 5321a95e8..000000000
--- a/testplans/composer/app/util.py
+++ /dev/null
@@ -1,26 +0,0 @@
-import toml
-import os
-import sys
-
-
-def parse_manifest(manifest_path):
- with open(manifest_path, 'rt') as f:
- return toml.load(f)
-
-
-def tg_home():
- return os.environ.get('TESTGROUND_HOME',
- os.path.join(os.environ['HOME'], 'testground'))
-
-
-def get_plans():
- return list(os.listdir(os.path.join(tg_home(), 'plans')))
-
-
-def get_manifest(plan_name):
- manifest_path = os.path.join(tg_home(), 'plans', plan_name, 'manifest.toml')
- return parse_manifest(manifest_path)
-
-
-def print_err(*args):
- print(*args, file=sys.stderr)
diff --git a/testplans/composer/chain-state.ipynb b/testplans/composer/chain-state.ipynb
deleted file mode 100644
index bd833dd21..000000000
--- a/testplans/composer/chain-state.ipynb
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import json\n",
- "import pandas as pd\n",
- "import matplotlib.pyplot as plt\n",
- "import hvplot.pandas\n",
- "import panel as pn\n",
- "\n",
- "STATE_FILE = './chain-state.ndjson'\n",
- "\n",
- "MINER_STATE_COL_RENAMES = {\n",
- " 'Info.MinerAddr': 'Miner',\n",
- " 'Info.MinerPower.MinerPower.RawBytePower': 'Info.MinerPowerRaw',\n",
- " 'Info.MinerPower.MinerPower.QualityAdjPower': 'Info.MinerPowerQualityAdj',\n",
- " 'Info.MinerPower.TotalPower.RawBytePower': 'Info.TotalPowerRaw',\n",
- " 'Info.MinerPower.TotalPower.QualityAdjPower': 'Info.TotalPowerQualityAdj',\n",
- "}\n",
- "\n",
- "MINER_NUMERIC_COLS = [\n",
- " 'Info.MinerPowerRaw',\n",
- " 'Info.MinerPowerQualityAdj',\n",
- " 'Info.TotalPowerRaw',\n",
- " 'Info.TotalPowerQualityAdj',\n",
- " 'Info.Balance',\n",
- " 'Info.CommittedBytes',\n",
- " 'Info.ProvingBytes',\n",
- " 'Info.FaultyBytes',\n",
- " 'Info.FaultyPercentage',\n",
- " 'Info.PreCommitDeposits',\n",
- " 'Info.LockedFunds',\n",
- " 'Info.AvailableFunds',\n",
- " 'Info.WorkerBalance',\n",
- " 'Info.MarketEscrow',\n",
- " 'Info.MarketLocked',\n",
- "]\n",
- "\n",
- "DERIVED_COLS = [\n",
- " 'CommittedSectors',\n",
- " 'ProvingSectors',\n",
- "]\n",
- "\n",
- "ATTO_FIL_COLS = [\n",
- " 'Info.Balance',\n",
- " 'Info.PreCommitDeposits',\n",
- " 'Info.LockedFunds',\n",
- " 'Info.AvailableFunds',\n",
- " 'Info.WorkerBalance',\n",
- " 'Info.MarketEscrow',\n",
- " 'Info.MarketLocked',\n",
- "]\n",
- "\n",
- "def atto_to_fil(x):\n",
- " return float(x) * pow(10, -18)\n",
- "\n",
- "def chain_state_to_pandas(statefile):\n",
- " chain = None\n",
- " \n",
- " with open(statefile, 'rt') as f:\n",
- " for line in f.readlines():\n",
- " j = json.loads(line)\n",
- " chain_height = j['Height']\n",
- " \n",
- " miners = j['MinerStates']\n",
- " for m in miners.values():\n",
- " df = pd.json_normalize(m)\n",
- " df['Height'] = chain_height\n",
- " df.rename(columns=MINER_STATE_COL_RENAMES, inplace=True)\n",
- " if chain is None:\n",
- " chain = df\n",
- " else:\n",
- " chain = chain.append(df, ignore_index=True)\n",
- " chain.fillna(0, inplace=True)\n",
- " chain.set_index('Height', inplace=True)\n",
- " \n",
- " for c in ATTO_FIL_COLS:\n",
- " chain[c] = chain[c].apply(atto_to_fil)\n",
- " \n",
- " for c in MINER_NUMERIC_COLS:\n",
- " chain[c] = chain[c].apply(pd.to_numeric)\n",
- " \n",
- " # the Sectors.* fields are lists of sector ids, but we want to plot counts, so\n",
- " # we pull the length of each list into a new column\n",
- " chain['CommittedSectors'] = chain['Sectors.Committed'].apply(lambda x: len(x))\n",
- " chain['ProvingSectors'] = chain['Sectors.Proving'].apply(lambda x: len(x))\n",
- " return chain\n",
- " \n",
- "cs = chain_state_to_pandas(STATE_FILE)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# choose which col to plot using a widget\n",
- "\n",
- "cols_to_plot = MINER_NUMERIC_COLS + DERIVED_COLS\n",
- "\n",
- "col_selector = pn.widgets.Select(name='Field', options=cols_to_plot)\n",
- "cols = ['Miner'] + cols_to_plot\n",
- "plot = cs[cols].hvplot(by='Miner', y=col_selector)\n",
- "pn.Column(pn.WidgetBox(col_selector), plot)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# plot all line charts in a vertical stack\n",
- "\n",
- "plots = []\n",
- "for c in cols_to_plot:\n",
- " title = c.split('.')[-1]\n",
- " p = cs[['Miner', c]].hvplot(by='Miner', y=c, title=title)\n",
- " plots.append(p)\n",
- "pn.Column(*plots)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# miner power area chart\n",
- "\n",
- "mp = cs[['Miner', 'Info.MinerPowerRaw']].rename(columns={'Info.MinerPowerRaw': 'Power'})\n",
- "mp = mp.pivot_table(values=['Power'], index=cs.index, columns='Miner', aggfunc='sum')\n",
- "mp = mp.div(mp.sum(1), axis=0)\n",
- "mp.columns = mp.columns.get_level_values(1)\n",
- "mp.hvplot.area(title='Miner Power Distribution')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/testplans/composer/composer.ipynb b/testplans/composer/composer.ipynb
deleted file mode 100644
index 148d1e861..000000000
--- a/testplans/composer/composer.ipynb
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "import param\n",
- "import panel as pn\n",
- "import app.app as app\n",
- "import importlib\n",
- "importlib.reload(app)\n",
- "\n",
- "pn.extension()\n",
- "\n",
- "a = app.App()\n",
- "a.ui()"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/testplans/composer/composer.sh b/testplans/composer/composer.sh
deleted file mode 100755
index 0d8bc8eb9..000000000
--- a/testplans/composer/composer.sh
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/bin/bash
-
-# this script runs jupyter inside a docker container and copies
-# plan manifests from the user's local filesystem into a temporary
-# directory that's bind-mounted into the container.
-
-set -o errexit
-set -o pipefail
-
-set -e
-
-err_report() {
- echo "Error on line $1"
-}
-
-trap 'err_report $LINENO' ERR
-
-
-image_name="iptestground/composer"
-image_tag="latest"
-image_full_name="$image_name:$image_tag"
-tg_home=${TESTGROUND_HOME:-$HOME/testground}
-container_plans_dir="/testground/plans"
-jupyter_port=${JUPYTER_PORT:-8888}
-panel_port=${PANEL_PORT:-5006}
-
-poll_interval=30
-
-exists() {
- command -v "$1" >/dev/null 2>&1
-}
-
-require_cmds() {
- for cmd in $@; do
- exists $cmd || { echo "This script requires the $cmd command. Please install it and try again." >&2; exit 1; }
- done
-}
-
-update_plans() {
- local dest_dir=$1
- rsync -avzh --quiet --copy-links "${tg_home}/plans/" ${dest_dir}
-}
-
-watch_plans() {
- local plans_dest=$1
- while true; do
- update_plans ${plans_dest}
- sleep $poll_interval
- done
-}
-
-open_url() {
- local url=$1
- if exists cmd.exe; then
- cmd.exe /c start ${url} >/dev/null 2>&1
- elif exists xdg-open; then
- xdg-open ${url} >/dev/null 2>&1 &
- elif exists open; then
- open ${url}
- else
- echo "unable to automatically open url. copy/paste this into a browser: $url"
- fi
-}
-
-# delete temp dir and stop docker container
-cleanup () {
- if [[ "$container_id" != "" ]]; then
- docker stop ${container_id} >/dev/null
- fi
-
- if [[ -d "$temp_plans_dir" ]]; then
- rm -rf ${temp_plans_dir}
- fi
-}
-
-get_host_ip() {
- # get interface of default route
- local net_if=$(netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}')
- # use ifconfig to get addr of that interface
- detected_host_ip=`ifconfig ${net_if} | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
-
- if [ -z "$detected_host_ip" ]
- then
- detected_host_ip="host.docker.internal"
- fi
-
- echo $detected_host_ip
-}
-
-# run cleanup on exit
-trap "{ cleanup; }" EXIT
-
-# make sure we have the commands we need
-require_cmds jq docker rsync
-
-if [[ "$SKIP_BUILD" == "" ]]; then
- echo "Building latest docker image. Set SKIP_BUILD env var to any value to bypass."
- require_cmds make
- make docker
-fi
-
-# make temp dir for manifests
-temp_base="/tmp"
-if [[ "$TEMP" != "" ]]; then
- temp_base=$TEMP
-fi
-
-temp_plans_dir="$(mktemp -d ${temp_base}/testground-composer-XXXX)"
-echo "temp plans dir: $temp_plans_dir"
-
-# copy testplans from $TESTGROUND_HOME/plans to the temp dir
-update_plans ${temp_plans_dir}
-
-# run the container in detached mode and grab the id
-container_id=$(docker run -d \
- -e TESTGROUND_DAEMON_HOST=$(get_host_ip) \
- --user $(id -u):$(id -g) \
- -p ${panel_port}:5006 \
- -v ${temp_plans_dir}:${container_plans_dir}:ro \
- $image_full_name)
-
-echo "container $container_id started"
-# print the log output
-docker logs -f ${container_id} &
-
-# sleep for a couple seconds to let the server start up
-sleep 2
-
-# open a browser to the app url
-panel_url="http://localhost:${panel_port}"
-open_url $panel_url
-
-# poll & sync testplan changes every few seconds
-watch_plans ${temp_plans_dir}
diff --git a/testplans/composer/fixtures/all-both-k8s.toml b/testplans/composer/fixtures/all-both-k8s.toml
deleted file mode 100644
index ab9e0864e..000000000
--- a/testplans/composer/fixtures/all-both-k8s.toml
+++ /dev/null
@@ -1,214 +0,0 @@
-[metadata]
- name = "all-both"
- author = "adin"
-
-[global]
- plan = "dht"
- case = "all"
- total_instances = 1000
- builder = "docker:go"
- runner = "cluster:k8s"
- [global.build_config]
- push_registry = true
- registry_type = "aws"
-
-[[groups]]
- id = "balsam-undialable-provider"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.build]
- selectors = ["balsam"]
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:701251a63b92"
- [groups.run.test_params]
- bs_strategy = "7"
- bucket_size = "10"
- expect_dht = "false"
- group_order = "4"
- latency = "100"
- record_count = "1"
- timeout_secs = "600"
- undialable = "true"
-
-[[groups]]
- id = "balsam-undialable-searcher"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.build]
- selectors = ["balsam"]
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:701251a63b92"
- [groups.run.test_params]
- bs_strategy = "7"
- bucket_size = "10"
- expect_dht = "false"
- group_order = "5"
- latency = "100"
- search_records = "true"
- timeout_secs = "600"
- undialable = "true"
-
-[[groups]]
- id = "balsam-dialable-passive"
- [groups.instances]
- count = 780
- percentage = 0.0
- [groups.build]
- selectors = ["balsam"]
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:701251a63b92"
- [groups.run.test_params]
- bs_strategy = "7"
- bucket_size = "10"
- expect_dht = "false"
- group_order = "6"
- latency = "100"
- timeout_secs = "600"
- undialable = "false"
-
-[[groups]]
- id = "balsam-dialable-provider"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.build]
- selectors = ["balsam"]
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:701251a63b92"
- [groups.run.test_params]
- bs_strategy = "7"
- bucket_size = "10"
- expect_dht = "false"
- group_order = "7"
- latency = "100"
- record_count = "1"
- timeout_secs = "600"
- undialable = "false"
-
-[[groups]]
- id = "balsam-dialable-searcher"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.build]
- selectors = ["balsam"]
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:701251a63b92"
- [groups.run.test_params]
- bs_strategy = "7"
- bucket_size = "10"
- expect_dht = "false"
- group_order = "8"
- latency = "100"
- search_records = "true"
- timeout_secs = "600"
- undialable = "false"
-
-[[groups]]
- id = "cypress-passive"
- [groups.instances]
- count = 185
- percentage = 0.0
- [groups.build]
- selectors = ["cypress"]
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-kad-dht"
- version = "180be07b8303d536e39809bc39c58be5407fedd9"
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-xor"
- version = "df24f5b04bcbdc0059b27989163a6090f4f6dc7a"
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:ca78473d669d"
- [groups.run.test_params]
- alpha = "6"
- beta = "3"
- bs_strategy = "7"
- bucket_size = "10"
- group_order = "1"
- latency = "100"
- timeout_secs = "600"
-
-[[groups]]
- id = "cypress-provider"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.build]
- selectors = ["cypress"]
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-kad-dht"
- version = "180be07b8303d536e39809bc39c58be5407fedd9"
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-xor"
- version = "df24f5b04bcbdc0059b27989163a6090f4f6dc7a"
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:ca78473d669d"
- [groups.run.test_params]
- alpha = "6"
- beta = "3"
- bs_strategy = "7"
- bucket_size = "10"
- group_order = "2"
- latency = "100"
- record_count = "1"
- timeout_secs = "600"
-
-[[groups]]
- id = "cypress-searcher"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.build]
- selectors = ["cypress"]
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-kad-dht"
- version = "180be07b8303d536e39809bc39c58be5407fedd9"
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-xor"
- version = "df24f5b04bcbdc0059b27989163a6090f4f6dc7a"
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:ca78473d669d"
- [groups.run.test_params]
- alpha = "6"
- beta = "3"
- bs_strategy = "7"
- bucket_size = "10"
- group_order = "3"
- latency = "100"
- search_records = "true"
- timeout_secs = "600"
-
-[[groups]]
- id = "cypress-bs"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.build]
- selectors = ["cypress"]
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-kad-dht"
- version = "180be07b8303d536e39809bc39c58be5407fedd9"
-
- [[groups.build.dependencies]]
- module = "github.com/libp2p/go-libp2p-xor"
- version = "df24f5b04bcbdc0059b27989163a6090f4f6dc7a"
- [groups.run]
- artifact = "909427826938.dkr.ecr.us-east-1.amazonaws.com/testground-us-east-1-dht:ca78473d669d"
- [groups.run.test_params]
- alpha = "6"
- beta = "3"
- bootstrapper = "true"
- bs_strategy = "7"
- bucket_size = "10"
- group_order = "0"
- latency = "100"
- timeout_secs = "600"
diff --git a/testplans/composer/fixtures/ping-pong-local.toml b/testplans/composer/fixtures/ping-pong-local.toml
deleted file mode 100644
index d845daafd..000000000
--- a/testplans/composer/fixtures/ping-pong-local.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-[metadata]
-name = "ping-pong-local"
-author = "yusef"
-
-[global]
-plan = "network"
-case = "ping-pong"
-total_instances = 2
-builder = "docker:go"
-runner = "local:docker"
-
-[[groups]]
-id = "nodes"
-instances = { count = 2 }
\ No newline at end of file
diff --git a/testplans/composer/requirements.txt b/testplans/composer/requirements.txt
deleted file mode 100644
index cfdfaa463..000000000
--- a/testplans/composer/requirements.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-param
-toml
-jupyter
-panel
-holoviews
-ansi2html
-matplotlib
-hvplot
diff --git a/testplans/dashboards/baseline.json b/testplans/dashboards/baseline.json
deleted file mode 100644
index 0678594ac..000000000
--- a/testplans/dashboards/baseline.json
+++ /dev/null
@@ -1,2106 +0,0 @@
-{
- "annotations": {
- "list": [
- {
- "builtIn": 1,
- "datasource": "-- Grafana --",
- "enable": true,
- "hide": true,
- "iconColor": "rgba(0, 211, 255, 1)",
- "name": "Annotations & Alerts",
- "type": "dashboard"
- }
- ]
- },
- "editable": true,
- "gnetId": null,
- "graphTooltip": 0,
- "id": 15,
- "iteration": 1595335476624,
- "links": [],
- "panels": [
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": null,
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 0,
- "y": 0
- },
- "hiddenSeries": false,
- "id": 21,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_instance",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "instance"
- ],
- "type": "tag"
- },
- {
- "params": [
- "previous"
- ],
- "type": "fill"
- }
- ],
- "measurement": "message/received",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "last"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "message/received",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": null,
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 12,
- "y": 0
- },
- "hiddenSeries": false,
- "id": 22,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_instance",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "instance"
- ],
- "type": "tag"
- },
- {
- "params": [
- "previous"
- ],
- "type": "fill"
- }
- ],
- "measurement": "message/success",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "last"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "message/success",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": null,
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 0,
- "y": 8
- },
- "hiddenSeries": false,
- "id": 18,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_instance",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "instance"
- ],
- "type": "tag"
- },
- {
- "params": [
- "none"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain/node_height",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "last"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "last"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "chain/node_height",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": null,
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 12,
- "y": 8
- },
- "hiddenSeries": false,
- "id": 19,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_instance",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "instance"
- ],
- "type": "tag"
- },
- {
- "params": [
- "none"
- ],
- "type": "fill"
- }
- ],
- "measurement": "peer/count",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "last"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "last"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "peer/count",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "collapsed": false,
- "datasource": null,
- "gridPos": {
- "h": 1,
- "w": 24,
- "x": 0,
- "y": 16
- },
- "id": 10,
- "panels": [],
- "title": "Blocks",
- "type": "row"
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 0,
- "y": 17
- },
- "hiddenSeries": false,
- "id": 15,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "total",
- "sortDesc": false,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_instance",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "instance"
- ],
- "type": "tag"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "block/received",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "last"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "block/received",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 12,
- "y": 17
- },
- "hiddenSeries": false,
- "id": 16,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "total",
- "sortDesc": false,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_instance",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "instance"
- ],
- "type": "tag"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "block/success",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "last"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "block/success",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 0,
- "y": 25
- },
- "hiddenSeries": false,
- "id": 13,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "total",
- "sortDesc": false,
- "total": true,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_miner ($tag_run)",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "miner"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.block.mine.counter",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- },
- {
- "alias": "all ($tag_run)",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.block.mine.counter",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "B",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "mined blocks from testplan",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "collapsed": false,
- "datasource": null,
- "gridPos": {
- "h": 1,
- "w": 24,
- "x": 0,
- "y": 33
- },
- "id": 8,
- "panels": [],
- "title": "Data",
- "type": "row"
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 0,
- "y": 34
- },
- "hiddenSeries": false,
- "id": 2,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": true,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "find-data - 95% max",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.find-data.histogram",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "p95"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "max"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "find data",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "ns",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 12,
- "y": 34
- },
- "hiddenSeries": false,
- "id": 14,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "total",
- "sortDesc": true,
- "total": true,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "send-data-to - $tag_miner ($tag_run)",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "miner"
- ],
- "type": "tag"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.send-data-to.counter",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- },
- {
- "alias": "find-data.offer - $tag_miner ($tag_run)",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "miner"
- ],
- "type": "tag"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.find-data.offer.counter",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "D",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "send data to ; got retrieve offers from",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "collapsed": false,
- "datasource": null,
- "gridPos": {
- "h": 1,
- "w": 24,
- "x": 0,
- "y": 43
- },
- "id": 6,
- "panels": [],
- "title": "Deals",
- "type": "row"
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 0,
- "y": 44
- },
- "hiddenSeries": false,
- "id": 3,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": true,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "deal.sealed - 95% max",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.deal.sealed.histogram",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "p95"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "max"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "started -> sealed",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "ns",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 12,
- "y": 44
- },
- "hiddenSeries": false,
- "id": 4,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": true,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "deal.retrieved - 95% max ($tag_run)",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.deal.retrieved.histogram",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "p95"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "max"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- },
- {
- "alias": "deal.retrieved - min ($tag_run)",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.deal.retrieved.histogram",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "B",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "min"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "min"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "started -> retrieved",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "ns",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 0,
- "y": 53
- },
- "hiddenSeries": false,
- "id": 23,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": true,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "deal.sealed - count",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.deal.sealed.histogram",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "started -> sealed",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "none",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 12,
- "y": 53
- },
- "hiddenSeries": false,
- "id": 24,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": true,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "deal.retrieved - count",
- "groupBy": [
- {
- "params": [
- "$myinterval"
- ],
- "type": "time"
- },
- {
- "params": [
- "run"
- ],
- "type": "tag"
- },
- {
- "params": [
- "0"
- ],
- "type": "fill"
- }
- ],
- "measurement": "diagnostics.deal.retrieved.histogram",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "count"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": [
- {
- "key": "run",
- "operator": "=~",
- "value": "/^$runid$/"
- }
- ]
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "started -> retrieved",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "none",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- }
- ],
- "refresh": "5s",
- "schemaVersion": 25,
- "style": "dark",
- "tags": [],
- "templating": {
- "list": [
- {
- "auto": false,
- "auto_count": 30,
- "auto_min": "10s",
- "current": {
- "selected": false,
- "text": "10s",
- "value": "10s"
- },
- "hide": 0,
- "label": null,
- "name": "myinterval",
- "options": [
- {
- "selected": true,
- "text": "10s",
- "value": "10s"
- },
- {
- "selected": false,
- "text": "100s",
- "value": "100s"
- }
- ],
- "query": "10s,100s",
- "queryValue": "",
- "refresh": 2,
- "skipUrlSync": false,
- "type": "interval"
- },
- {
- "allValue": null,
- "current": {
- "selected": false,
- "text": "All",
- "value": "$__all"
- },
- "datasource": "influxdb",
- "definition": "SHOW TAG VALUES WITH KEY = run",
- "hide": 0,
- "includeAll": true,
- "label": null,
- "multi": false,
- "name": "runid",
- "options": [],
- "query": "SHOW TAG VALUES WITH KEY = run",
- "refresh": 1,
- "regex": "",
- "skipUrlSync": false,
- "sort": 1,
- "tagValuesQuery": "",
- "tags": [],
- "tagsQuery": "",
- "type": "query",
- "useTags": false
- }
- ]
- },
- "time": {
- "from": "now-15m",
- "to": "now"
- },
- "timepicker": {
- "refresh_intervals": [
- "10s",
- "30s",
- "1m",
- "5m",
- "15m",
- "30m",
- "1h",
- "2h",
- "1d"
- ]
- },
- "timezone": "",
- "title": "Project Oni - Baseline test",
- "uid": "8em8RXWMz",
- "version": 1
-}
diff --git a/testplans/dashboards/chain.json b/testplans/dashboards/chain.json
deleted file mode 100644
index c708c61cc..000000000
--- a/testplans/dashboards/chain.json
+++ /dev/null
@@ -1,2748 +0,0 @@
-{
- "annotations": {
- "list": [
- {
- "builtIn": 1,
- "datasource": "-- Grafana --",
- "enable": true,
- "hide": true,
- "iconColor": "rgba(0, 211, 255, 1)",
- "name": "Annotations & Alerts",
- "type": "dashboard"
- }
- ]
- },
- "editable": true,
- "gnetId": null,
- "graphTooltip": 0,
- "id": 15,
- "links": [],
- "panels": [
- {
- "aliasColors": {},
- "bars": true,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "decimals": 2,
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 3,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 24,
- "x": 0,
- "y": 0
- },
- "hiddenSeries": false,
- "hideTimeOverride": false,
- "id": 38,
- "interval": "",
- "legend": {
- "alignAsTable": true,
- "avg": true,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "avg",
- "sortDesc": true,
- "total": false,
- "values": true
- },
- "lines": false,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": true,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_miner",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "miner"
- ],
- "type": "tag"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.election",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT count(\"value\") FROM \"chain.election\" WHERE $timeFilter -10m GROUP BY time($__interval), \"miner\" fill(null)",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "count"
- },
- {
- "params": [
- "20"
- ],
- "type": "moving_average"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Blocks Won",
- "tooltip": {
- "shared": true,
- "sort": 2,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "decimals": 2,
- "format": "none",
- "label": "",
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- },
- {
- "decimals": null,
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "cacheTimeout": null,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 4,
- "w": 8,
- "x": 0,
- "y": 9
- },
- "hiddenSeries": false,
- "id": 22,
- "interval": "",
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": false,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [
- {
- "alias": "/.*/",
- "color": "rgb(31, 120, 193)"
- }
- ],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.power",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": "4h",
- "timeRegions": [],
- "timeShift": null,
- "title": "Total Power",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "bytes",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "s",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 4,
- "w": 4,
- "x": 8,
- "y": 9
- },
- "id": 12,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": 0
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.blocktime",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT difference(mean(\"value\")) FROM \"chain.blocktime\" WHERE $timeFilter GROUP BY time($__interval) fill(null)",
- "rawQuery": false,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "difference"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Avg Blocktime",
- "type": "singlestat",
- "valueFontSize": "100%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "avg"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "bytes",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 4,
- "w": 4,
- "x": 12,
- "y": 9
- },
- "id": 42,
- "interval": "",
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": 0
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT sum(\"value\") FROM \"chain.miner_power\" WHERE $timeFilter GROUP BY time(2s)",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "mean"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Network Storage",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 4,
- "w": 8,
- "x": 16,
- "y": 9
- },
- "id": 6,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": 0
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$interval"
- ],
- "type": "time"
- }
- ],
- "measurement": "chain.election",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Blocks In Tipset",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "avg"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorPostfix": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 0,
- "y": 13
- },
- "id": 4,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": true,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": null
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.height",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Block Height",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "s",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 4,
- "y": 13
- },
- "id": 14,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": 0
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.blocktime",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "difference"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "30,90",
- "timeFrom": null,
- "timeShift": null,
- "title": "Last Blocktime",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 8,
- "y": 13
- },
- "id": 32,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": null
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.message_gasprice",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "mean"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Avg Gas Price",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "avg"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "decbytes",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 12,
- "y": 13
- },
- "id": 20,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": null
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.message_size",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "mean"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Avg Message Size",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "avg"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "bytes",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 16,
- "y": 13
- },
- "id": 8,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": 0
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.blockheader_size",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "mean"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "1024,2048",
- "timeFrom": null,
- "timeShift": null,
- "title": "Avg Blockheader Size",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "avg"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 20,
- "y": 13
- },
- "id": 10,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "pluginVersion": "6.4.2",
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": 0
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.message_count",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT \"value\" FROM \"chain.message_count\" WHERE $timeFilter ",
- "rawQuery": false,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Avg Messages in Tipset",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "avg"
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "decimals": 0,
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "dateTimeFromNow",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 0,
- "y": 16
- },
- "id": 16,
- "interval": "",
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": false,
- "ymax": null,
- "ymin": null
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.blocktime",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [
- "*1000"
- ],
- "type": "math"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Head Updated",
- "type": "singlestat",
- "valueFontSize": "50%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "aliasColors": {},
- "bars": false,
- "cacheTimeout": null,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 3,
- "w": 16,
- "x": 4,
- "y": 16
- },
- "hiddenSeries": false,
- "id": 2,
- "legend": {
- "alignAsTable": true,
- "avg": true,
- "current": true,
- "hideEmpty": false,
- "hideZero": false,
- "max": true,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [
- {
- "alias": "Null Blocks",
- "yaxis": 2
- },
- {
- "alias": "Block Time",
- "color": "rgb(31, 120, 193)"
- }
- ],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "Block Time",
- "groupBy": [],
- "measurement": "chain.blocktime",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT difference(\"value\") FROM \"chain.blocktime\" WHERE $timeFilter",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "difference"
- }
- ]
- ],
- "tags": []
- },
- {
- "alias": "Null Blocks",
- "groupBy": [],
- "measurement": "chain.height",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "B",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "difference"
- },
- {
- "params": [
- "-1"
- ],
- "type": "math"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Tipsets",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "s",
- "label": "Time between tipsets",
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "decimals": 0,
- "format": "short",
- "label": "Number of Null blocks",
- "logBase": 1,
- "max": null,
- "min": "0",
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "cacheTimeout": null,
- "colorBackground": false,
- "colorValue": false,
- "colors": [
- "#299c46",
- "rgba(237, 129, 40, 0.89)",
- "#d44a3a"
- ],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "format": "none",
- "gauge": {
- "maxValue": 100,
- "minValue": 0,
- "show": false,
- "thresholdLabels": false,
- "thresholdMarkers": true
- },
- "gridPos": {
- "h": 3,
- "w": 4,
- "x": 20,
- "y": 16
- },
- "id": 30,
- "interval": null,
- "links": [],
- "mappingType": 1,
- "mappingTypes": [
- {
- "name": "value to text",
- "value": 1
- },
- {
- "name": "range to text",
- "value": 2
- }
- ],
- "maxDataPoints": 100,
- "nullPointMode": "connected",
- "nullText": null,
- "postfix": "FIL",
- "postfixFontSize": "50%",
- "prefix": "",
- "prefixFontSize": "50%",
- "rangeMaps": [
- {
- "from": "null",
- "text": "N/A",
- "to": "null"
- }
- ],
- "sparkline": {
- "fillColor": "rgba(31, 118, 189, 0.18)",
- "full": false,
- "lineColor": "rgb(31, 120, 193)",
- "show": true,
- "ymax": null,
- "ymin": null
- },
- "tableColumn": "",
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.pledge_collateral",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": "",
- "timeFrom": null,
- "timeShift": null,
- "title": "Pledge Collateral",
- "type": "singlestat",
- "valueFontSize": "80%",
- "valueMaps": [
- {
- "op": "=",
- "text": "N/A",
- "value": "null"
- }
- ],
- "valueName": "current"
- },
- {
- "columns": [],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fontSize": "100%",
- "gridPos": {
- "h": 21,
- "w": 4,
- "x": 0,
- "y": 19
- },
- "id": 28,
- "pageSize": null,
- "showHeader": true,
- "sort": {
- "col": 1,
- "desc": true
- },
- "styles": [
- {
- "alias": "Time",
- "align": "auto",
- "dateFormat": "YYYY-MM-DD HH:mm:ss",
- "pattern": "Time",
- "type": "hidden"
- },
- {
- "alias": "",
- "align": "auto",
- "colorMode": null,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "dateFormat": "YYYY-MM-DD HH:mm:ss",
- "decimals": 2,
- "mappingType": 1,
- "pattern": "power",
- "thresholds": [],
- "type": "number",
- "unit": "bytes"
- },
- {
- "alias": "",
- "align": "auto",
- "colorMode": null,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "decimals": 2,
- "pattern": "/.*/",
- "thresholds": [],
- "type": "number",
- "unit": "short"
- }
- ],
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.miner_power",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT top(\"value\", \"miner\", 20) as \"power\" FROM \"chain.miner_power\" WHERE $timeFilter",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "table",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "timeFrom": null,
- "timeShift": null,
- "title": "Top Power Table",
- "transform": "table",
- "type": "table-old"
- },
- {
- "aliasColors": {},
- "bars": false,
- "cacheTimeout": null,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 5,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 4,
- "y": 19
- },
- "hiddenSeries": false,
- "id": 40,
- "interval": "",
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "hideEmpty": true,
- "hideZero": true,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "current",
- "sortDesc": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": true,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": true,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_miner",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "miner"
- ],
- "type": "tag"
- },
- {
- "params": [
- "previous"
- ],
- "type": "fill"
- }
- ],
- "limit": "",
- "measurement": "chain.miner_power",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT mean(\"value\") FROM \"chain.miner_power\" WHERE $timeFilter GROUP BY time($__interval), \"miner\" fill(previous)",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [
- "\"miner\",20"
- ],
- "type": "top"
- }
- ]
- ],
- "slimit": "",
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Top Miner Power",
- "tooltip": {
- "shared": true,
- "sort": 2,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "decimals": 2,
- "format": "bytes",
- "label": "Power",
- "logBase": 1,
- "max": "100",
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "columns": [],
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fontSize": "100%",
- "gridPos": {
- "h": 21,
- "w": 8,
- "x": 16,
- "y": 19
- },
- "id": 18,
- "pageSize": null,
- "showHeader": true,
- "sort": {
- "col": 0,
- "desc": true
- },
- "styles": [
- {
- "alias": "Height",
- "align": "auto",
- "dateFormat": "YYYY-MM-DD HH:mm:ss",
- "link": false,
- "mappingType": 1,
- "pattern": "chain.height",
- "preserveFormat": false,
- "sanitize": false,
- "type": "string"
- },
- {
- "alias": "Tipset",
- "align": "auto",
- "colorMode": null,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "decimals": 2,
- "pattern": "chain.height.tipset",
- "preserveFormat": false,
- "sanitize": false,
- "thresholds": [],
- "type": "string",
- "unit": "short"
- },
- {
- "alias": "",
- "align": "auto",
- "colorMode": null,
- "colors": [
- "rgba(245, 54, 54, 0.9)",
- "rgba(237, 129, 40, 0.89)",
- "rgba(50, 172, 45, 0.97)"
- ],
- "dateFormat": "YYYY-MM-DD HH:mm:ss",
- "decimals": 2,
- "link": false,
- "mappingType": 1,
- "pattern": "Time",
- "thresholds": [],
- "type": "hidden",
- "unit": "short"
- }
- ],
- "targets": [
- {
- "groupBy": [],
- "measurement": "chain.height",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT \"value\", \"tipset\" FROM \"chain.height\" WHERE $timeFilter",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "timeFrom": null,
- "timeShift": null,
- "title": "Chain Table",
- "transform": "timeseries_to_columns",
- "type": "table-old"
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 8,
- "w": 12,
- "x": 4,
- "y": 27
- },
- "hiddenSeries": false,
- "id": 46,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "hideEmpty": true,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "current",
- "sortDesc": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "alias": "$tag_miner",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT top(\"value\", \"miner\",20) FROM \"chain.miner_power\" WHERE $timeFilter GROUP BY time($__interval), \"miner\"",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "mean"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Chain / Miner Power",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "bytes",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "cacheTimeout": null,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 6,
- "w": 12,
- "x": 4,
- "y": 35
- },
- "hiddenSeries": false,
- "id": 24,
- "legend": {
- "alignAsTable": false,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [
- {
- "alias": "/.*/",
- "color": "rgb(31, 120, 193)"
- }
- ],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "previous"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.pledge_collateral",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "mean"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Pledge Collateral",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": "FIL",
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": false,
- "cacheTimeout": null,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 7,
- "w": 12,
- "x": 4,
- "y": 41
- },
- "hiddenSeries": false,
- "id": 44,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "links": [],
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "previous"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.miner_power",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT count(\"value\") FROM \"chain.miner_power\" WHERE $timeFilter GROUP BY time($__interval)",
- "rawQuery": false,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "count"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Miners on Chain",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "decimals": 0,
- "format": "none",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": true,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 0,
- "y": 48
- },
- "hiddenSeries": false,
- "id": 34,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": false,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": true,
- "steppedLine": false,
- "targets": [
- {
- "alias": "Adr $tag_actor | Md $tag_method",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "actor"
- ],
- "type": "tag"
- },
- {
- "params": [
- "method"
- ],
- "type": "tag"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.message_count",
- "orderByTime": "ASC",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "sum"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Actor Messages Method",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": "",
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- },
- {
- "aliasColors": {},
- "bars": true,
- "dashLength": 10,
- "dashes": false,
- "datasource": "influxdb",
- "fieldConfig": {
- "defaults": {
- "custom": {}
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 9,
- "w": 12,
- "x": 12,
- "y": 48
- },
- "hiddenSeries": false,
- "id": 36,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": false,
- "hideEmpty": true,
- "hideZero": true,
- "max": false,
- "min": false,
- "rightSide": true,
- "show": true,
- "sort": "avg",
- "sortDesc": false,
- "total": false,
- "values": false
- },
- "lines": false,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "dataLinks": []
- },
- "percentage": false,
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": true,
- "steppedLine": false,
- "targets": [
- {
- "alias": "Adr $tag_actor | Md $tag_method | Ex $tag_exitcode",
- "groupBy": [
- {
- "params": [
- "$__interval"
- ],
- "type": "time"
- },
- {
- "params": [
- "method"
- ],
- "type": "tag"
- },
- {
- "params": [
- "exitcode"
- ],
- "type": "tag"
- },
- {
- "params": [
- "actor"
- ],
- "type": "tag"
- },
- {
- "params": [
- "null"
- ],
- "type": "fill"
- }
- ],
- "measurement": "chain.message_count",
- "orderByTime": "ASC",
- "policy": "default",
- "query": "SELECT sum(\"value\") FROM \"chain.message_count\" WHERE $timeFilter GROUP BY time($__interval), \"method\", \"exitcode\", \"actor\" fill(null)",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "value"
- ],
- "type": "field"
- },
- {
- "params": [],
- "type": "count"
- }
- ]
- ],
- "tags": []
- }
- ],
- "thresholds": [],
- "timeFrom": null,
- "timeRegions": [],
- "timeShift": null,
- "title": "Actor Messages Method With Exitcode",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "buckets": null,
- "mode": "time",
- "name": null,
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "short",
- "label": "",
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": true
- }
- ],
- "yaxis": {
- "align": false,
- "alignLevel": null
- }
- }
- ],
- "refresh": "5s",
- "schemaVersion": 25,
- "style": "dark",
- "tags": [],
- "templating": {
- "list": []
- },
- "time": {
- "from": "now-30m",
- "to": "now"
- },
- "timepicker": {
- "refresh_intervals": [
- "10s",
- "30s",
- "45s",
- "1m",
- "5m",
- "15m",
- "30m",
- "1h",
- "2h",
- "1d"
- ]
- },
- "timezone": "",
- "title": "Chain",
- "uid": "z6FtI92Zz",
- "version": 3
-}
diff --git a/testplans/docker-images/Dockerfile.oni-buildbase b/testplans/docker-images/Dockerfile.oni-buildbase
deleted file mode 100644
index 33420f4a6..000000000
--- a/testplans/docker-images/Dockerfile.oni-buildbase
+++ /dev/null
@@ -1,16 +0,0 @@
-ARG GO_VERSION=1.18.1
-
-FROM golang:${GO_VERSION}-buster
-
-RUN apt-get update && apt-get install -y ca-certificates llvm clang mesa-opencl-icd ocl-icd-opencl-dev jq gcc git pkg-config bzr libhwloc-dev
-
-ARG FILECOIN_FFI_COMMIT=8b97bd8230b77bd32f4f27e4766a6d8a03b4e801
-ARG FFI_DIR=/extern/filecoin-ffi
-
-RUN mkdir -p ${FFI_DIR} \
- && git clone https://github.com/filecoin-project/filecoin-ffi.git ${FFI_DIR} \
- && cd ${FFI_DIR} \
- && git checkout ${FILECOIN_FFI_COMMIT} \
- && make
-
-RUN ldconfig
diff --git a/testplans/docker-images/Dockerfile.oni-runtime b/testplans/docker-images/Dockerfile.oni-runtime
deleted file mode 100644
index e18ca3bbc..000000000
--- a/testplans/docker-images/Dockerfile.oni-runtime
+++ /dev/null
@@ -1,23 +0,0 @@
-ARG GO_VERSION=1.18.1
-
-FROM golang:${GO_VERSION}-buster as downloader
-
-## Fetch the proof parameters.
-## 1. Install the paramfetch binary first, so it can be cached over builds.
-## 2. Then copy over the parameters (which could change).
-## 3. Trigger the download.
-## Output will be in /var/tmp/filecoin-proof-parameters.
-
-RUN go get github.com/filecoin-project/go-paramfetch/paramfetch@master
-COPY /proof-parameters.json /
-RUN paramfetch 8388608 /proof-parameters.json
-
-FROM ubuntu:18.04
-
-RUN apt-get update && apt-get install -y ca-certificates llvm clang mesa-opencl-icd ocl-icd-opencl-dev gcc pkg-config libhwloc-dev
-
-RUN apt-get install -y jq net-tools netcat traceroute iputils-ping wget vim curl telnet iproute2 dnsutils
-
-COPY --from=downloader /var/tmp/filecoin-proof-parameters /var/tmp/filecoin-proof-parameters
-
-RUN ldconfig
diff --git a/testplans/docker-images/Dockerfile.oni-runtime-debug b/testplans/docker-images/Dockerfile.oni-runtime-debug
deleted file mode 100644
index 33954c92f..000000000
--- a/testplans/docker-images/Dockerfile.oni-runtime-debug
+++ /dev/null
@@ -1,30 +0,0 @@
-ARG GO_VERSION=1.18.1
-
-FROM golang:${GO_VERSION}-buster as downloader
-
-## Fetch the proof parameters.
-## 1. Install the paramfetch binary first, so it can be cached over builds.
-## 2. Then copy over the parameters (which could change).
-## 3. Trigger the download.
-## Output will be in /var/tmp/filecoin-proof-parameters.
-
-RUN go get github.com/filecoin-project/go-paramfetch/paramfetch@master
-COPY /proof-parameters.json /
-RUN paramfetch 8388608 /proof-parameters.json
-
-ARG LOTUS_COMMIT=b8deee048eaf850113e8626a73f64b17ba69a9f6
-
-## for debug purposes
-RUN apt update && apt install -y mesa-opencl-icd ocl-icd-opencl-dev gcc git bzr jq pkg-config libhwloc-dev curl && git clone https://github.com/filecoin-project/lotus.git && cd lotus/ && git checkout ${LOTUS_COMMIT} && make clean && make all && make install
-
-FROM ubuntu:18.04
-
-RUN apt-get update && apt-get install -y ca-certificates llvm clang mesa-opencl-icd ocl-icd-opencl-dev jq gcc pkg-config libhwloc-dev net-tools netcat traceroute iputils-ping wget vim curl telnet iproute2 dnsutils
-COPY --from=downloader /var/tmp/filecoin-proof-parameters /var/tmp/filecoin-proof-parameters
-
-## for debug purposes
-COPY --from=downloader /usr/local/bin/lotus /usr/local/bin/lll
-COPY --from=downloader /usr/local/bin/lotus-miner /usr/local/bin/lm
-
-ENV FULLNODE_API_INFO="/ip4/127.0.0.1/tcp/1234/http"
-ENV MINER_API_INFO="/ip4/127.0.0.1/tcp/2345/http"
diff --git a/testplans/docker-images/proof-parameters.json b/testplans/docker-images/proof-parameters.json
deleted file mode 100644
index 88bb0bfa3..000000000
--- a/testplans/docker-images/proof-parameters.json
+++ /dev/null
@@ -1,202 +0,0 @@
-{
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-61fa69f38b9cc771ba27b670124714b4ea77fbeae05e377fb859c4a43b73a30c.params": {
- "cid": "Qma5WL6abSqYg9uUQAZ3EHS286bsNsha7oAGsJBD48Bq2q",
- "digest": "c3ad7bb549470b82ad52ed070aebb4f4",
- "sector_size": 536870912
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-61fa69f38b9cc771ba27b670124714b4ea77fbeae05e377fb859c4a43b73a30c.vk": {
- "cid": "QmUa7f9JtJMsqJJ3s3ZXk6WyF4xJLE8FiqYskZGgk8GCDv",
- "digest": "994c5b7d450ca9da348c910689f2dc7f",
- "sector_size": 536870912
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-92180959e1918d26350b8e6cfe217bbdd0a2d8de51ebec269078b364b715ad63.params": {
- "cid": "QmQiT4qBGodrVNEgVTDXxBNDdPbaD8Ag7Sx3ZTq1zHX79S",
- "digest": "5aedd2cf3e5c0a15623d56a1b43110ad",
- "sector_size": 8388608
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-92180959e1918d26350b8e6cfe217bbdd0a2d8de51ebec269078b364b715ad63.vk": {
- "cid": "QmdcpKUQvHM8RFRVKbk1yHfEqMcBzhtFWKRp9SNEmWq37i",
- "digest": "abd80269054d391a734febdac0d2e687",
- "sector_size": 8388608
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-fb9e095bebdd77511c0269b967b4d87ba8b8a525edaa0e165de23ba454510194.params": {
- "cid": "QmYM6Hg7mjmvA3ZHTsqkss1fkdyDju5dDmLiBZGJ5pz9y9",
- "digest": "311f92a3e75036ced01b1c0025f1fa0c",
- "sector_size": 2048
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-0-0-fb9e095bebdd77511c0269b967b4d87ba8b8a525edaa0e165de23ba454510194.vk": {
- "cid": "QmaQsTLL3nc5dw6wAvaioJSBfd1jhQrA2o6ucFf7XeV74P",
- "digest": "eadad9784969890d30f2749708c79771",
- "sector_size": 2048
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.params": {
- "cid": "QmNPc75iEfcahCwNKdqnWLtxnjspUGGR4iscjiz3wP3RtS",
- "digest": "1b3cfd761a961543f9eb273e435a06a2",
- "sector_size": 34359738368
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-0-3b7f44a9362e3985369454947bc94022e118211e49fd672d52bec1cbfd599d18.vk": {
- "cid": "QmdFFUe1gcz9MMHc6YW8aoV48w4ckvcERjt7PkydQAMfCN",
- "digest": "3a6941983754737fde880d29c7094905",
- "sector_size": 34359738368
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.params": {
- "cid": "QmUB6xTVjzBQGuDNeyJMrrJ1byk58vhPm8eY2Lv9pgwanp",
- "digest": "1a392e7b759fb18e036c7559b5ece816",
- "sector_size": 68719476736
- },
- "v28-empty-sector-update-merkletree-poseidon_hasher-8-8-2-102e1444a7e9a97ebf1e3d6855dcc77e66c011ea66f936d9b2c508f87f2f83a7.vk": {
- "cid": "Qmd794Jty7k26XJ8Eg4NDEks65Qk8G4GVfGkwqvymv8HAg",
- "digest": "80e366df2f1011953c2d01c7b7c9ee8e",
- "sector_size": 68719476736
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.params": {
- "cid": "QmVxjFRyhmyQaZEtCh7nk2abc7LhFkzhnRX4rcHqCCpikR",
- "digest": "7610b9f82bfc88405b7a832b651ce2f6",
- "sector_size": 2048
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0170db1f394b35d995252228ee359194b13199d259380541dc529fb0099096b0.vk": {
- "cid": "QmcS5JZs8X3TdtkEBpHAdUYjdNDqcL7fWQFtQz69mpnu2X",
- "digest": "0e0958009936b9d5e515ec97b8cb792d",
- "sector_size": 2048
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0cfb4f178bbb71cf2ecfcd42accce558b27199ab4fb59cb78f2483fe21ef36d9.params": {
- "cid": "QmUiRx71uxfmUE8V3H9sWAsAXoM88KR4eo1ByvvcFNeTLR",
- "digest": "1a7d4a9c8a502a497ed92a54366af33f",
- "sector_size": 536870912
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-0cfb4f178bbb71cf2ecfcd42accce558b27199ab4fb59cb78f2483fe21ef36d9.vk": {
- "cid": "QmfCeddjFpWtavzfEzZpJfzSajGNwfL4RjFXWAvA9TSnTV",
- "digest": "4dae975de4f011f101f5a2f86d1daaba",
- "sector_size": 536870912
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-3ea05428c9d11689f23529cde32fd30aabd50f7d2c93657c1d3650bca3e8ea9e.params": {
- "cid": "QmcSTqDcFVLGGVYz1njhUZ7B6fkKtBumsLUwx4nkh22TzS",
- "digest": "82c88066be968bb550a05e30ff6c2413",
- "sector_size": 2048
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-3ea05428c9d11689f23529cde32fd30aabd50f7d2c93657c1d3650bca3e8ea9e.vk": {
- "cid": "QmSTCXF2ipGA3f6muVo6kHc2URSx6PzZxGUqu7uykaH5KU",
- "digest": "ffd79788d614d27919ae5bd2d94eacb6",
- "sector_size": 2048
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-50c7368dea9593ed0989e70974d28024efa9d156d585b7eea1be22b2e753f331.params": {
- "cid": "QmU9SBzJNrcjRFDiFc4GcApqdApN6z9X7MpUr66mJ2kAJP",
- "digest": "700171ecf7334e3199437c930676af82",
- "sector_size": 8388608
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-50c7368dea9593ed0989e70974d28024efa9d156d585b7eea1be22b2e753f331.vk": {
- "cid": "QmbmUMa3TbbW3X5kFhExs6WgC4KeWT18YivaVmXDkB6ANG",
- "digest": "79ebb55f56fda427743e35053edad8fc",
- "sector_size": 8388608
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-5294475db5237a2e83c3e52fd6c2b03859a1831d45ed08c4f35dbf9a803165a9.params": {
- "cid": "QmdNEL2RtqL52GQNuj8uz6mVj5Z34NVnbaJ1yMyh1oXtBx",
- "digest": "c49499bb76a0762884896f9683403f55",
- "sector_size": 8388608
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-5294475db5237a2e83c3e52fd6c2b03859a1831d45ed08c4f35dbf9a803165a9.vk": {
- "cid": "QmUiVYCQUgr6Y13pZFr8acWpSM4xvTXUdcvGmxyuHbKhsc",
- "digest": "34d4feeacd9abf788d69ef1bb4d8fd00",
- "sector_size": 8388608
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-7d739b8cf60f1b0709eeebee7730e297683552e4b69cab6984ec0285663c5781.params": {
- "cid": "QmVgCsJFRXKLuuUhT3aMYwKVGNA9rDeR6DCrs7cAe8riBT",
- "digest": "827359440349fe8f5a016e7598993b79",
- "sector_size": 536870912
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-0-0-7d739b8cf60f1b0709eeebee7730e297683552e4b69cab6984ec0285663c5781.vk": {
- "cid": "QmfA31fbCWojSmhSGvvfxmxaYCpMoXP95zEQ9sLvBGHNaN",
- "digest": "bd2cd62f65c1ab84f19ca27e97b7c731",
- "sector_size": 536870912
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-0377ded656c6f524f1618760bffe4e0a1c51d5a70c4509eedae8a27555733edc.params": {
- "cid": "QmaUmfcJt6pozn8ndq1JVBzLRjRJdHMTPd4foa8iw5sjBZ",
- "digest": "2cf49eb26f1fee94c85781a390ddb4c8",
- "sector_size": 34359738368
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-0377ded656c6f524f1618760bffe4e0a1c51d5a70c4509eedae8a27555733edc.vk": {
- "cid": "QmR9i9KL3vhhAqTBGj1bPPC7LvkptxrH9RvxJxLN1vvsBE",
- "digest": "0f8ec542485568fa3468c066e9fed82b",
- "sector_size": 34359738368
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-559e581f022bb4e4ec6e719e563bf0e026ad6de42e56c18714a2c692b1b88d7e.params": {
- "cid": "Qmdtczp7p4wrbDofmHdGhiixn9irAcN77mV9AEHZBaTt1i",
- "digest": "d84f79a16fe40e9e25a36e2107bb1ba0",
- "sector_size": 34359738368
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-0-559e581f022bb4e4ec6e719e563bf0e026ad6de42e56c18714a2c692b1b88d7e.vk": {
- "cid": "QmZCvxKcKP97vDAk8Nxs9R1fWtqpjQrAhhfXPoCi1nkDoF",
- "digest": "fc02943678dd119e69e7fab8420e8819",
- "sector_size": 34359738368
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-2627e4006b67f99cef990c0a47d5426cb7ab0a0ad58fc1061547bf2d28b09def.params": {
- "cid": "QmeAN4vuANhXsF8xP2Lx5j2L6yMSdogLzpcvqCJThRGK1V",
- "digest": "3810b7780ac0e299b22ae70f1f94c9bc",
- "sector_size": 68719476736
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-2627e4006b67f99cef990c0a47d5426cb7ab0a0ad58fc1061547bf2d28b09def.vk": {
- "cid": "QmWV8rqZLxs1oQN9jxNWmnT1YdgLwCcscv94VARrhHf1T7",
- "digest": "59d2bf1857adc59a4f08fcf2afaa916b",
- "sector_size": 68719476736
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-b62098629d07946e9028127e70295ed996fe3ed25b0f9f88eb610a0ab4385a3c.params": {
- "cid": "QmVkrXc1SLcpgcudK5J25HH93QvR9tNsVhVTYHm5UymXAz",
- "digest": "2170a91ad5bae22ea61f2ea766630322",
- "sector_size": 68719476736
- },
- "v28-proof-of-spacetime-fallback-merkletree-poseidon_hasher-8-8-2-b62098629d07946e9028127e70295ed996fe3ed25b0f9f88eb610a0ab4385a3c.vk": {
- "cid": "QmbfQjPD7EpzjhWGmvWAsyN2mAZ4PcYhsf3ujuhU9CSuBm",
- "digest": "6d3789148fb6466d07ee1e24d6292fd6",
- "sector_size": 68719476736
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-032d3138d22506ec0082ed72b2dcba18df18477904e35bafee82b3793b06832f.params": {
- "cid": "QmWceMgnWYLopMuM4AoGMvGEau7tNe5UK83XFjH5V9B17h",
- "digest": "434fb1338ecfaf0f59256f30dde4968f",
- "sector_size": 2048
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-032d3138d22506ec0082ed72b2dcba18df18477904e35bafee82b3793b06832f.vk": {
- "cid": "QmamahpFCstMUqHi2qGtVoDnRrsXhid86qsfvoyCTKJqHr",
- "digest": "dc1ade9929ade1708238f155343044ac",
- "sector_size": 2048
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-6babf46ce344ae495d558e7770a585b2382d54f225af8ed0397b8be7c3fcd472.params": {
- "cid": "QmYBpTt7LWNAWr1JXThV5VxX7wsQFLd1PHrGYVbrU1EZjC",
- "digest": "6c77597eb91ab936c1cef4cf19eba1b3",
- "sector_size": 536870912
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-6babf46ce344ae495d558e7770a585b2382d54f225af8ed0397b8be7c3fcd472.vk": {
- "cid": "QmWionkqH2B6TXivzBSQeSyBxojaiAFbzhjtwYRrfwd8nH",
- "digest": "065179da19fbe515507267677f02823e",
- "sector_size": 536870912
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-ecd683648512ab1765faa2a5f14bab48f676e633467f0aa8aad4b55dcb0652bb.params": {
- "cid": "QmPXAPPuQtuQz7Zz3MHMAMEtsYwqM1o9H1csPLeiMUQwZH",
- "digest": "09e612e4eeb7a0eb95679a88404f960c",
- "sector_size": 8388608
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-0-0-sha256_hasher-ecd683648512ab1765faa2a5f14bab48f676e633467f0aa8aad4b55dcb0652bb.vk": {
- "cid": "QmYCuipFyvVW1GojdMrjK1JnMobXtT4zRCZs1CGxjizs99",
- "digest": "b687beb9adbd9dabe265a7e3620813e4",
- "sector_size": 8388608
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-0-sha256_hasher-82a357d2f2ca81dc61bb45f4a762807aedee1b0a53fd6c4e77b46a01bfef7820.params": {
- "cid": "QmengpM684XLQfG8754ToonszgEg2bQeAGUan5uXTHUQzJ",
- "digest": "6a388072a518cf46ebd661f5cc46900a",
- "sector_size": 34359738368
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-0-sha256_hasher-82a357d2f2ca81dc61bb45f4a762807aedee1b0a53fd6c4e77b46a01bfef7820.vk": {
- "cid": "Qmf93EMrADXAK6CyiSfE8xx45fkMfR3uzKEPCvZC1n2kzb",
- "digest": "0c7b4aac1c40fdb7eb82bc355b41addf",
- "sector_size": 34359738368
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-2-sha256_hasher-96f1b4a04c5c51e4759bbf224bbc2ef5a42c7100f16ec0637123f16a845ddfb2.params": {
- "cid": "QmS7ye6Ri2MfFzCkcUJ7FQ6zxDKuJ6J6B8k5PN7wzSR9sX",
- "digest": "1801f8a6e1b00bceb00cc27314bb5ce3",
- "sector_size": 68719476736
- },
- "v28-stacked-proof-of-replication-merkletree-poseidon_hasher-8-8-2-sha256_hasher-96f1b4a04c5c51e4759bbf224bbc2ef5a42c7100f16ec0637123f16a845ddfb2.vk": {
- "cid": "QmehSmC6BhrgRZakPDta2ewoH9nosNzdjCqQRXsNFNUkLN",
- "digest": "a89884252c04c298d0b3c81bfd884164",
- "sector_size": 68719476736
- }
-}
diff --git a/testplans/lotus-soup/.gitignore b/testplans/lotus-soup/.gitignore
deleted file mode 100644
index 001a5837b..000000000
--- a/testplans/lotus-soup/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-lotus-soup
diff --git a/testplans/lotus-soup/_compositions/baseline-docker-1-1-with-restarts.toml b/testplans/lotus-soup/_compositions/baseline-docker-1-1-with-restarts.toml
deleted file mode 100644
index 28865a03b..000000000
--- a/testplans/lotus-soup/_compositions/baseline-docker-1-1-with-restarts.toml
+++ /dev/null
@@ -1,59 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 3
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "1"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "3"
- random_beacon_type = "mock"
- mining_mode = "natural"
- bandwidth = "4MB"
-
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- # Bounce the connection during push and pull requests
- bounce_conn_data_transfers = "true"
diff --git a/testplans/lotus-soup/_compositions/baseline-docker-1-1.toml b/testplans/lotus-soup/_compositions/baseline-docker-1-1.toml
deleted file mode 100644
index 25a31f9ec..000000000
--- a/testplans/lotus-soup/_compositions/baseline-docker-1-1.toml
+++ /dev/null
@@ -1,55 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 3
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "1"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "3"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline-docker-5-1.toml b/testplans/lotus-soup/_compositions/baseline-docker-5-1.toml
deleted file mode 100644
index 001a02434..000000000
--- a/testplans/lotus-soup/_compositions/baseline-docker-5-1.toml
+++ /dev/null
@@ -1,55 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 7
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "5"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "5"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline-k8s-1-1-versions.toml b/testplans/lotus-soup/_compositions/baseline-k8s-1-1-versions.toml
deleted file mode 100644
index 051d8e0c6..000000000
--- a/testplans/lotus-soup/_compositions/baseline-k8s-1-1-versions.toml
+++ /dev/null
@@ -1,74 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 3
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "1"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- [groups.build]
- dependencies = [
- { module = "github.com/filecoin-project/lotus", version = "{{.Env.LOTUS_VERSION_MINER}}"},
- ]
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- [groups.build]
- dependencies = [
- { module = "github.com/filecoin-project/lotus", version = "{{.Env.LOTUS_VERSION_CLIENT}}"},
- ]
diff --git a/testplans/lotus-soup/_compositions/baseline-k8s-1-1.toml b/testplans/lotus-soup/_compositions/baseline-k8s-1-1.toml
deleted file mode 100644
index 754d12797..000000000
--- a/testplans/lotus-soup/_compositions/baseline-k8s-1-1.toml
+++ /dev/null
@@ -1,67 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 3
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "1"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline-k8s-10-3.toml b/testplans/lotus-soup/_compositions/baseline-k8s-10-3.toml
deleted file mode 100644
index 4afd3375e..000000000
--- a/testplans/lotus-soup/_compositions/baseline-k8s-10-3.toml
+++ /dev/null
@@ -1,80 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 14
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "10"
- miners = "3"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners-weak"
- [groups.resources]
- memory = "8192Mi"
- cpu = "1000m"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- sectors = "8"
-
-[[groups]]
- id = "miners-strong"
- [groups.resources]
- memory = "8192Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- sectors = "24"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 10
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline-k8s-2-1.toml b/testplans/lotus-soup/_compositions/baseline-k8s-2-1.toml
deleted file mode 100644
index 6258adf40..000000000
--- a/testplans/lotus-soup/_compositions/baseline-k8s-2-1.toml
+++ /dev/null
@@ -1,67 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 4
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "2"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline-k8s-3-1.toml b/testplans/lotus-soup/_compositions/baseline-k8s-3-1.toml
deleted file mode 100644
index dc6519656..000000000
--- a/testplans/lotus-soup/_compositions/baseline-k8s-3-1.toml
+++ /dev/null
@@ -1,67 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 5
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "3"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "8192Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline-k8s-3-2.toml b/testplans/lotus-soup/_compositions/baseline-k8s-3-2.toml
deleted file mode 100644
index a1c130c31..000000000
--- a/testplans/lotus-soup/_compositions/baseline-k8s-3-2.toml
+++ /dev/null
@@ -1,67 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 6
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "4"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline-k8s-3-3.toml b/testplans/lotus-soup/_compositions/baseline-k8s-3-3.toml
deleted file mode 100644
index d8ab629db..000000000
--- a/testplans/lotus-soup/_compositions/baseline-k8s-3-3.toml
+++ /dev/null
@@ -1,67 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 7
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "3"
- miners = "3"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/baseline.toml b/testplans/lotus-soup/_compositions/baseline.toml
deleted file mode 100644
index be035b6eb..000000000
--- a/testplans/lotus-soup/_compositions/baseline.toml
+++ /dev/null
@@ -1,55 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 6
- builder = "exec:go"
- runner = "local:exec"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "0"
- balance = "20000000.5" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/deals-stress-concurrent-natural-k8s.toml b/testplans/lotus-soup/_compositions/deals-stress-concurrent-natural-k8s.toml
deleted file mode 100644
index 18f14407f..000000000
--- a/testplans/lotus-soup/_compositions/deals-stress-concurrent-natural-k8s.toml
+++ /dev/null
@@ -1,69 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-stress"
- total_instances = 6
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "0"
- balance = "90000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "100m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "14000Mi"
- cpu = "1000m"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "2048Mi"
- cpu = "100m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- deals = "3"
- deal_mode = "concurrent"
diff --git a/testplans/lotus-soup/_compositions/deals-stress-concurrent-natural.toml b/testplans/lotus-soup/_compositions/deals-stress-concurrent-natural.toml
deleted file mode 100644
index cc3ab45fc..000000000
--- a/testplans/lotus-soup/_compositions/deals-stress-concurrent-natural.toml
+++ /dev/null
@@ -1,57 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-stress"
- total_instances = 6
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "1000"
- random_beacon_type = "mock"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- mining_mode = "natural"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- deals = "300"
- deal_mode = "concurrent"
diff --git a/testplans/lotus-soup/_compositions/deals-stress-concurrent.toml b/testplans/lotus-soup/_compositions/deals-stress-concurrent.toml
deleted file mode 100644
index bec530c42..000000000
--- a/testplans/lotus-soup/_compositions/deals-stress-concurrent.toml
+++ /dev/null
@@ -1,56 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-stress"
- total_instances = 6
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "100000"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "1000"
- random_beacon_type = "mock"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- deals = "300"
- deal_mode = "concurrent"
diff --git a/testplans/lotus-soup/_compositions/deals-stress-serial-natural.toml b/testplans/lotus-soup/_compositions/deals-stress-serial-natural.toml
deleted file mode 100644
index c5611a3e8..000000000
--- a/testplans/lotus-soup/_compositions/deals-stress-serial-natural.toml
+++ /dev/null
@@ -1,57 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-stress"
- total_instances = 6
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "1000"
- random_beacon_type = "mock"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- mining_mode = "natural"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- deals = "300"
- deal_mode = "serial"
diff --git a/testplans/lotus-soup/_compositions/deals-stress-serial.toml b/testplans/lotus-soup/_compositions/deals-stress-serial.toml
deleted file mode 100644
index 5317fecb9..000000000
--- a/testplans/lotus-soup/_compositions/deals-stress-serial.toml
+++ /dev/null
@@ -1,56 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-stress"
- total_instances = 6
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "100000"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "1000"
- random_beacon_type = "mock"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- deals = "300"
- deal_mode = "serial"
diff --git a/testplans/lotus-soup/_compositions/drand-halt.toml b/testplans/lotus-soup/_compositions/drand-halt.toml
deleted file mode 100644
index ce2610dc1..000000000
--- a/testplans/lotus-soup/_compositions/drand-halt.toml
+++ /dev/null
@@ -1,79 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "drand-halting"
- total_instances = 6
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "1"
- miners = "1"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "local-drand"
- genesis_timestamp_offset = "0"
-# mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "120Mi"
- cpu = "10m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "120Mi"
- cpu = "10m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "120Mi"
- cpu = "10m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
-
-
-[[groups]]
- id = "drand"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "drand"
- drand_period = "1s"
- drand_log_level = "none"
- suspend_events = "wait 20s -> halt -> wait 1m -> resume -> wait 2s -> halt -> wait 1m -> resume"
diff --git a/testplans/lotus-soup/_compositions/drand-outage-k8s.toml b/testplans/lotus-soup/_compositions/drand-outage-k8s.toml
deleted file mode 100644
index 0588adb0b..000000000
--- a/testplans/lotus-soup/_compositions/drand-outage-k8s.toml
+++ /dev/null
@@ -1,71 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "drand-outage"
- total_instances = 7
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "0"
- miners = "3"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "100"
- random_beacon_type = "local-drand"
- genesis_timestamp_offset = "0"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "1024Mi"
- cpu = "10m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "1024Mi"
- cpu = "10m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "drand"
- [groups.resources]
- memory = "1024Mi"
- cpu = "10m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "drand"
- drand_period = "30s"
- drand_catchup_period = "10s"
- drand_log_level = "debug"
- suspend_events = "wait 5m -> halt -> wait 45m -> resume -> wait 15m -> halt -> wait 5m -> resume"
diff --git a/testplans/lotus-soup/_compositions/drand-outage-local.toml b/testplans/lotus-soup/_compositions/drand-outage-local.toml
deleted file mode 100644
index dad81a203..000000000
--- a/testplans/lotus-soup/_compositions/drand-outage-local.toml
+++ /dev/null
@@ -1,59 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "drand-outage"
- total_instances = 7
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "0"
- miners = "3"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "local-drand"
- genesis_timestamp_offset = "0"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "drand"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "drand"
- drand_period = "30s"
- drand_catchup_period = "10s"
- drand_log_level = "debug"
- suspend_events = "wait 3m -> halt -> wait 3m -> resume -> wait 3m -> halt -> wait 3m -> resume"
diff --git a/testplans/lotus-soup/_compositions/fast-k8s-3-1.toml b/testplans/lotus-soup/_compositions/fast-k8s-3-1.toml
deleted file mode 100644
index d77bfbc3e..000000000
--- a/testplans/lotus-soup/_compositions/fast-k8s-3-1.toml
+++ /dev/null
@@ -1,68 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 5
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "3"
- miners = "1"
- fast_retrieval = "true"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/local-drand.toml b/testplans/lotus-soup/_compositions/local-drand.toml
deleted file mode 100644
index e942ed072..000000000
--- a/testplans/lotus-soup/_compositions/local-drand.toml
+++ /dev/null
@@ -1,72 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 6
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "1"
- miners = "1"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "local-drand"
- genesis_timestamp_offset = "0"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "120Mi"
- cpu = "10m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "120Mi"
- cpu = "10m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "120Mi"
- cpu = "10m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
-
-[[groups]]
- id = "drand"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "drand"
diff --git a/testplans/lotus-soup/_compositions/natural.toml b/testplans/lotus-soup/_compositions/natural.toml
deleted file mode 100644
index bfef6b844..000000000
--- a/testplans/lotus-soup/_compositions/natural.toml
+++ /dev/null
@@ -1,55 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 6
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "100000"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- mining_mode = "natural"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/net-chaos/latency.toml b/testplans/lotus-soup/_compositions/net-chaos/latency.toml
deleted file mode 100644
index fb5f5f544..000000000
--- a/testplans/lotus-soup/_compositions/net-chaos/latency.toml
+++ /dev/null
@@ -1,57 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 7
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "5"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "5"
- random_beacon_type = "mock"
- mining_mode = "natural"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- latency_range = '["20ms", "300ms"]'
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 5
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
- latency_range = '["100ms", "1500ms"]'
diff --git a/testplans/lotus-soup/_compositions/paych-stress-k8s.toml b/testplans/lotus-soup/_compositions/paych-stress-k8s.toml
deleted file mode 100644
index b5d7f9bd4..000000000
--- a/testplans/lotus-soup/_compositions/paych-stress-k8s.toml
+++ /dev/null
@@ -1,62 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = "raulk"
-
-[global]
- plan = "lotus-soup"
- case = "paych-stress"
- total_instances = 4 # 2 clients + 1 miners + 1 bootstrapper
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "2"
- miners = "1"
- genesis_timestamp_offset = "0"
- balance = "100" ## be careful, this is in FIL.
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
- # number of lanes to send vouchers on
- lane_count = "8"
- # number of vouchers on each lane
- vouchers_per_lane = "3"
- # amount to increase voucher by each time (per lane)
- increments = "3" ## in FIL
-
-[[groups]]
- id = "bootstrapper"
- instances = { count = 1 }
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- instances = { count = 1 }
- [groups.run.test_params]
- role = "miner"
- [groups.resources]
- memory = "2048Mi"
- cpu = "100m"
-
-[[groups]]
- id = "clients"
- # the first client will be on the receiving end; all others will be on the sending end.
- instances = { count = 2 }
- [groups.run.test_params]
- role = "client"
- [groups.resources]
- memory = "1024Mi"
- cpu = "100m"
diff --git a/testplans/lotus-soup/_compositions/paych-stress.toml b/testplans/lotus-soup/_compositions/paych-stress.toml
deleted file mode 100644
index b42721a7b..000000000
--- a/testplans/lotus-soup/_compositions/paych-stress.toml
+++ /dev/null
@@ -1,53 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = "raulk"
-
-[global]
- plan = "lotus-soup"
- case = "paych-stress"
- total_instances = 5 # 2 clients + 2 miners + 1 bootstrapper
- builder = "exec:go"
- runner = "local:exec"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "2"
- miners = "2"
- genesis_timestamp_offset = "0"
- balance = "100" ## be careful, this is in FIL.
- sectors = "10"
- random_beacon_type = "mock"
- mining_mode = "natural"
- # number of lanes to send vouchers on
- lane_count = "8"
- # number of vouchers on each lane
- vouchers_per_lane = "3"
- # amount to increase voucher by each time (per lane)
- increments = "3" ## in FIL
-
-[[groups]]
- id = "bootstrapper"
- instances = { count = 1 }
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- instances = { count = 2 }
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- # the first client will be on the receiving end; all others will be on the sending end.
- instances = { count = 2 }
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/pubsub-tracer.toml b/testplans/lotus-soup/_compositions/pubsub-tracer.toml
deleted file mode 100644
index db9f111d1..000000000
--- a/testplans/lotus-soup/_compositions/pubsub-tracer.toml
+++ /dev/null
@@ -1,64 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "deals-e2e"
- total_instances = 7
- builder = "docker:go"
- runner = "local:docker"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- enable_go_build_cache = true
-
-[global.run.test_params]
- clients = "3"
- miners = "2"
- genesis_timestamp_offset = "100000"
- balance = "20000000" # These balances will work for maximum 100 nodes, as TotalFilecoin is 2B
- sectors = "10"
- random_beacon_type = "mock"
- enable_pubsub_tracer = "true"
-
-[[groups]]
- id = "pubsub-tracer"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "pubsub-tracer"
-
-[[groups]]
- id = "bootstrapper"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
-
-[[groups]]
- id = "clients"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/recovery-exec.toml b/testplans/lotus-soup/_compositions/recovery-exec.toml
deleted file mode 100644
index 8e9ef9d6e..000000000
--- a/testplans/lotus-soup/_compositions/recovery-exec.toml
+++ /dev/null
@@ -1,80 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "recovery-failed-windowed-post"
- total_instances = 7
- builder = "exec:go"
- runner = "local:exec"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "3"
- miners = "3"
- genesis_timestamp_offset = "0"
- balance = "20000000"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- sectors = "10"
- mining_mode = "natural"
-
-[[groups]]
- id = "miners-biserk"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner-biserk"
- sectors = "5"
- mining_mode = "natural"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 3
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/_compositions/recovery-k8s.toml b/testplans/lotus-soup/_compositions/recovery-k8s.toml
deleted file mode 100644
index 5b7037e01..000000000
--- a/testplans/lotus-soup/_compositions/recovery-k8s.toml
+++ /dev/null
@@ -1,95 +0,0 @@
-[metadata]
- name = "lotus-soup"
- author = ""
-
-[global]
- plan = "lotus-soup"
- case = "recovery-failed-windowed-post"
- total_instances = 9
- builder = "docker:go"
- runner = "cluster:k8s"
-
-[global.build]
- selectors = ["testground"]
-
-[global.run_config]
- exposed_ports = { pprof = "6060", node_rpc = "1234", miner_rpc = "2345" }
- keep_service=true
-
-[global.build_config]
- push_registry=true
- go_proxy_mode="remote"
- go_proxy_url="http://localhost:8081"
- registry_type="aws"
-
-[global.run.test_params]
- clients = "4"
- miners = "4"
- genesis_timestamp_offset = "0"
- balance = "20000000"
-
-[[groups]]
- id = "bootstrapper"
- [groups.resources]
- memory = "512Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "bootstrapper"
-
-[[groups]]
- id = "miners"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 2
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner"
- sectors = "10"
- mining_mode = "natural"
-
-[[groups]]
- id = "miners-full-slash"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner-full-slash"
- sectors = "10"
- mining_mode = "natural"
-
-[[groups]]
- id = "miners-partial-slash"
- [groups.resources]
- memory = "4096Mi"
- cpu = "1000m"
- [groups.instances]
- count = 1
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "miner-partial-slash"
- sectors = "10"
- mining_mode = "natural"
-
-[[groups]]
- id = "clients"
- [groups.resources]
- memory = "1024Mi"
- cpu = "1000m"
- [groups.instances]
- count = 4
- percentage = 0.0
- [groups.run]
- [groups.run.test_params]
- role = "client"
diff --git a/testplans/lotus-soup/deals_e2e.go b/testplans/lotus-soup/deals_e2e.go
deleted file mode 100644
index d650bb444..000000000
--- a/testplans/lotus-soup/deals_e2e.go
+++ /dev/null
@@ -1,246 +0,0 @@
-package main
-
-import (
- "context"
- "fmt"
- "io/ioutil"
- mbig "math/big"
- "math/rand"
- "os"
- "time"
-
- "github.com/libp2p/go-libp2p/core/peer"
- "github.com/testground/sdk-go/sync"
-
- "github.com/filecoin-project/go-address"
- datatransfer "github.com/filecoin-project/go-data-transfer"
- "github.com/filecoin-project/go-state-types/big"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
-)
-
-// This is the baseline test; Filecoin 101.
-//
-// A network with a bootstrapper, a number of miners, and a number of clients/full nodes
-// is constructed and connected through the bootstrapper.
-// Some funds are allocated to each node and a number of sectors are presealed in the genesis block.
-//
-// The test plan:
-// One or more clients store content to one or more miners, testing storage deals.
-// The plan ensures that the storage deals hit the blockchain and measure the time it took.
-// Verification: one or more clients retrieve and verify the hashes of stored content.
-// The plan ensures that all (previously) published content can be correctly retrieved
-// and measures the time it took.
-//
-// Preparation of the genesis block: this is the responsibility of the bootstrapper.
-// In order to compute the genesis block, we need to collect identities and presealed
-// sectors from each node.
-// Then we create a genesis block that allocates some funds to each node and collects
-// the presealed sectors.
-func dealsE2E(t *testkit.TestEnvironment) error {
- t.RecordMessage("running node with role '%s'", t.Role)
-
- // Dispatch/forward non-client roles to defaults.
- if t.Role != "client" {
- return testkit.HandleDefaultRole(t)
- }
-
- // This is a client role
- fastRetrieval := t.BooleanParam("fast_retrieval")
- t.RecordMessage("running client, with fast retrieval set to: %v", fastRetrieval)
-
- cl, err := testkit.PrepareClient(t)
- if err != nil {
- return err
- }
-
- ctx := context.Background()
- client := cl.FullApi
-
- // select a random miner
- minerAddr := cl.MinerAddrs[rand.Intn(len(cl.MinerAddrs))]
- if err := client.NetConnect(ctx, minerAddr.MinerNetAddrs); err != nil {
- return err
- }
- t.D().Counter(fmt.Sprintf("send-data-to,miner=%s", minerAddr.MinerActorAddr)).Inc(1)
-
- t.RecordMessage("selected %s as the miner", minerAddr.MinerActorAddr)
-
- if fastRetrieval {
- err = initPaymentChannel(t, ctx, cl, minerAddr)
- if err != nil {
- return err
- }
- }
-
- // give some time to the miner, otherwise, we get errors like:
- // deal errored deal failed: (State=26) error calling node: publishing deal: GasEstimateMessageGas
- // error: estimating gas used: message execution failed: exit 19, reason: failed to lock balance: failed to lock client funds: not enough balance to lock for addr t0102: escrow balance 0 < locked 0 + required 640297000 (RetCode=19)
- time.Sleep(40 * time.Second)
-
- time.Sleep(time.Duration(t.GlobalSeq) * 5 * time.Second)
-
- // generate 5000000 bytes of random data
- data := make([]byte, 5000000)
- rand.New(rand.NewSource(time.Now().UnixNano())).Read(data)
-
- file, err := ioutil.TempFile("/tmp", "data")
- if err != nil {
- return err
- }
- defer os.Remove(file.Name())
-
- _, err = file.Write(data)
- if err != nil {
- return err
- }
-
- fcid, err := client.ClientImport(ctx, api.FileRef{Path: file.Name(), IsCAR: false})
- if err != nil {
- return err
- }
- t.RecordMessage("file cid: %s", fcid)
-
- // Check if we should bounce the connection during data transfers
- if t.BooleanParam("bounce_conn_data_transfers") {
- t.RecordMessage("Will bounce connection during push and pull data-transfers")
- err = bounceConnInTransfers(ctx, t, client, minerAddr.MinerNetAddrs.ID)
- if err != nil {
- return err
- }
- }
-
- // start deal
- t1 := time.Now()
- deal := testkit.StartDeal(ctx, minerAddr.MinerActorAddr, client, fcid.Root, fastRetrieval)
- t.RecordMessage("started deal: %s", deal)
-
- // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this
- time.Sleep(2 * time.Second)
-
- t.RecordMessage("waiting for deal to be sealed")
- testkit.WaitDealSealed(t, ctx, client, deal)
- t.D().ResettingHistogram("deal.sealed").Update(int64(time.Since(t1)))
-
- // wait for all client deals to be sealed before trying to retrieve
- t.SyncClient.MustSignalAndWait(ctx, sync.State("done-sealing"), t.IntParam("clients"))
-
- carExport := true
-
- t.RecordMessage("trying to retrieve %s", fcid)
- t1 = time.Now()
- _ = testkit.RetrieveData(t, ctx, client, fcid.Root, nil, carExport, data)
- t.D().ResettingHistogram("deal.retrieved").Update(int64(time.Since(t1)))
-
- t.SyncClient.MustSignalEntry(ctx, testkit.StateStopMining)
-
- time.Sleep(10 * time.Second) // wait for metrics to be emitted
-
- // TODO broadcast published content CIDs to other clients
- // TODO select a random piece of content published by some other client and retrieve it
-
- t.SyncClient.MustSignalAndWait(ctx, testkit.StateDone, t.TestInstanceCount)
- return nil
-}
-
-func bounceConnInTransfers(ctx context.Context, t *testkit.TestEnvironment, client api.FullNode, minerPeerID peer.ID) error {
- storageConnBroken := false
- retrievalConnBroken := false
- upds, err := client.ClientDataTransferUpdates(ctx)
- if err != nil {
- return err
- }
-
- go func() {
- for upd := range upds {
- dir := "push"
- if !upd.IsSender {
- dir = "pull"
- }
-
- t.RecordMessage("%s data transfer status: %s, transferred: %d", dir, datatransfer.Statuses[upd.Status], upd.Transferred)
-
- // Bounce the connection after the first block is sent for the storage deal
- if upd.IsSender && upd.Transferred > 0 && !storageConnBroken {
- storageConnBroken = true
- bounceConnection(ctx, t, client, minerPeerID)
- }
-
- // Bounce the connection after the first block is received for the retrieval deal
- if !upd.IsSender && upd.Transferred > 0 && !retrievalConnBroken {
- retrievalConnBroken = true
- bounceConnection(ctx, t, client, minerPeerID)
- }
- }
- }()
-
- return nil
-}
-
-func bounceConnection(ctx context.Context, t *testkit.TestEnvironment, client api.FullNode, minerPeerID peer.ID) {
- t.RecordMessage("disconnecting peer %s", minerPeerID)
- client.NetBlockAdd(ctx, api.NetBlockList{
- Peers: []peer.ID{minerPeerID},
- })
-
- go func() {
- time.Sleep(3 * time.Second)
- t.RecordMessage("reconnecting to peer %s", minerPeerID)
- client.NetBlockRemove(ctx, api.NetBlockList{
- Peers: []peer.ID{minerPeerID},
- })
- }()
-}
-
-// filToAttoFil converts a fractional filecoin value into AttoFIL, rounding if necessary
-func filToAttoFil(f float64) big.Int {
- a := mbig.NewFloat(f)
- a.Mul(a, mbig.NewFloat(float64(build.FilecoinPrecision)))
- i, _ := a.Int(nil)
- return big.Int{Int: i}
-}
-
-func initPaymentChannel(t *testkit.TestEnvironment, ctx context.Context, cl *testkit.LotusClient, minerAddr testkit.MinerAddressesMsg) error {
- recv := minerAddr
- balance := filToAttoFil(10)
- t.RecordMessage("my balance: %d", balance)
- t.RecordMessage("creating payment channel; from=%s, to=%s, funds=%d", cl.Wallet.Address, recv.WalletAddr, balance)
-
- channel, err := cl.FullApi.PaychGet(ctx, cl.Wallet.Address, recv.WalletAddr, balance, api.PaychGetOpts{
- OffChain: false,
- })
- if err != nil {
- return fmt.Errorf("failed to create payment channel: %w", err)
- }
-
- if addr := channel.Channel; addr != address.Undef {
- return fmt.Errorf("expected an Undef channel address, got: %s", addr)
- }
-
- t.RecordMessage("payment channel created; msg_cid=%s", channel.WaitSentinel)
- t.RecordMessage("waiting for payment channel message to appear on chain")
-
- // wait for the channel creation message to appear on chain.
- _, err = cl.FullApi.StateWaitMsg(ctx, channel.WaitSentinel, 2, api.LookbackNoLimit, true)
- if err != nil {
- return fmt.Errorf("failed while waiting for payment channel creation msg to appear on chain: %w", err)
- }
-
- // need to wait so that the channel is tracked.
- // the full API waits for build.MessageConfidence (=1 in tests) before tracking the channel.
- // we wait for 2 confirmations, so we have the assurance the channel is tracked.
-
- t.RecordMessage("reloading paych; now it should have an address")
- channel, err = cl.FullApi.PaychGet(ctx, cl.Wallet.Address, recv.WalletAddr, big.Zero(), api.PaychGetOpts{
- OffChain: false,
- })
- if err != nil {
- return fmt.Errorf("failed to reload payment channel: %w", err)
- }
-
- t.RecordMessage("channel address: %s", channel.Channel)
-
- return nil
-}
diff --git a/testplans/lotus-soup/deals_stress.go b/testplans/lotus-soup/deals_stress.go
deleted file mode 100644
index 39eea8d0d..000000000
--- a/testplans/lotus-soup/deals_stress.go
+++ /dev/null
@@ -1,147 +0,0 @@
-package main
-
-import (
- "context"
- "fmt"
- "io/ioutil"
- "math/rand"
- "os"
- "sync"
- "time"
-
- "github.com/ipfs/go-cid"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
-)
-
-func dealsStress(t *testkit.TestEnvironment) error {
- // Dispatch/forward non-client roles to defaults.
- if t.Role != "client" {
- return testkit.HandleDefaultRole(t)
- }
-
- t.RecordMessage("running client")
-
- cl, err := testkit.PrepareClient(t)
- if err != nil {
- return err
- }
-
- ctx := context.Background()
- client := cl.FullApi
-
- // select a random miner
- minerAddr := cl.MinerAddrs[rand.Intn(len(cl.MinerAddrs))]
- if err := client.NetConnect(ctx, minerAddr.MinerNetAddrs); err != nil {
- return err
- }
-
- t.RecordMessage("selected %s as the miner", minerAddr.MinerActorAddr)
-
- time.Sleep(12 * time.Second)
-
- // prepare a number of concurrent data points
- deals := t.IntParam("deals")
- data := make([][]byte, 0, deals)
- files := make([]*os.File, 0, deals)
- cids := make([]cid.Cid, 0, deals)
- rng := rand.NewSource(time.Now().UnixNano())
-
- for i := 0; i < deals; i++ {
- dealData := make([]byte, 1600)
- rand.New(rng).Read(dealData)
-
- dealFile, err := ioutil.TempFile("/tmp", "data")
- if err != nil {
- return err
- }
- defer os.Remove(dealFile.Name())
-
- _, err = dealFile.Write(dealData)
- if err != nil {
- return err
- }
-
- dealCid, err := client.ClientImport(ctx, api.FileRef{Path: dealFile.Name(), IsCAR: false})
- if err != nil {
- return err
- }
-
- t.RecordMessage("deal %d file cid: %s", i, dealCid)
-
- data = append(data, dealData)
- files = append(files, dealFile)
- cids = append(cids, dealCid.Root)
- }
-
- concurrentDeals := true
- if t.StringParam("deal_mode") == "serial" {
- concurrentDeals = false
- }
-
- // this to avoid failure to get block
- time.Sleep(2 * time.Second)
-
- t.RecordMessage("starting storage deals")
- if concurrentDeals {
-
- var wg1 sync.WaitGroup
- for i := 0; i < deals; i++ {
- wg1.Add(1)
- go func(i int) {
- defer wg1.Done()
- t1 := time.Now()
- deal := testkit.StartDeal(ctx, minerAddr.MinerActorAddr, client, cids[i], false)
- t.RecordMessage("started storage deal %d -> %s", i, deal)
- time.Sleep(2 * time.Second)
- t.RecordMessage("waiting for deal %d to be sealed", i)
- testkit.WaitDealSealed(t, ctx, client, deal)
- t.D().ResettingHistogram(fmt.Sprintf("deal.sealed,miner=%s", minerAddr.MinerActorAddr)).Update(int64(time.Since(t1)))
- }(i)
- }
- t.RecordMessage("waiting for all deals to be sealed")
- wg1.Wait()
- t.RecordMessage("all deals sealed; starting retrieval")
-
- var wg2 sync.WaitGroup
- for i := 0; i < deals; i++ {
- wg2.Add(1)
- go func(i int) {
- defer wg2.Done()
- t.RecordMessage("retrieving data for deal %d", i)
- t1 := time.Now()
- _ = testkit.RetrieveData(t, ctx, client, cids[i], nil, true, data[i])
-
- t.RecordMessage("retrieved data for deal %d", i)
- t.D().ResettingHistogram("deal.retrieved").Update(int64(time.Since(t1)))
- }(i)
- }
- t.RecordMessage("waiting for all retrieval deals to complete")
- wg2.Wait()
- t.RecordMessage("all retrieval deals successful")
-
- } else {
-
- for i := 0; i < deals; i++ {
- deal := testkit.StartDeal(ctx, minerAddr.MinerActorAddr, client, cids[i], false)
- t.RecordMessage("started storage deal %d -> %s", i, deal)
- time.Sleep(2 * time.Second)
- t.RecordMessage("waiting for deal %d to be sealed", i)
- testkit.WaitDealSealed(t, ctx, client, deal)
- }
-
- for i := 0; i < deals; i++ {
- t.RecordMessage("retrieving data for deal %d", i)
- _ = testkit.RetrieveData(t, ctx, client, cids[i], nil, true, data[i])
- t.RecordMessage("retrieved data for deal %d", i)
- }
- }
-
- t.SyncClient.MustSignalEntry(ctx, testkit.StateStopMining)
- t.SyncClient.MustSignalAndWait(ctx, testkit.StateDone, t.TestInstanceCount)
-
- time.Sleep(15 * time.Second) // wait for metrics to be emitted
-
- return nil
-}
diff --git a/testplans/lotus-soup/env-ci.toml b/testplans/lotus-soup/env-ci.toml
deleted file mode 100644
index bd651c465..000000000
--- a/testplans/lotus-soup/env-ci.toml
+++ /dev/null
@@ -1 +0,0 @@
-[client]
diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod
deleted file mode 100644
index d983de1b6..000000000
--- a/testplans/lotus-soup/go.mod
+++ /dev/null
@@ -1,342 +0,0 @@
-module github.com/filecoin-project/lotus/testplans/lotus-soup
-
-go 1.18
-
-require (
- contrib.go.opencensus.io/exporter/prometheus v0.4.0
- github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe
- github.com/davecgh/go-spew v1.1.1
- github.com/drand/drand v1.3.0
- github.com/filecoin-project/go-address v1.0.0
- github.com/filecoin-project/go-data-transfer v1.15.2
- github.com/filecoin-project/go-fil-markets v1.24.0
- github.com/filecoin-project/go-jsonrpc v0.1.5
- github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4
- github.com/filecoin-project/go-storedcounter v0.1.0
- github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000
- github.com/filecoin-project/specs-actors v0.9.15
- github.com/google/uuid v1.3.0
- github.com/gorilla/mux v1.8.0
- github.com/hashicorp/go-multierror v1.1.1
- github.com/ipfs/go-cid v0.2.0
- github.com/ipfs/go-datastore v0.5.1
- github.com/ipfs/go-ipfs-files v0.1.1
- github.com/ipfs/go-ipld-format v0.4.0
- github.com/ipfs/go-log/v2 v2.5.1
- github.com/ipfs/go-merkledag v0.6.0
- github.com/ipfs/go-unixfs v0.3.1
- github.com/ipld/go-car v0.4.0
- github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c
- github.com/libp2p/go-libp2p v0.21.0
- github.com/libp2p/go-libp2p-core v0.19.1
- github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6
- github.com/multiformats/go-multiaddr v0.6.0
- github.com/testground/sdk-go v0.2.6
- go.opencensus.io v0.23.0
- golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
-)
-
-require (
- github.com/BurntSushi/toml v1.1.0 // indirect
- github.com/DataDog/zstd v1.4.1 // indirect
- github.com/GeertJohan/go.incremental v1.0.0 // indirect
- github.com/GeertJohan/go.rice v1.0.2 // indirect
- github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee // indirect
- github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa // indirect
- github.com/StackExchange/wmi v1.2.1 // indirect
- github.com/Stebalien/go-bitfield v0.0.1 // indirect
- github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
- github.com/akavel/rsrc v0.8.0 // indirect
- github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect
- github.com/avast/retry-go v2.6.0+incompatible // indirect
- github.com/benbjohnson/clock v1.3.0 // indirect
- github.com/beorn7/perks v1.0.1 // indirect
- github.com/bep/debounce v1.2.0 // indirect
- github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
- github.com/buger/goterm v1.0.3 // indirect
- github.com/cespare/xxhash v1.1.0 // indirect
- github.com/cespare/xxhash/v2 v2.1.2 // indirect
- github.com/cheekybits/genny v1.0.0 // indirect
- github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
- github.com/cilium/ebpf v0.4.0 // indirect
- github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 // indirect
- github.com/containerd/cgroups v1.0.4 // indirect
- github.com/coreos/go-systemd/v22 v22.3.2 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
- github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect
- github.com/cskr/pubsub v1.0.2 // indirect
- github.com/daaku/go.zipexe v1.0.0 // indirect
- github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
- github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
- github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e // indirect
- github.com/dgraph-io/badger/v2 v2.2007.3 // indirect
- github.com/dgraph-io/ristretto v0.1.0 // indirect
- github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect
- github.com/docker/go-units v0.4.0 // indirect
- github.com/drand/kyber v1.1.7 // indirect
- github.com/drand/kyber-bls12381 v0.2.1 // indirect
- github.com/dustin/go-humanize v1.0.0 // indirect
- github.com/elastic/go-sysinfo v1.7.0 // indirect
- github.com/elastic/go-windows v1.0.0 // indirect
- github.com/elastic/gosigar v0.14.2 // indirect
- github.com/fatih/color v1.13.0 // indirect
- github.com/filecoin-project/dagstore v0.5.2 // indirect
- github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f // indirect
- github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 // indirect
- github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 // indirect
- github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 // indirect
- github.com/filecoin-project/go-bitfield v0.2.4 // indirect
- github.com/filecoin-project/go-cbor-util v0.0.1 // indirect
- github.com/filecoin-project/go-commp-utils v0.1.3 // indirect
- github.com/filecoin-project/go-crypto v0.0.1 // indirect
- github.com/filecoin-project/go-ds-versioning v0.1.1 // indirect
- github.com/filecoin-project/go-fil-commcid v0.1.0 // indirect
- github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 // indirect
- github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect
- github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect
- github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect
- github.com/filecoin-project/go-legs v0.4.4 // indirect
- github.com/filecoin-project/go-padreader v0.0.1 // indirect
- github.com/filecoin-project/go-paramfetch v0.0.4 // indirect
- github.com/filecoin-project/go-statemachine v1.0.2 // indirect
- github.com/filecoin-project/go-statestore v0.2.0 // indirect
- github.com/filecoin-project/index-provider v0.8.1 // indirect
- github.com/filecoin-project/pubsub v1.0.0 // indirect
- github.com/filecoin-project/specs-actors/v2 v2.3.6 // indirect
- github.com/filecoin-project/specs-actors/v3 v3.1.2 // indirect
- github.com/filecoin-project/specs-actors/v4 v4.0.2 // indirect
- github.com/filecoin-project/specs-actors/v5 v5.0.6 // indirect
- github.com/filecoin-project/specs-actors/v6 v6.0.2 // indirect
- github.com/filecoin-project/specs-actors/v7 v7.0.1 // indirect
- github.com/filecoin-project/specs-actors/v8 v8.0.1 // indirect
- github.com/filecoin-project/storetheindex v0.4.17 // indirect
- github.com/flynn/noise v1.0.0 // indirect
- github.com/francoispqt/gojay v1.2.13 // indirect
- github.com/fsnotify/fsnotify v1.5.4 // indirect
- github.com/gbrlsnchs/jwt/v3 v3.0.1 // indirect
- github.com/gdamore/encoding v1.0.0 // indirect
- github.com/gdamore/tcell/v2 v2.2.0 // indirect
- github.com/go-kit/kit v0.12.0 // indirect
- github.com/go-kit/log v0.2.0 // indirect
- github.com/go-logfmt/logfmt v0.5.1 // indirect
- github.com/go-logr/logr v1.2.3 // indirect
- github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-ole/go-ole v1.2.5 // indirect
- github.com/go-redis/redis/v7 v7.4.0 // indirect
- github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
- github.com/godbus/dbus/v5 v5.1.0 // indirect
- github.com/gogo/googleapis v1.4.0 // indirect
- github.com/gogo/protobuf v1.3.2 // indirect
- github.com/gogo/status v1.1.0 // indirect
- github.com/golang/glog v1.0.0 // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/mock v1.6.0 // indirect
- github.com/golang/protobuf v1.5.2 // indirect
- github.com/golang/snappy v0.0.4 // indirect
- github.com/google/gopacket v1.1.19 // indirect
- github.com/gorilla/websocket v1.5.0 // indirect
- github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect
- github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
- github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 // indirect
- github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 // indirect
- github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e // indirect
- github.com/hashicorp/errwrap v1.1.0 // indirect
- github.com/hashicorp/golang-lru v0.5.4 // indirect
- github.com/huin/goupnp v1.0.3 // indirect
- github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 // indirect
- github.com/influxdata/influxdb v1.9.4 // indirect
- github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab // indirect
- github.com/ipfs/bbloom v0.0.4 // indirect
- github.com/ipfs/go-bitfield v1.0.0 // indirect
- github.com/ipfs/go-bitswap v0.8.0 // indirect
- github.com/ipfs/go-block-format v0.0.3 // indirect
- github.com/ipfs/go-blockservice v0.4.0 // indirect
- github.com/ipfs/go-cidutil v0.1.0 // indirect
- github.com/ipfs/go-ds-badger2 v0.1.2 // indirect
- github.com/ipfs/go-ds-leveldb v0.5.0 // indirect
- github.com/ipfs/go-ds-measure v0.2.0 // indirect
- github.com/ipfs/go-filestore v1.2.0 // indirect
- github.com/ipfs/go-fs-lock v0.0.7 // indirect
- github.com/ipfs/go-graphsync v0.13.1 // indirect
- github.com/ipfs/go-ipfs-blockstore v1.2.0 // indirect
- github.com/ipfs/go-ipfs-chunker v0.0.5 // indirect
- github.com/ipfs/go-ipfs-cmds v0.7.0 // indirect
- github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
- github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect
- github.com/ipfs/go-ipfs-exchange-interface v0.2.0 // indirect
- github.com/ipfs/go-ipfs-exchange-offline v0.3.0 // indirect
- github.com/ipfs/go-ipfs-http-client v0.4.0 // indirect
- github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect
- github.com/ipfs/go-ipfs-pq v0.0.2 // indirect
- github.com/ipfs/go-ipfs-routing v0.2.1 // indirect
- github.com/ipfs/go-ipfs-util v0.0.2 // indirect
- github.com/ipfs/go-ipld-cbor v0.0.6 // indirect
- github.com/ipfs/go-ipld-legacy v0.1.1 // indirect
- github.com/ipfs/go-ipns v0.1.2 // indirect
- github.com/ipfs/go-log v1.0.5 // indirect
- github.com/ipfs/go-metrics-interface v0.0.1 // indirect
- github.com/ipfs/go-path v0.3.0 // indirect
- github.com/ipfs/go-peertaskqueue v0.7.1 // indirect
- github.com/ipfs/go-unixfsnode v1.4.0 // indirect
- github.com/ipfs/go-verifcid v0.0.1 // indirect
- github.com/ipfs/interface-go-ipfs-core v0.7.0 // indirect
- github.com/ipld/go-car/v2 v2.4.1 // indirect
- github.com/ipld/go-codec-dagpb v1.3.2 // indirect
- github.com/ipld/go-ipld-prime v0.17.0 // indirect
- github.com/ipld/go-ipld-selector-text-lite v0.0.1 // indirect
- github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect
- github.com/jackpal/go-nat-pmp v1.0.2 // indirect
- github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
- github.com/jbenet/goprocess v0.1.4 // indirect
- github.com/jessevdk/go-flags v1.4.0 // indirect
- github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect
- github.com/jonboulle/clockwork v0.2.2 // indirect
- github.com/jpillora/backoff v1.0.0 // indirect
- github.com/kelseyhightower/envconfig v1.4.0 // indirect
- github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 // indirect
- github.com/klauspost/compress v1.15.1 // indirect
- github.com/klauspost/cpuid/v2 v2.0.14 // indirect
- github.com/koron/go-ssdp v0.0.3 // indirect
- github.com/libp2p/go-buffer-pool v0.1.0 // indirect
- github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-eventbus v0.2.1 // indirect
- github.com/libp2p/go-flow-metrics v0.0.3 // indirect
- github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect
- github.com/libp2p/go-libp2p-connmgr v0.4.0 // indirect
- github.com/libp2p/go-libp2p-discovery v0.7.0 // indirect
- github.com/libp2p/go-libp2p-gostream v0.4.0 // indirect
- github.com/libp2p/go-libp2p-kad-dht v0.17.0 // indirect
- github.com/libp2p/go-libp2p-kbucket v0.4.7 // indirect
- github.com/libp2p/go-libp2p-loggables v0.1.0 // indirect
- github.com/libp2p/go-libp2p-noise v0.5.0 // indirect
- github.com/libp2p/go-libp2p-peerstore v0.7.1 // indirect
- github.com/libp2p/go-libp2p-pubsub v0.7.1 // indirect
- github.com/libp2p/go-libp2p-record v0.1.3 // indirect
- github.com/libp2p/go-libp2p-resource-manager v0.5.3 // indirect
- github.com/libp2p/go-libp2p-routing-helpers v0.2.3 // indirect
- github.com/libp2p/go-libp2p-tls v0.5.0 // indirect
- github.com/libp2p/go-maddr-filter v0.1.0 // indirect
- github.com/libp2p/go-msgio v0.2.0 // indirect
- github.com/libp2p/go-nat v0.1.0 // indirect
- github.com/libp2p/go-netroute v0.2.0 // indirect
- github.com/libp2p/go-openssl v0.0.7 // indirect
- github.com/libp2p/go-reuseport v0.2.0 // indirect
- github.com/libp2p/go-yamux/v3 v3.1.2 // indirect
- github.com/lucas-clemente/quic-go v0.28.0 // indirect
- github.com/lucasb-eyer/go-colorful v1.0.3 // indirect
- github.com/magefile/mage v1.9.0 // indirect
- github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect
- github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect
- github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect
- github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 // indirect
- github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
- github.com/mattn/go-colorable v0.1.9 // indirect
- github.com/mattn/go-isatty v0.0.14 // indirect
- github.com/mattn/go-runewidth v0.0.10 // indirect
- github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
- github.com/miekg/dns v1.1.50 // indirect
- github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
- github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
- github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect
- github.com/minio/sha256-simd v1.0.0 // indirect
- github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/mr-tron/base58 v1.2.0 // indirect
- github.com/multiformats/go-base32 v0.0.4 // indirect
- github.com/multiformats/go-base36 v0.1.0 // indirect
- github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect
- github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
- github.com/multiformats/go-multibase v0.1.1 // indirect
- github.com/multiformats/go-multicodec v0.5.0 // indirect
- github.com/multiformats/go-multihash v0.2.0 // indirect
- github.com/multiformats/go-multistream v0.3.3 // indirect
- github.com/multiformats/go-varint v0.0.6 // indirect
- github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c // indirect
- github.com/nkovacs/streamquote v1.0.0 // indirect
- github.com/nxadm/tail v1.4.8 // indirect
- github.com/onsi/ginkgo v1.16.5 // indirect
- github.com/opencontainers/runtime-spec v1.0.2 // indirect
- github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df // indirect
- github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect
- github.com/opentracing/opentracing-go v1.2.0 // indirect
- github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
- github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
- github.com/pkg/errors v0.9.1 // indirect
- github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e // indirect
- github.com/prometheus/client_golang v1.12.1 // indirect
- github.com/prometheus/client_model v0.2.0 // indirect
- github.com/prometheus/common v0.35.0 // indirect
- github.com/prometheus/procfs v0.7.3 // indirect
- github.com/prometheus/statsd_exporter v0.21.0 // indirect
- github.com/raulk/clock v1.1.0 // indirect
- github.com/raulk/go-watchdog v1.3.0 // indirect
- github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect
- github.com/rivo/uniseg v0.1.0 // indirect
- github.com/rs/cors v1.7.0 // indirect
- github.com/russross/blackfriday/v2 v2.1.0 // indirect
- github.com/sercand/kuberesolver v2.4.0+incompatible // indirect
- github.com/shirou/gopsutil v2.18.12+incompatible // indirect
- github.com/sirupsen/logrus v1.8.1 // indirect
- github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
- github.com/spaolacci/murmur3 v1.1.0 // indirect
- github.com/stretchr/testify v1.8.0 // indirect
- github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
- github.com/uber/jaeger-client-go v2.28.0+incompatible // indirect
- github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
- github.com/urfave/cli/v2 v2.8.1 // indirect
- github.com/valyala/bytebufferpool v1.0.0 // indirect
- github.com/valyala/fasttemplate v1.2.1 // indirect
- github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 // indirect
- github.com/weaveworks/promrus v1.2.0 // indirect
- github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba // indirect
- github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
- github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 // indirect
- github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
- github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
- github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 // indirect
- github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect
- github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee // indirect
- github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
- github.com/zondax/hid v0.9.0 // indirect
- github.com/zondax/ledger-go v0.12.1 // indirect
- go.dedis.ch/fixbuf v1.0.3 // indirect
- go.dedis.ch/protobuf v1.0.11 // indirect
- go.etcd.io/bbolt v1.3.4 // indirect
- go.opentelemetry.io/otel v1.7.0 // indirect
- go.opentelemetry.io/otel/trace v1.7.0 // indirect
- go.uber.org/atomic v1.9.0 // indirect
- go.uber.org/dig v1.12.0 // indirect
- go.uber.org/fx v1.15.0 // indirect
- go.uber.org/multierr v1.8.0 // indirect
- go.uber.org/zap v1.21.0 // indirect
- go4.org v0.0.0-20200411211856-f5505b9728dd // indirect
- golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
- golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 // indirect
- golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
- golang.org/x/net v0.0.0-20220630215102-69896b714898 // indirect
- golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
- golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
- golang.org/x/text v0.3.7 // indirect
- golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
- golang.org/x/tools v0.1.11 // indirect
- golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
- google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect
- google.golang.org/grpc v1.45.0 // indirect
- google.golang.org/protobuf v1.28.0 // indirect
- gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect
- gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
- gopkg.in/yaml.v2 v2.4.0 // indirect
- gopkg.in/yaml.v3 v3.0.1 // indirect
- howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect
- lukechampine.com/blake3 v1.1.7 // indirect
-)
-
-// This will work in all build modes: docker:go, exec:go, and local go build.
-// On docker:go and exec:go, it maps to /extra/filecoin-ffi, as it's picked up
-// as an "extra source" in the manifest.
-replace github.com/filecoin-project/filecoin-ffi => ../../extern/filecoin-ffi
-
-replace github.com/filecoin-project/lotus => ../..
-
-replace github.com/filecoin-project/go-fil-markets => github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e
diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum
deleted file mode 100644
index 65ab63f1d..000000000
--- a/testplans/lotus-soup/go.sum
+++ /dev/null
@@ -1,3206 +0,0 @@
-bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o=
-cloud.google.com/go/bigtable v1.3.0/go.mod h1:z5EyKrPE8OQmeg4h5MNdKvuSnI9CCT49Ki3f23aBzio=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
-contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs=
-contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0=
-dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
-dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
-dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
-git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
-github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
-github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
-github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M=
-github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
-github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k=
-github.com/Azure/azure-sdk-for-go v41.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nUdBD+e64lEuc4sVnuOfNs=
-github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
-github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
-github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
-github.com/Azure/go-autorest/autorest v0.11.9/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
-github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
-github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
-github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
-github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE=
-github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
-github.com/Azure/go-autorest/autorest/azure/auth v0.5.3/go.mod h1:4bJZhUhcq8LB20TruwHbAQsmUs2Xh+QR7utuJpLXX3A=
-github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM=
-github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
-github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
-github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
-github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
-github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
-github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
-github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
-github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=
-github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
-github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
-github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
-github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
-github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
-github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM=
-github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
-github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg=
-github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0=
-github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk=
-github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4=
-github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ=
-github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY=
-github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
-github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
-github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
-github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
-github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0=
-github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa/go.mod h1:WUmMvh9wMtqj1Xhf1hf3kp9RvL+y6odtdYxpyZjb90U=
-github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic=
-github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
-github.com/Masterminds/sprig v2.16.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
-github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA=
-github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
-github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/SAP/go-hdb v0.14.1/go.mod h1:7fdQLVC2lER3urZLjZCm0AuMQfApof92n3aylBPEkMo=
-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
-github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
-github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
-github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo=
-github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s=
-github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
-github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
-github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
-github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
-github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
-github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
-github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
-github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw=
-github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
-github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI=
-github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc=
-github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
-github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
-github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
-github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ=
-github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
-github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0=
-github.com/apache/arrow/go/arrow v0.0.0-20200923215132-ac86123a3f01/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
-github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
-github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
-github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
-github.com/avast/retry-go v2.6.0+incompatible h1:FelcMrm7Bxacr1/RM8+/eqkDkmVN7tjlsy51dOzB3LI=
-github.com/avast/retry-go v2.6.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
-github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
-github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/aws/aws-sdk-go v1.29.16/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg=
-github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
-github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
-github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
-github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
-github.com/aws/aws-sdk-go-v2 v1.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8=
-github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4=
-github.com/aws/aws-sdk-go-v2/config v1.1.5/go.mod h1:P3F1hku7qzC81txjwXnwOM6Ex6ezkU6+/557Teyb64E=
-github.com/aws/aws-sdk-go-v2/credentials v1.1.5/go.mod h1:Ir1R6tPiR1/2y1hes8yOijFMz54hzSmgcmCDo6F45Qc=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.6/go.mod h1:0+fWMitrmIpENiY8/1DyhdYPUCAPvd9UNz9mtCsEoLQ=
-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.1.2/go.mod h1:Azf567f5wBUfUbwpyJJnLM/geFFIzEulGR30L+nQZOE=
-github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.0.4/go.mod h1:BCfU3Uo2fhKcMZFp9zU5QQGQxqWCOYmZ/27Dju3S/do=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.6/go.mod h1:L0KWr0ASo83PRZu9NaZaDsw3koS6PspKv137DMDZjHo=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.2.2/go.mod h1:nnutjMLuna0s3GVY/MAkpLX03thyNER06gXvnMAPj5g=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.5.0/go.mod h1:uwA7gs93Qcss43astPUb1eq4RyceNmYWAQjZFDOAMLo=
-github.com/aws/aws-sdk-go-v2/service/sso v1.1.5/go.mod h1:bpGz0tidC4y39sZkQSkpO/J0tzWCMXHbw6FZ0j1GkWM=
-github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7ypfil/BIlgmQnCSW4DistU=
-github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
-github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
-github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg=
-github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
-github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
-github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-github.com/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI=
-github.com/benbjohnson/tmpl v1.0.0/go.mod h1:igT620JFIi44B6awvU9IsDhR77IXWtFigTLil/RPdps=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
-github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo=
-github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
-github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
-github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
-github.com/bonitoo-io/go-sql-bigquery v0.3.4-1.4.0/go.mod h1:J4Y6YJm0qTWB9aFziB7cPeSyc6dOZFyJdteSeybVpXQ=
-github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
-github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ=
-github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
-github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
-github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
-github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
-github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
-github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94=
-github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA=
-github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c=
-github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y=
-github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
-github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
-github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
-github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
-github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
-github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts=
-github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o=
-github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
-github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
-github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
-github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
-github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
-github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
-github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
-github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM=
-github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE=
-github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
-github.com/cactus/go-statsd-client/statsd v0.0.0-20191106001114-12b4e2b38748/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI=
-github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
-github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg=
-github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI=
-github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM=
-github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
-github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
-github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
-github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30=
-github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
-github.com/cilium/ebpf v0.4.0 h1:QlHdikaxALkqWasW8hAC1mfR0jdmvbfaBdBPFmRSglA=
-github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
-github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
-github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
-github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
-github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
-github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA=
-github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q=
-github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM=
-github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe h1:69JI97HlzP+PH5Mi1thcGlDoBr6PS2Oe+l3mNmAkbs4=
-github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE=
-github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
-github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
-github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
-github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
-github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
-github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
-github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
-github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
-github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
-github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU=
-github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
-github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
-github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
-github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg=
-github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
-github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
-github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
-github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
-github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
-github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
-github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
-github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4=
-github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4=
-github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
-github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
-github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
-github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
-github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
-github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M=
-github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
-github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e h1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU=
-github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e/go.mod h1:3ZQK6DMPSz/QZ73jlWxBtUhNA8xZx7LzUFSq/OfP8vk=
-github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ=
-github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
-github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
-github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU=
-github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=
-github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE=
-github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI=
-github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE=
-github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
-github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
-github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI=
-github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
-github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
-github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
-github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
-github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
-github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
-github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y=
-github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM=
-github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo=
-github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw=
-github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw=
-github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U=
-github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI=
-github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo=
-github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI=
-github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs=
-github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE=
-github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
-github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
-github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg=
-github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0=
-github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY=
-github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU=
-github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
-github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4=
-github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
-github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
-github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE=
-github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE=
-github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
-github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ=
-github.com/etclabscore/go-openrpc-reflect v0.0.36/go.mod h1:0404Ky3igAasAOpyj1eESjstTyneBAIk5PgJFbK4s5E=
-github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
-github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8=
-github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
-github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
-github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
-github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
-github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c=
-github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0=
-github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8=
-github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8=
-github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE=
-github.com/filecoin-project/go-address v1.0.0 h1:IrexI0kpADLaPP+CdmU3CVAUqnW/FQC0KTmz4lVKiFU=
-github.com/filecoin-project/go-address v1.0.0/go.mod h1:5t3z6qPmIADZBtuE9EIzi0EwzcRy2nVhpo0I/c1r0OA=
-github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM=
-github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs=
-github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o=
-github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE=
-github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo=
-github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk=
-github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE=
-github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM=
-github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM=
-github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk=
-github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM=
-github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg=
-github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs=
-github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg=
-github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw=
-github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30=
-github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ=
-github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o=
-github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ=
-github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8=
-github.com/filecoin-project/go-data-transfer v1.15.1/go.mod h1:dXsUoDjR9tKN7aV6R0BBDNNBPzbNvrrNuWt9MUn3yYc=
-github.com/filecoin-project/go-data-transfer v1.15.2 h1:PzqsFr2Q/onMGKrGh7TtRT0dKsJcVJrioJJnjnKmxlk=
-github.com/filecoin-project/go-data-transfer v1.15.2/go.mod h1:qXOJ3IF5dEJQHykXXTwcaRxu17bXAxr+LglXzkL6bZQ=
-github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4=
-github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o=
-github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4=
-github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ=
-github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8=
-github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ=
-github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo=
-github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8=
-github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM=
-github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24=
-github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM=
-github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI=
-github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI=
-github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI=
-github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g=
-github.com/filecoin-project/go-indexer-core v0.2.16/go.mod h1:5kCKyhtT9k1vephr9l9SFGX8B/HowXIvOhGCkmbxwbY=
-github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk=
-github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4=
-github.com/filecoin-project/go-legs v0.4.4 h1:mpMmAOOnamaz0CV9rgeKhEWA8j9kMC+f+UGCGrxKaZo=
-github.com/filecoin-project/go-legs v0.4.4/go.mod h1:JQ3hA6xpJdbR8euZ2rO0jkxaMxeidXf0LDnVuqPAe9s=
-github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak=
-github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs=
-github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ=
-github.com/filecoin-project/go-paramfetch v0.0.4 h1:H+Me8EL8T5+79z/KHYQQcT8NVOzYVqXIi7nhb48tdm8=
-github.com/filecoin-project/go-paramfetch v0.0.4/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts=
-github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I=
-github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g=
-github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g=
-github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g=
-github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g=
-github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g=
-github.com/filecoin-project/go-state-types v0.1.5/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
-github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
-github.com/filecoin-project/go-state-types v0.1.8/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
-github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
-github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4 h1:ptwW6pe1SDnDGpKzxoLGfwPFsJ3remMP5KKfjbkGFBU=
-github.com/filecoin-project/go-state-types v0.1.11-0.20220823184028-73c63d4127a4/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q=
-github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig=
-github.com/filecoin-project/go-statemachine v1.0.2-0.20220322104818-27f8fbb86dfd/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54=
-github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc=
-github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54=
-github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI=
-github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q=
-github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo=
-github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus=
-github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8=
-github.com/filecoin-project/index-provider v0.8.1 h1:ggoBWvMSWR91HZQCWfv8SZjoTGNyJBwNMLuN9bJZrbU=
-github.com/filecoin-project/index-provider v0.8.1/go.mod h1:c/Ym5HtWPp9NQgNc9dgSBMpSNsZ/DE9FEi9qVubl5RM=
-github.com/filecoin-project/pubsub v1.0.0 h1:ZTmT27U07e54qV1mMiQo4HDr0buo8I1LDHBYLXlsNXM=
-github.com/filecoin-project/pubsub v1.0.0/go.mod h1:GkpB33CcUtUNrLPhJgfdy4FDx4OMNR9k+46DHx/Lqrg=
-github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao=
-github.com/filecoin-project/specs-actors v0.9.15-0.20220514164640-94e0d5e123bd/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE=
-github.com/filecoin-project/specs-actors v0.9.15 h1:3VpKP5/KaDUHQKAMOg4s35g/syDaEBueKLws0vbsjMc=
-github.com/filecoin-project/specs-actors v0.9.15/go.mod h1:pjGEe3QlWtK20ju/aFRsiArbMX6Cn8rqEhhsiCM9xYE=
-github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc=
-github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g=
-github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc=
-github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww=
-github.com/filecoin-project/specs-actors/v3 v3.1.2 h1:Gq3gAbvdGLA/D0GKz1IJfewt9Fh7gA32TPt46Xv+1Cw=
-github.com/filecoin-project/specs-actors/v3 v3.1.2/go.mod h1:uOJn+m6W8OW/1mdWMEvxeM1cjQPxmps7s1Z4bJ9V4kY=
-github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng=
-github.com/filecoin-project/specs-actors/v4 v4.0.2 h1:VTsv30kIf1Keo8Jlu6Omco+2Ud0pG4EN5UAzyYCibh8=
-github.com/filecoin-project/specs-actors/v4 v4.0.2/go.mod h1:zT0GVFxwFS93prGK0b/rMd1sePjRQKfAuodQ9DFAd6Y=
-github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4=
-github.com/filecoin-project/specs-actors/v5 v5.0.5/go.mod h1:dnfda2U+0ZidVnZJ44fnLMa3Mbyzwx51iW/brSsS+nc=
-github.com/filecoin-project/specs-actors/v5 v5.0.6 h1:TLtA9hT3pHQF5vB83GmB+m6anw9u6MjdT+VVn/lyC+c=
-github.com/filecoin-project/specs-actors/v5 v5.0.6/go.mod h1:myb/UGwESp0V1f1BACXSUrFgTWLvGUoG0ZZH7eqriFM=
-github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk=
-github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk=
-github.com/filecoin-project/specs-actors/v6 v6.0.2 h1:K1xPRJoW5PBvb08QF9+4w1AjcnqwR6BjTmeltQFCvWo=
-github.com/filecoin-project/specs-actors/v6 v6.0.2/go.mod h1:wnfVvPnYmzPZilNvSqCSSA/ZQX3rdV/U/Vf9EIoQhrI=
-github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M=
-github.com/filecoin-project/specs-actors/v7 v7.0.1 h1:w72xCxijK7xs1qzmJiw+WYJaVt2EPHN8oiwpA1Ay3/4=
-github.com/filecoin-project/specs-actors/v7 v7.0.1/go.mod h1:tPLEYXoXhcpyLh69Ccq91SOuLXsPWjHiY27CzawjUEk=
-github.com/filecoin-project/specs-actors/v8 v8.0.1 h1:4u0tIRJeT5G7F05lwLRIsDnsrN+bJ5Ixj6h49Q7uE2Y=
-github.com/filecoin-project/specs-actors/v8 v8.0.1/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA=
-github.com/filecoin-project/storetheindex v0.4.17 h1:w0dVc954TGPukoVbidlYvn9Xt+wVhk5vBvrqeJiRo8I=
-github.com/filecoin-project/storetheindex v0.4.17/go.mod h1:y2dL8C5D3PXi183hdxgGtM8vVYOZ1lg515tpl/D3tN8=
-github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ=
-github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
-github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
-github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
-github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp4nseejPd+UKxtCVQ2hUxNTZ7qQZJa7CLriIeo=
-github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
-github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
-github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
-github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo=
-github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
-github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
-github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
-github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
-github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
-github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
-github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
-github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
-github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8=
-github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs=
-github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0=
-github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4=
-github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM=
-github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
-github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
-github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4=
-github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU=
-github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
-github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
-github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
-github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
-github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
-github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I=
-github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
-github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
-github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs=
-github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
-github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4=
-github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs=
-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
-github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
-github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
-github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
-github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
-github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
-github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
-github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
-github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
-github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
-github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
-github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
-github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
-github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
-github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
-github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
-github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
-github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
-github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
-github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
-github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
-github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/errors v0.19.4/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
-github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
-github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
-github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
-github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
-github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
-github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI=
-github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk=
-github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY=
-github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
-github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
-github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
-github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo=
-github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
-github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
-github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
-github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
-github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
-github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
-github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
-github.com/go-openapi/spec v0.19.11/go.mod h1:vqK/dIdLGCosfvYsQV3WfC7N3TiZSnGY2RZKoFK7X28=
-github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
-github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
-github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
-github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
-github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
-github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
-github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
-github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
-github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
-github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
-github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
-github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
-github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
-github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY=
-github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
-github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
-github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
-github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
-github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
-github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
-github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
-github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
-github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
-github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
-github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
-github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
-github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
-github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
-github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
-github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
-github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
-github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
-github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
-github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
-github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
-github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
-github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
-github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
-github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
-github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
-github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
-github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
-github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
-github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
-github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90=
-github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
-github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
-github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
-github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI=
-github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
-github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc=
-github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA=
-github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM=
-github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
-github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
-github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
-github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
-github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
-github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
-github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
-github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
-github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
-github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
-github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
-github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
-github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200417002340-c6e0a841f49a/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
-github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
-github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
-github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
-github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
-github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk=
-github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
-github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
-github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE=
-github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg=
-github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
-github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ=
-github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
-github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
-github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ=
-github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE=
-github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q=
-github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8=
-github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY=
-github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY=
-github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
-github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU=
-github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
-github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM=
-github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
-github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
-github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
-github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
-github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
-github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
-github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
-github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
-github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
-github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
-github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
-github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
-github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=
-github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
-github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
-github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
-github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
-github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
-github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU=
-github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
-github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
-github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
-github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo=
-github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
-github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM=
-github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ=
-github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y=
-github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
-github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
-github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo=
-github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M=
-github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ=
-github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k=
-github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
-github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY=
-github.com/influxdata/flux v0.127.3/go.mod h1:Zc0P/HNnJnhBlm4QsmsBbAeAdtccKo4Eu0OfkP3RCk0=
-github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA=
-github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ=
-github.com/influxdata/influxdb v1.9.4 h1:hZMq5fd4enVnruYHd7qCHsqG7kWQ/msA6x+kCvGFsRY=
-github.com/influxdata/influxdb v1.9.4/go.mod h1:dR0WCHqaHPpJLaqWnRSl/QHsbXJR+QpofbZXyTc8ccw=
-github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8=
-github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig=
-github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo=
-github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
-github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
-github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
-github.com/influxdata/pkg-config v0.2.8/go.mod h1:EMS7Ll0S4qkzDk53XS3Z72/egBsPInt+BeRxb0WeSwk=
-github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
-github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
-github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
-github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y=
-github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
-github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI=
-github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
-github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
-github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ=
-github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus=
-github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis=
-github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0=
-github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs=
-github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM=
-github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI=
-github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo=
-github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA=
-github.com/ipfs/go-bitswap v0.8.0 h1:UEV7kogQu2iGggkE9GhLykDrRCUpsNnpu2NODww/srw=
-github.com/ipfs/go-bitswap v0.8.0/go.mod h1:/h8sBij8UVEaNWl8ABzpLRA5Y1cttdNUnpeGo2AA/LQ=
-github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc=
-github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
-github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc=
-github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
-github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So=
-github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M=
-github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU=
-github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM=
-github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8=
-github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk=
-github.com/ipfs/go-blockservice v0.4.0 h1:7MUijAW5SqdsqEW/EhnNFRJXVF8mGU5aGhZ3CQaCWbY=
-github.com/ipfs/go-blockservice v0.4.0/go.mod h1:kRjO3wlGW9mS1aKuiCeGhx9K1DagQ10ACpVO59qgAx4=
-github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
-github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
-github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM=
-github.com/ipfs/go-cid v0.0.4-0.20191112011718-79e75dffeb10/go.mod h1:/BYOuUoxkE+0f6tGzlzMvycuN+5l35VOR4Bpg2sCmds=
-github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
-github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog=
-github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog=
-github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
-github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
-github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o=
-github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0=
-github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro=
-github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s=
-github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q=
-github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA=
-github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
-github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
-github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE=
-github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
-github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw=
-github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
-github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
-github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
-github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA=
-github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs=
-github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
-github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ=
-github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
-github.com/ipfs/go-delegated-routing v0.2.2/go.mod h1:T8wrRhlXBHLPUR3bZQgArHPfdi7nBfOsZ1m5fr9tAp4=
-github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
-github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
-github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8=
-github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s=
-github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk=
-github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE=
-github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk=
-github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA=
-github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro=
-github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek=
-github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE=
-github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg=
-github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4=
-github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc=
-github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8=
-github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s=
-github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s=
-github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo=
-github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q=
-github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ=
-github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE=
-github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE=
-github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo=
-github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8=
-github.com/ipfs/go-filestore v1.2.0 h1:O2wg7wdibwxkEDcl7xkuQsPvJFRBVgVSsOJ/GP6z3yU=
-github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHLkp9z6+FF8=
-github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM=
-github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U=
-github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc=
-github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE=
-github.com/ipfs/go-graphsync v0.13.1 h1:lWiP/WLycoPUYyj3IDEi1GJNP30kFuYOvimcfeuZyQs=
-github.com/ipfs/go-graphsync v0.13.1/go.mod h1:y8e8G6CmZeL9Srvx1l15CtGiRdf3h5JdQuqPz/iYL0A=
-github.com/ipfs/go-ipfs v0.12.1/go.mod h1:Sbei4ScHevs2v47nUgONQMtHlUfaJjjTNDbhUU1OzOM=
-github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08=
-github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw=
-github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ=
-github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ=
-github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE=
-github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E=
-github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w=
-github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY=
-github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY=
-github.com/ipfs/go-ipfs-blockstore v1.2.0 h1:n3WTeJ4LdICWs/0VSfjHrlqpPpl6MZ+ySd3j8qz0ykw=
-github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ=
-github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk=
-github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw=
-github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8=
-github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8=
-github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk=
-github.com/ipfs/go-ipfs-cmds v0.7.0 h1:0lEldmB7C83RxIOer38Sv1ob6wIoCAIEOaxiYgcv7wA=
-github.com/ipfs/go-ipfs-cmds v0.7.0/go.mod h1:y0bflH6m4g6ary4HniYt98UqbrVnRxmRarzeMdLIUn0=
-github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM=
-github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g=
-github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A=
-github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
-github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
-github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
-github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo=
-github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs=
-github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE=
-github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q=
-github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU=
-github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM=
-github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y=
-github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y=
-github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0=
-github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY=
-github.com/ipfs/go-ipfs-exchange-offline v0.2.0/go.mod h1:HjwBeW0dvZvfOMwDP0TSKXIHf2s+ksdP4E3MLDRtLKY=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA=
-github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s=
-github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4=
-github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4=
-github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs=
-github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84=
-github.com/ipfs/go-ipfs-files v0.1.1 h1:/MbEowmpLo9PJTEQk16m9rKzUHjeP4KRU9nWJyJO324=
-github.com/ipfs/go-ipfs-files v0.1.1/go.mod h1:8xkIrMWH+Y5P7HvJ4Yc5XWwIW2e52dyXUiC0tZyjDbM=
-github.com/ipfs/go-ipfs-http-client v0.4.0 h1:LNuVbFoKfCohCmcNImml3byM3PpTxTT7RPrv/UoDFkI=
-github.com/ipfs/go-ipfs-http-client v0.4.0/go.mod h1:NXzPUKt/QVCuR74a8angJCGOSLPImNi5LqaTxIep/70=
-github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo=
-github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo=
-github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs=
-github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A=
-github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
-github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY=
-github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY=
-github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8=
-github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs=
-github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY=
-github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY=
-github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM=
-github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc=
-github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8=
-github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
-github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc=
-github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc=
-github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4=
-github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4=
-github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA=
-github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0=
-github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA=
-github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms=
-github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k=
-github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs=
-github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM=
-github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ=
-github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM=
-github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI=
-github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI=
-github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc=
-github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg=
-github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI=
-github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ=
-github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
-github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA=
-github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I=
-github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk=
-github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A=
-github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs=
-github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
-github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
-github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
-github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0=
-github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw=
-github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw=
-github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM=
-github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM=
-github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM=
-github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
-github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g=
-github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo=
-github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
-github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
-github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
-github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto=
-github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk=
-github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk=
-github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M=
-github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE=
-github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4=
-github.com/ipfs/go-merkledag v0.6.0 h1:oV5WT2321tS4YQVOPgIrWHvJ0lJobRTerU+i9nmUCuA=
-github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0=
-github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg=
-github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY=
-github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks=
-github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88=
-github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E=
-github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno=
-github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8=
-github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0=
-github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I=
-github.com/ipfs/go-path v0.3.0 h1:tkjga3MtpXyM5v+3EbRvOHEoo+frwi4oumw5K+KYWyA=
-github.com/ipfs/go-path v0.3.0/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I=
-github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ=
-github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U=
-github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U=
-github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY=
-github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU=
-github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE=
-github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU=
-github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4=
-github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4=
-github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k=
-github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw=
-github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0=
-github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8=
-github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o=
-github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s=
-github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4=
-github.com/ipfs/go-unixfsnode v1.4.0 h1:9BUxHBXrbNi8mWHc6j+5C580WJqtVw9uoeEKn4tMhwA=
-github.com/ipfs/go-unixfsnode v1.4.0/go.mod h1:qc7YFFZ8tABc58p62HnIYbUMwj9chhUuFWmxSokfePo=
-github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E=
-github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0=
-github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o=
-github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE=
-github.com/ipfs/interface-go-ipfs-core v0.7.0 h1:7tb+2upz8oCcjIyjo1atdMk+P+u7wPmI+GksBlLE8js=
-github.com/ipfs/interface-go-ipfs-core v0.7.0/go.mod h1:lF27E/nnSPbylPqKVXGZghal2hzifs3MmjyiEjnc9FY=
-github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo=
-github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg=
-github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0=
-github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA=
-github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM=
-github.com/ipld/edelweiss v0.1.2/go.mod h1:14NnBVHgrPO8cqDnKg7vc69LGI0aCAcax6mj21+99ec=
-github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g=
-github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE=
-github.com/ipld/go-car v0.4.0 h1:U6W7F1aKF/OJMHovnOVdst2cpQE5GhmHibQkAixgNcQ=
-github.com/ipld/go-car v0.4.0/go.mod h1:Uslcn4O9cBKK9wqHm/cLTFacg6RAPv6LZx2mxd2Ypl4=
-github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI=
-github.com/ipld/go-car/v2 v2.4.1 h1:9S+FYbQzQJ/XzsdiOV13W5Iu/i+gUnr6csbSD9laFEg=
-github.com/ipld/go-car/v2 v2.4.1/go.mod h1:zjpRf0Jew9gHqSvjsKVyoq9OY9SWoEKdYCQUKVaaPT0=
-github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s=
-github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA=
-github.com/ipld/go-codec-dagpb v1.3.1/go.mod h1:ErNNglIi5KMur/MfFE/svtgQthzVvf+43MrzLbpcIZY=
-github.com/ipld/go-codec-dagpb v1.3.2 h1:MZQUIjanHXXfDuYmtWYT8nFbqfFsZuyHClj6VDmSXr4=
-github.com/ipld/go-codec-dagpb v1.3.2/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA=
-github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w=
-github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
-github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
-github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
-github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
-github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8=
-github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM=
-github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
-github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
-github.com/ipld/go-ipld-prime v0.14.4-0.20211217152141-008fd70fc96f/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
-github.com/ipld/go-ipld-prime v0.16.0/go.mod h1:axSCuOCBPqrH+gvXr2w9uAOulJqBPhHPT2PjoiiU1qA=
-github.com/ipld/go-ipld-prime v0.17.0 h1:+U2peiA3aQsE7mrXjD2nYZaZrCcakoz2Wge8K42Ld8g=
-github.com/ipld/go-ipld-prime v0.17.0/go.mod h1:aYcKm5TIvGfY8P3QBKz/2gKcLxzJ1zDaD+o0bOowhgs=
-github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU=
-github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ=
-github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY=
-github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y=
-github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM=
-github.com/ipld/go-storethehash v0.1.7/go.mod h1:O2CgbSwJfXCrYsjA1g1M7zJmVzzg71BM00ds6pyMLAQ=
-github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c=
-github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4=
-github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
-github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
-github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
-github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
-github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs=
-github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
-github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4=
-github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU=
-github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs=
-github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
-github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk=
-github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
-github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
-github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
-github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
-github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
-github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
-github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
-github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
-github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
-github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
-github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
-github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4=
-github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak=
-github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
-github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
-github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
-github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
-github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
-github.com/jsimonetti/rtnetlink v0.0.0-20190830100107-3784a6c7c552/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
-github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
-github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3TDYCcsFy9hpqb0=
-github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
-github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
-github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
-github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3 h1:Iy7Ifq2ysilWU4QlCx/97OoI4xT1IV7i8byT/EyIT/M=
-github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU=
-github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
-github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
-github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
-github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
-github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
-github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s=
-github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s=
-github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA=
-github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s=
-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
-github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
-github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
-github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A=
-github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio=
-github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
-github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8=
-github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
-github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
-github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
-github.com/koalacxr/quantile v0.0.1/go.mod h1:bGN/mCZLZ4lrSDHRQ6Lglj9chowGux8sGUIND+DQeD0=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
-github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
-github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs=
-github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8=
-github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA=
-github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c h1:3pM6OrLfkfe0rKZjE6MHdcTaI0ohcHbRUZJeJqkvPb4=
-github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod h1:ESXZSm2iaF+1P5o6VFEWpeARTQpcil4e1DwumnTopdg=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
-github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg=
-github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ=
-github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E=
-github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw=
-github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
-github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM=
-github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
-github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
-github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
-github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
-github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk=
-github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE=
-github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc=
-github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU=
-github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70=
-github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM=
-github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog=
-github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk=
-github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
-github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc=
-github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8=
-github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
-github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
-github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM=
-github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
-github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A=
-github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM=
-github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8=
-github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y=
-github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI=
-github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54=
-github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k=
-github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw=
-github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o=
-github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM=
-github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8=
-github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0=
-github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo=
-github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q=
-github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0=
-github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM=
-github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4=
-github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw=
-github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw=
-github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY=
-github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k=
-github.com/libp2p/go-libp2p v0.20.1/go.mod h1:XgJHsOhEBVBXp/2Sj9bm/yEyD94uunAaP6oaegdcKks=
-github.com/libp2p/go-libp2p v0.21.0 h1:s9yYScuIFY33FOOzwTXbc8QqbvsRyKIWFf0FCSJKrfM=
-github.com/libp2p/go-libp2p v0.21.0/go.mod h1:zvcA6/C4mr5/XQarRICh+L1SN9dAHHlSWDq4x5VYxg4=
-github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo=
-github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I=
-github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw=
-github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI=
-github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE=
-github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8=
-github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE=
-github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI=
-github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI=
-github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A=
-github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM=
-github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk=
-github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk=
-github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o=
-github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg=
-github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A=
-github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc=
-github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
-github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg=
-github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
-github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ=
-github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ=
-github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY=
-github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU=
-github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU=
-github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
-github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
-github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM=
-github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU=
-github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo=
-github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4=
-github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4=
-github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA=
-github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M=
-github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk=
-github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0=
-github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik=
-github.com/libp2p/go-libp2p-connmgr v0.4.0 h1:q/KZUS1iMDIQckMZarMYwhQisJqiFPHAVC1c4DR3hDE=
-github.com/libp2p/go-libp2p-connmgr v0.4.0/go.mod h1:exFQQm19PFAx+QuJmBPw4MM58QejzPJRFFFYnNmgi2w=
-github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco=
-github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco=
-github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE=
-github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I=
-github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE=
-github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI=
-github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0=
-github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A=
-github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
-github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA=
-github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw=
-github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII=
-github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0=
-github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0=
-github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y=
-github.com/libp2p/go-libp2p-core v0.5.2/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y=
-github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y=
-github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y=
-github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM=
-github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
-github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
-github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo=
-github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
-github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
-github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
-github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
-github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
-github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8=
-github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM=
-github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8=
-github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
-github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
-github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
-github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg=
-github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8=
-github.com/libp2p/go-libp2p-core v0.15.1/go.mod h1:agSaboYM4hzB1cWekgVReqV5M4g5M+2eNNejV+1EEhs=
-github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c=
-github.com/libp2p/go-libp2p-core v0.19.0/go.mod h1:AkA+FUKQfYt1FLNef5fOPlo/naAWjKy/RCjkcPjqzYg=
-github.com/libp2p/go-libp2p-core v0.19.1 h1:zaZQQCeCrFMtxFa1wHy6AhsVynyNmZAvwgWqSSPT3WE=
-github.com/libp2p/go-libp2p-core v0.19.1/go.mod h1:2uLhmmqDiFY+dw+70KkBLeKvvsJHGWUINRDdeV1ip7k=
-github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE=
-github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I=
-github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
-github.com/libp2p/go-libp2p-daemon v0.2.2/go.mod h1:kyrpsLB2JeNYR2rvXSVWyY0iZuRIMhqzWR3im9BV6NQ=
-github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2TUSBHFlOCetzYdbZL5I=
-github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g=
-github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg=
-github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw=
-github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4=
-github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug=
-github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8=
-github.com/libp2p/go-libp2p-discovery v0.7.0 h1:6Iu3NyningTb/BmUnEhcTwzwbs4zcywwbfTulM9LHuc=
-github.com/libp2p/go-libp2p-discovery v0.7.0/go.mod h1:zPug0Rxib1aQG9iIdwOpRpBf18cAfZgzicO826UQP4I=
-github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc=
-github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI=
-github.com/libp2p/go-libp2p-gostream v0.4.0 h1:heduMMEB78yBqeEQv+P7Fn5X926MHC2jDIC7/7yLpYA=
-github.com/libp2p/go-libp2p-gostream v0.4.0/go.mod h1:21DVGBcCQwRfEXZpCnZ2kG24QiEkBpEQvG53gYXE4u0=
-github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go=
-github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8=
-github.com/libp2p/go-libp2p-http v0.2.1/go.mod h1:9KdioZ7XqNH0eZkZG9bulZLzHv11A7/12fT97agqWhg=
-github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
-github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
-github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
-github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
-github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0=
-github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0=
-github.com/libp2p/go-libp2p-kad-dht v0.17.0 h1:HWEjqjNVDuf8yuccuswGy1vYGzB0v4Z+yQ4DMDMSIqk=
-github.com/libp2p/go-libp2p-kad-dht v0.17.0/go.mod h1:zeE26Xo+PY7sS2AgkBQQcBnJEazMT26KGZLUFttl+rk=
-github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc=
-github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio=
-github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70=
-github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk=
-github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg=
-github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8=
-github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90=
-github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08=
-github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I=
-github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo=
-github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE=
-github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo=
-github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek=
-github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs=
-github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw=
-github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g=
-github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M=
-github.com/libp2p/go-libp2p-mplex v0.6.0/go.mod h1:i3usuPrBbh9FD2fLZjGpotyNkwr42KStYZQY7BeTiu4=
-github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
-github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE=
-github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw=
-github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks=
-github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c=
-github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c=
-github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q=
-github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ=
-github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU=
-github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM=
-github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q=
-github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ=
-github.com/libp2p/go-libp2p-noise v0.4.0/go.mod h1:BzzY5pyzCYSyJbQy9oD8z5oP2idsafjt4/X42h9DjZU=
-github.com/libp2p/go-libp2p-noise v0.5.0 h1:gwJZ/3iH3MRnBrLIyr/YLdCOnmqfJMptlsFFUIc3j0Y=
-github.com/libp2p/go-libp2p-noise v0.5.0/go.mod h1:CYYpJ+T4pox1d1J/hhUVxuMf6b2s3c41hFUgS8/yFQw=
-github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo=
-github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es=
-github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY=
-github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20=
-github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20=
-github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY=
-github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI=
-github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs=
-github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ=
-github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
-github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA=
-github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw=
-github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
-github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
-github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s=
-github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA=
-github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0=
-github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc=
-github.com/libp2p/go-libp2p-peerstore v0.7.0/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0=
-github.com/libp2p/go-libp2p-peerstore v0.7.1 h1:7FpALlqR+3+oOBXdzm3AVt0vjMYLW1b7jM03E4iEHlw=
-github.com/libp2p/go-libp2p-peerstore v0.7.1/go.mod h1:cdUWTHro83vpg6unCpGUr8qJoX3e93Vy8o97u5ppIM0=
-github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA=
-github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s=
-github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk=
-github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q=
-github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk=
-github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg=
-github.com/libp2p/go-libp2p-pubsub v0.7.0/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc=
-github.com/libp2p/go-libp2p-pubsub v0.7.1 h1:e2CPBP5uxvDkE0FiS0obZGZPzt+xuBOc6PpG+50pIAo=
-github.com/libp2p/go-libp2p-pubsub v0.7.1/go.mod h1:EuyBJFtF8qF67IEA98biwK8Xnw5MNJpJ/Z+8iWCMFwc=
-github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM=
-github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ=
-github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI=
-github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU=
-github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M=
-github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA=
-github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ=
-github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc=
-github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ=
-github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ=
-github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ=
-github.com/libp2p/go-libp2p-quic-transport v0.16.1/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ=
-github.com/libp2p/go-libp2p-quic-transport v0.17.0/go.mod h1:x4pw61P3/GRCcSLypcQJE/Q2+E9f4X+5aRcZLXf20LM=
-github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q=
-github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q=
-github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg=
-github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk=
-github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0=
-github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4=
-github.com/libp2p/go-libp2p-resource-manager v0.1.5/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y=
-github.com/libp2p/go-libp2p-resource-manager v0.2.1/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ=
-github.com/libp2p/go-libp2p-resource-manager v0.3.0/go.mod h1:K+eCkiapf+ey/LADO4TaMpMTP9/Qde/uLlrnRqV4PLQ=
-github.com/libp2p/go-libp2p-resource-manager v0.5.1/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0=
-github.com/libp2p/go-libp2p-resource-manager v0.5.3 h1:W8rG2abNBO52SRQYj24AvKmutTJZfoc1OrgzGQPwcRU=
-github.com/libp2p/go-libp2p-resource-manager v0.5.3/go.mod h1:CggtV6EZb+Y0dGh41q5ezO4udcVKyhcEFpydHD8EMe0=
-github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys=
-github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE=
-github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY=
-github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw=
-github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0=
-github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8=
-github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g=
-github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8=
-github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY=
-github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8=
-github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4=
-github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU=
-github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU=
-github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM=
-github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y=
-github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA=
-github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM=
-github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk=
-github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk=
-github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw=
-github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4=
-github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8=
-github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc=
-github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8=
-github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA=
-github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs=
-github.com/libp2p/go-libp2p-swarm v0.11.0 h1:ITgsTEY2tA4OxFJGcWeugiMh2x5+VOEnI2JStT1EWxI=
-github.com/libp2p/go-libp2p-swarm v0.11.0/go.mod h1:sumjVYrC84gPSZOFKL8hNcnN6HZvJSwJ8ymaXeko4Lk=
-github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
-github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
-github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
-github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
-github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
-github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
-github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc=
-github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g=
-github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0=
-github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0=
-github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A=
-github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A=
-github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E=
-github.com/libp2p/go-libp2p-testing v0.8.0/go.mod h1:gRdsNxQSxAZowTgcLY7CC33xPmleZzoBpqSYbWenqPc=
-github.com/libp2p/go-libp2p-testing v0.9.0/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU=
-github.com/libp2p/go-libp2p-testing v0.9.2/go.mod h1:Td7kbdkWqYTJYQGTwzlgXwaqldraIanyjuRiAbK/XQU=
-github.com/libp2p/go-libp2p-testing v0.11.0 h1:+R7FRl/U3Y00neyBSM2qgDzqz3HkWH24U9nMlascHL4=
-github.com/libp2p/go-libp2p-testing v0.11.0/go.mod h1:qG4sF27dfKFoK9KlVzK2y52LQKhp0VEmLjV5aDqr1Hg=
-github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M=
-github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY=
-github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY=
-github.com/libp2p/go-libp2p-tls v0.4.1/go.mod h1:EKCixHEysLNDlLUoKxv+3f/Lp90O2EXNjTr0UQDnrIw=
-github.com/libp2p/go-libp2p-tls v0.5.0 h1:aRNTeOI8Ljm1r4L2uMGxkMsVnyZoPwaqQqMw23qAsQs=
-github.com/libp2p/go-libp2p-tls v0.5.0/go.mod h1:1a4tq0xQSZ0kAkDkZVAppuP3SAIUHcnzi2djJ/2EN4I=
-github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk=
-github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A=
-github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc=
-github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA=
-github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns=
-github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o=
-github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s=
-github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk=
-github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw=
-github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk=
-github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo=
-github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo=
-github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg=
-github.com/libp2p/go-libp2p-transport-upgrader v0.7.1/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg=
-github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY=
-github.com/libp2p/go-libp2p-xor v0.1.0/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY=
-github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8=
-github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4=
-github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
-github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI=
-github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw=
-github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA=
-github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU=
-github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4=
-github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30=
-github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po=
-github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4=
-github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s=
-github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE=
-github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k=
-github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08=
-github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8=
-github.com/libp2p/go-libp2p-yamux v0.8.1/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE=
-github.com/libp2p/go-libp2p-yamux v0.8.2/go.mod h1:rUozF8Jah2dL9LLGyBaBeTQeARdwhefMCTQVQt6QobE=
-github.com/libp2p/go-libp2p-yamux v0.9.1/go.mod h1:wRc6wvyxQINFcKe7daL4BeQ02Iyp+wxyC8WCNfngBrA=
-github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
-github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
-github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
-github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE=
-github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU=
-github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
-github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
-github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU=
-github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk=
-github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk=
-github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ=
-github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ=
-github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E=
-github.com/libp2p/go-mplex v0.6.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E=
-github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU=
-github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
-github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
-github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
-github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA=
-github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE=
-github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU=
-github.com/libp2p/go-msgio v0.2.0/go.mod h1:dBVM1gW3Jk9XqHkU4eKdGvVHdLa51hoGfll6jMJMSlY=
-github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI=
-github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo=
-github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU=
-github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg=
-github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM=
-github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk=
-github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk=
-github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A=
-github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ=
-github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE=
-github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI=
-github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0=
-github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
-github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
-github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
-github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw=
-github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc=
-github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA=
-github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ=
-github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU=
-github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560=
-github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k=
-github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs=
-github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM=
-github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw=
-github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc=
-github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw=
-github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k=
-github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k=
-github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k=
-github.com/libp2p/go-socket-activation v0.1.0/go.mod h1:gzda2dNkMG5Ti2OfWNNwW0FDIbj0g/aJJU320FcLfhk=
-github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14=
-github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ=
-github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw=
-github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
-github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA=
-github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw=
-github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o=
-github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
-github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
-github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0=
-github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M=
-github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU=
-github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU=
-github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM=
-github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI=
-github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y=
-github.com/libp2p/go-tcp-transport v0.5.1/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y=
-github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I=
-github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc=
-github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU=
-github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo=
-github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y=
-github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM=
-github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk=
-github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk=
-github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA=
-github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg=
-github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU=
-github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
-github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
-github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
-github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
-github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
-github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow=
-github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
-github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
-github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI=
-github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE=
-github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U=
-github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ=
-github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ=
-github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs=
-github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo=
-github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo=
-github.com/libp2p/go-yamux/v3 v3.1.1/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4=
-github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q=
-github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4=
-github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
-github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
-github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
-github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw=
-github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE=
-github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8=
-github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q=
-github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
-github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
-github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg=
-github.com/lucas-clemente/quic-go v0.27.0/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI=
-github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI=
-github.com/lucas-clemente/quic-go v0.28.0 h1:9eXVRgIkMQQyiyorz/dAaOYIx3TFzXsIFkNFz4cxuJM=
-github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0=
-github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
-github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
-github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg=
-github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
-github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
-github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE=
-github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
-github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e h1:eItqdWJLVVGhsEuAFcYYaOHVsVd2Fdy5D/tn91nHlaE=
-github.com/marcopolo/go-fil-markets v1.23.1-0.20220811180806-b8e84162b48e/go.mod h1:ZOPAjEUia7H60F7p0kEupi0FR7Hy4Zfz90BpR1TMBwI=
-github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
-github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
-github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI=
-github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
-github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk=
-github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk=
-github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs=
-github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
-github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
-github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
-github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
-github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ=
-github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
-github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8=
-github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8=
-github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s=
-github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ=
-github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s=
-github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI=
-github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
-github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM=
-github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
-github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ=
-github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
-github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
-github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
-github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
-github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
-github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E=
-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
-github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
-github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
-github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
-github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg=
-github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
-github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
-github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc=
-github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
-github.com/mdlayher/netlink v0.0.0-20190828143259-340058475d09/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
-github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
-github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY=
-github.com/mdlayher/wifi v0.0.0-20190303161829-b1436901ddee/go.mod h1:Evt/EIne46u9PtQbeTx2NTcqURpr5K4SvKtGmBuDPN8=
-github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
-github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
-github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
-github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
-github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
-github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
-github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
-github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
-github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
-github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
-github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
-github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
-github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
-github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU=
-github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
-github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s=
-github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE=
-github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
-github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
-github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
-github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
-github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
-github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
-github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
-github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
-github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
-github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
-github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
-github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
-github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
-github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
-github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
-github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
-github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
-github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
-github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
-github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
-github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
-github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE=
-github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM=
-github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
-github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
-github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
-github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
-github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
-github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44=
-github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
-github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE=
-github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y=
-github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI=
-github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc=
-github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0=
-github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc=
-github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM=
-github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug=
-github.com/multiformats/go-multiaddr v0.6.0 h1:qMnoOPj2s8xxPU5kZ57Cqdr0hHhARz7mFsPMIiYNqzg=
-github.com/multiformats/go-multiaddr v0.6.0/go.mod h1:F4IpaKZuPP360tOMn2Tpyu0At8w23aRyVqeK0DbFeGM=
-github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
-github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
-github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
-github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY=
-github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0=
-github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ=
-github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
-github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
-github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q=
-github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
-github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
-github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU=
-github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
-github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
-github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y=
-github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA=
-github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA=
-github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA=
-github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA=
-github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
-github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
-github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
-github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI=
-github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8=
-github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4=
-github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ=
-github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
-github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
-github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ=
-github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs=
-github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues=
-github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U=
-github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po=
-github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
-github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
-github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
-github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
-github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
-github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg=
-github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag=
-github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84=
-github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4=
-github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc=
-github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
-github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
-github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg=
-github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38=
-github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k=
-github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k=
-github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs=
-github.com/multiformats/go-multistream v0.3.0/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg=
-github.com/multiformats/go-multistream v0.3.1/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg=
-github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o=
-github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg=
-github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=
-github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
-github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
-github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
-github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q=
-github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY=
-github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
-github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g=
-github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
-github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w=
-github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s=
-github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4=
-github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
-github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
-github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA=
-github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28=
-github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow=
-github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
-github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
-github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
-github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
-github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
-github.com/Op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
-github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI=
-github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0=
-github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc=
-github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE=
-github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo=
-github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
-github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w=
-github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w=
-github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU=
-github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
-github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
-github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
-github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
-github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE=
-github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
-github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
-github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
-github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
-github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM=
-github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk=
-github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw=
-github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
-github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
-github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
-github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
-github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
-github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
-github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
-github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
-github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls=
-github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
-github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg=
-github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
-github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U=
-github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
-github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
-github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
-github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
-github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
-github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU=
-github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
-github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
-github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
-github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
-github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
-github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
-github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
-github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE=
-github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
-github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc=
-github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
-github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
-github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
-github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY=
-github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8=
-github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ=
-github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y=
-github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0=
-github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI=
-github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
-github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ=
-github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
-github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
-github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
-github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
-github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
-github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
-github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
-github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
-github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
-github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM=
-github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
-github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
-github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
-github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
-github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ=
-github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8=
-github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM=
-github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
-github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
-github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
-github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
-github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
-github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
-github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
-github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
-github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
-github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
-github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
-github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
-github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
-github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
-github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
-github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
-github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
-github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
-github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
-github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
-github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
-github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
-github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
-github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
-github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w=
-github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
-github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU=
-github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY=
-github.com/snowflakedb/gosnowflake v1.6.1/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98=
-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
-github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFCbQYJ3KJlPs/FvPz2dy1tkpxyeNESVyCNNzRXFR0=
-github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
-github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
-github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
-github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
-github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
-github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
-github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc=
-github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
-github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
-github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
-github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
-github.com/testground/sdk-go v0.2.6 h1:sMwv0/caNNODKfdPigNqmSSIZLcse7pZX6fgrjCGBIs=
-github.com/testground/sdk-go v0.2.6/go.mod h1:Q4dnWsUBH+dZ1u7aEGDBHWGUaLfhitjUq3UJQqxeTmk=
-github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
-github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
-github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
-github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
-github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
-github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
-github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
-github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
-github.com/uber-go/tally v3.3.15+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU=
-github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixUabHkC1K/E=
-github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
-github.com/uber/jaeger-client-go v2.23.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
-github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
-github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
-github.com/uber/jaeger-client-go v2.28.0+incompatible h1:G4QSBfvPKvg5ZM2j9MrJFdfI5iSljY/WnJqOGFao6HI=
-github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
-github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
-github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
-github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg=
-github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
-github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
-github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo=
-github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
-github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
-github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
-github.com/urfave/cli/v2 v2.8.1 h1:CGuYNZF9IKZY/rfBe3lJpccSoIY1ytfvmgQT90cNOl4=
-github.com/urfave/cli/v2 v2.8.1/go.mod h1:Z41J9TPoffeoqP0Iza0YbAhGvymRdZAd2uPmZ5JxRdY=
-github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
-github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
-github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
-github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
-github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
-github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
-github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
-github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE=
-github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0=
-github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0=
-github.com/warpfork/go-testmark v0.10.0 h1:E86YlUMYfwIacEsQGlnTvjk1IgYkyTGjPhF0RnwTCmw=
-github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0=
-github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
-github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
-github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w=
-github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
-github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5fLEAMMkida1BVgxVXE4LfZv/XV+znU=
-github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5/go.mod h1:c98fKi5B9u8OsKGiWHLRKus6ToQ1Tubeow44ECO1uxY=
-github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M=
-github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA=
-github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM=
-github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba h1:X4n8JG2e2biEZZXdBKt9HX7DN3bYGFUqljqqy0DqgnY=
-github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba/go.mod h1:CHQnYnQUEPydYCwuy8lmTHfGmdw9TKrhWV0xLx8l0oM=
-github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0=
-github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200715143311-227fab5a2377/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200723185710-6a3894a6352b/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200806213330-63aa96ca5488/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200810223238-211df3b9e24c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799 h1:DOOT2B85S0tHoLGTzV+FakaSSihgRCVwZkjqKQP5L/w=
-github.com/whyrusleeping/cbor-gen v0.0.0-20220323183124-98fa8256a799/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
-github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
-github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
-github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g=
-github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
-github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
-github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM=
-github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE=
-github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8=
-github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso=
-github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY=
-github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ=
-github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA=
-github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
-github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
-github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds=
-github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
-github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow=
-github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg=
-github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
-github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
-github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
-github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
-github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg=
-github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk=
-github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
-github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ=
-github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8=
-github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ=
-github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
-github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
-github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
-github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8=
-github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
-github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU=
-github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo=
-go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs=
-go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw=
-go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
-go.dedis.ch/kyber/v3 v3.0.9 h1:i0ZbOQocHUjfFasBiUql5zVeC7u/vahFd96DFA8UOWk=
-go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg=
-go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo=
-go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4=
-go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo=
-go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4=
-go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
-go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
-go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
-go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
-go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
-go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
-go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
-go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
-go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
-go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
-go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I=
-go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
-go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
-go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
-go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs=
-go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E=
-go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc=
-go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
-go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8=
-go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
-go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
-go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo=
-go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U=
-go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk=
-go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg=
-go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
-go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0=
-go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
-go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
-go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
-go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
-go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY=
-go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw=
-go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A=
-go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8=
-go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
-go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
-go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
-go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
-go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
-go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
-go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
-go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
-go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
-go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
-go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
-go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
-go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
-go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
-go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
-go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU=
-go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg=
-golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
-golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
-golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
-golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
-golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
-golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
-golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc=
-golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc=
-golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E=
-golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
-golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
-golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw=
-golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190524152521-dbbf3f1254d4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304024140-c4206d458c3f/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200422205258-72e4a01eba43/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
-golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
-golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=
-golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
-gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
-gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
-gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
-gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
-google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
-google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
-google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200420144010-e5e8543f8aeb/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w=
-google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=
-google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
-google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk=
-gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE=
-gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
-gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8=
-gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
-gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
-grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
-howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M=
-howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
-k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY=
-k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0=
-k8s.io/client-go v0.17.5/go.mod h1:S8uZpBpjJJdEH/fEyxcqg7Rn0P5jH+ilkgBHjriSmNo=
-k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
-k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
-k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
-k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
-k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
-k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU=
-k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
-k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA=
-lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0=
-lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA=
-modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
-modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8=
-modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
-modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254=
-modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk=
-modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk=
-modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
-modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
-modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
-pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE=
-sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
-sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
-sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
-sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
-sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
diff --git a/testplans/lotus-soup/init.go b/testplans/lotus-soup/init.go
deleted file mode 100644
index bd9367a61..000000000
--- a/testplans/lotus-soup/init.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package main
-
-import (
- "os"
-
- "github.com/ipfs/go-log/v2"
-
- "github.com/filecoin-project/go-state-types/abi"
-
- "github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/actors/policy"
-)
-
-func init() {
- build.BlockDelaySecs = 3
- build.PropagationDelaySecs = 1
-
- _ = log.SetLogLevel("*", "DEBUG")
- _ = log.SetLogLevel("dht", "WARN")
- _ = log.SetLogLevel("swarm2", "WARN")
- _ = log.SetLogLevel("addrutil", "WARN")
- _ = log.SetLogLevel("stats", "WARN")
- _ = log.SetLogLevel("dht/RtRefreshManager", "ERROR") // noisy
- _ = log.SetLogLevel("bitswap", "ERROR") // noisy
- _ = log.SetLogLevel("badgerbs", "ERROR") // noisy
- _ = log.SetLogLevel("sub", "ERROR") // noisy
- _ = log.SetLogLevel("pubsub", "ERROR") // noisy
- _ = log.SetLogLevel("chain", "ERROR") // noisy
- _ = log.SetLogLevel("chainstore", "ERROR") // noisy
- _ = log.SetLogLevel("basichost", "ERROR") // noisy
-
- _ = os.Setenv("BELLMAN_NO_GPU", "1")
-
- build.InsecurePoStValidation = true
- build.DisableBuiltinAssets = true
-
- // MessageConfidence is the amount of tipsets we wait after a message is
- // mined, e.g. payment channel creation, to be considered committed.
- build.MessageConfidence = 1
-
- // The duration of a deadline's challenge window, the period before a
- // deadline when the challenge is available.
- //
- // This will auto-scale the proving period.
- // policy.SetWPoStChallengeWindow(abi.ChainEpoch(5)) // commented-out until we enable PoSt faults tests
-
- // Number of epochs between publishing the precommit and when the challenge for interactive PoRep is drawn
- // used to ensure it is not predictable by miner.
- policy.SetPreCommitChallengeDelay(abi.ChainEpoch(10))
-
- policy.SetConsensusMinerMinPower(abi.NewTokenAmount(2048))
- policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg8MiBV1)
-
- policy.SetMinVerifiedDealSize(abi.NewTokenAmount(256))
-
- // Disable upgrades.
- build.UpgradeSmokeHeight = -1
- build.UpgradeIgnitionHeight = -2
- build.UpgradeLiftoffHeight = -3
- // We need to _run_ this upgrade because genesis doesn't support v2, so
- // we run it at height 0.
- build.UpgradeAssemblyHeight = 0
-}
diff --git a/testplans/lotus-soup/main.go b/testplans/lotus-soup/main.go
deleted file mode 100644
index 406dffdd2..000000000
--- a/testplans/lotus-soup/main.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package main
-
-import (
- "github.com/testground/sdk-go/run"
-
- "github.com/filecoin-project/lotus/testplans/lotus-soup/paych"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/rfwp"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
-)
-
-var cases = map[string]interface{}{
- "deals-e2e": testkit.WrapTestEnvironment(dealsE2E),
- "recovery-failed-windowed-post": testkit.WrapTestEnvironment(rfwp.RecoveryFromFailedWindowedPoStE2E),
- "deals-stress": testkit.WrapTestEnvironment(dealsStress),
- "drand-halting": testkit.WrapTestEnvironment(dealsE2E),
- "drand-outage": testkit.WrapTestEnvironment(dealsE2E),
- "paych-stress": testkit.WrapTestEnvironment(paych.Stress),
- "epoch-boundary": testkit.WrapTestEnvironment(epochBoundary),
-}
-
-func main() {
- sanityCheck()
-
- run.InvokeMap(cases)
-}
diff --git a/testplans/lotus-soup/manifest.toml b/testplans/lotus-soup/manifest.toml
deleted file mode 100644
index 56d20aefd..000000000
--- a/testplans/lotus-soup/manifest.toml
+++ /dev/null
@@ -1,252 +0,0 @@
-name = "lotus-soup"
-
-[defaults]
-builder = "docker:go"
-runner = "local:docker"
-
-[builders."exec:go"]
-enabled = true
-
-[builders."docker:go"]
-enabled = true
-build_base_image = "iptestground/oni-buildbase:v15-lotus"
-runtime_image = "iptestground/oni-runtime:v10-debug"
-
-[runners."local:exec"]
-enabled = true
-
-[runners."local:docker"]
-enabled = true
-
-[runners."cluster:k8s"]
-enabled = true
-
-######################
-##
-## Testcases
-##
-######################
-
-[[testcases]]
-name = "deals-e2e"
-instances = { min = 1, max = 100, default = 5 }
-
- [testcases.params]
- clients = { type = "int", default = 1 }
- miners = { type = "int", default = 1 }
- balance = { type = "float", default = 1 }
- sectors = { type = "int", default = 1 }
- role = { type = "string" }
-
- genesis_timestamp_offset = { type = "int", default = 0 }
-
- random_beacon_type = { type = "enum", default = "mock", options = ["mock", "local-drand", "external-drand"] }
-
- # Params relevant to drand nodes. drand nodes should have role="drand", and must all be
- # in the same composition group. There must be at least threshold drand nodes.
- # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand"
- # for the lotus node groups.
- drand_period = { type = "duration", default="10s" }
- drand_threshold = { type = "int", default = 2 }
- drand_gossip_relay = { type = "bool", default = true }
- drand_log_level = { type = "string", default="info" }
-
- # Params relevant to pubsub tracing
- enable_pubsub_tracer = { type = "bool", default = false }
- mining_mode = { type = "enum", default = "synchronized", options = ["synchronized", "natural"] }
-
- # Fast retrieval
- fast_retrieval = { type = "bool", default = false }
-
- # Bounce connection during push and pull data transfers
- bounce_conn_data_transfers = { type = "bool", default = false }
-
-[[testcases]]
-name = "epoch-boundary"
-instances = { min = 1, max = 100, default = 5 }
-
- [testcases.params]
- clients = { type = "int", default = 1 }
- miners = { type = "int", default = 1 }
- attackers = { type = "int", default = 1 }
- balance = { type = "float", default = 1 }
- sectors = { type = "int", default = 1 }
- role = { type = "string" }
-
- genesis_timestamp_offset = { type = "int", default = 0 }
-
- random_beacon_type = { type = "enum", default = "mock", options = ["mock", "local-drand", "external-drand"] }
-
- # Params relevant to drand nodes. drand nodes should have role="drand", and must all be
- # in the same composition group. There must be at least threshold drand nodes.
- # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand"
- # for the lotus node groups.
- drand_period = { type = "duration", default="10s" }
- drand_threshold = { type = "int", default = 2 }
- drand_gossip_relay = { type = "bool", default = true }
- drand_log_level = { type = "string", default="info" }
-
- # Params relevant to pubsub tracing
- enable_pubsub_tracer = { type = "bool", default = false }
- mining_mode = { type = "enum", default = "synchronized", options = ["synchronized", "natural"] }
-
- # Fast retrieval
- fast_retrieval = { type = "bool", default = false }
-
- # Bounce connection during push and pull data transfers
- bounce_conn_data_transfers = { type = "bool", default = false }
-
-[[testcases]]
-name = "drand-halting"
-instances = { min = 1, max = 100, default = 5 }
-
- [testcases.params]
- clients = { type = "int", default = 1 }
- miners = { type = "int", default = 1 }
- balance = { type = "float", default = 1 }
- sectors = { type = "int", default = 1 }
- role = { type = "string" }
- genesis_timestamp_offset = { type = "int", default = 0 }
-
-
- random_beacon_type = { type = "enum", default = "local-drand", options = ["mock", "local-drand", "external-drand"] }
-
- # Params relevant to drand nodes. drand nodes should have role="drand", and must all be
- # in the same composition group. There must be at least threshold drand nodes.
- # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand"
- # for the lotus node groups.
- drand_period = { type = "duration", default="10s" }
- drand_threshold = { type = "int", default = 2 }
- drand_gossip_relay = { type = "bool", default = true }
- drand_log_level = { type = "string", default="info" }
- suspend_events = { type = "string", default="", desc = "a sequence of halt/resume/wait events separated by '->'" }
-
- # Params relevant to pubsub tracing
- enable_pubsub_tracer = { type = "bool", default = false } # Mining Mode: synchronized -vs- natural time
- mining_mode = { type = "enum", default = "synchronized", options = ["synchronized", "natural"] }
-
-
-[[testcases]]
-name = "drand-outage"
-instances = { min = 1, max = 100, default = 5 }
-
- [testcases.params]
- clients = { type = "int", default = 0 }
- miners = { type = "int", default = 3 }
- balance = { type = "float", default = 1 }
- sectors = { type = "int", default = 1 }
- role = { type = "string" }
- genesis_timestamp_offset = { type = "int", default = 0 }
-
-
- random_beacon_type = { type = "enum", default = "local-drand", options = ["mock", "local-drand", "external-drand"] }
-
- # Params relevant to drand nodes. drand nodes should have role="drand", and must all be
- # in the same composition group. There must be at least threshold drand nodes.
- # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand"
- # for the lotus node groups.
- drand_period = { type = "duration", default="30s" }
- drand_catchup_period = { type = "duration", default="10s" }
- drand_threshold = { type = "int", default = 2 }
- drand_gossip_relay = { type = "bool", default = true }
- drand_log_level = { type = "string", default="info" }
- suspend_events = { type = "string", default="", desc = "a sequence of halt/resume/wait events separated by '->'" }
-
- # Params relevant to pubsub tracing
- enable_pubsub_tracer = { type = "bool", default = false } # Mining Mode: synchronized -vs- natural time
- mining_mode = { type = "enum", default = "synchronized", options = ["synchronized", "natural"] }
-
-
-[[testcases]]
-name = "deals-stress"
-instances = { min = 1, max = 100, default = 5 }
-
- [testcases.params]
- clients = { type = "int", default = 1 }
- miners = { type = "int", default = 1 }
- balance = { type = "float", default = 1 }
- sectors = { type = "int", default = 1 }
- role = { type = "string" }
-
- genesis_timestamp_offset = { type = "int", default = 0 }
-
- random_beacon_type = { type = "enum", default = "mock", options = ["mock", "local-drand", "external-drand"] }
-
- # Params relevant to drand nodes. drand nodes should have role="drand", and must all be
- # in the same composition group. There must be at least threshold drand nodes.
- # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand"
- # for the lotus node groups.
- drand_period = { type = "duration", default="10s" }
- drand_threshold = { type = "int", default = 2 }
- drand_gossip_relay = { type = "bool", default = true }
-
- # Params relevant to pubsub tracing
- enable_pubsub_tracer = { type = "bool", default = false }
-
- # Mining Mode: synchronized -vs- natural time
- mining_mode = { type = "enum", default = "synchronized", options = ["synchronized", "natural"] }
-
- deals = { type = "int", default = 1 }
- deal_mode = { type = "enum", default = "serial", options = ["serial", "concurrent"] }
-
-
-[[testcases]]
-name = "paych-stress"
-instances = { min = 1, max = 100, default = 5 }
-
- [testcases.params]
- clients = { type = "int", default = 1 }
- miners = { type = "int", default = 1 }
- balance = { type = "float", default = 1 }
- sectors = { type = "int", default = 1 }
- role = { type = "string" }
- genesis_timestamp_offset = { type = "int", default = 0 }
-
- random_beacon_type = { type = "enum", default = "local-drand", options = ["mock", "local-drand", "external-drand"] }
-
- # Params relevant to drand nodes. drand nodes should have role="drand", and must all be
- # in the same composition group. There must be at least threshold drand nodes.
- # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand"
- # for the lotus node groups.
- drand_period = { type = "duration", default="10s" }
- drand_threshold = { type = "int", default = 2 }
- drand_gossip_relay = { type = "bool", default = true }
- drand_log_level = { type = "string", default="info" }
- suspend_events = { type = "string", default="", desc = "a sequence of halt/resume/wait events separated by '->'" }
-
- # Params relevant to pubsub tracing
- enable_pubsub_tracer = { type = "bool", default = false } # Mining Mode: synchronized -vs- natural time
- mining_mode = { type = "enum", default = "synchronized", options = ["synchronized", "natural"] }
-
- # ********** Test-case specific **********
- increments = { type = "int", default = "100", desc = "increments in which to send payment vouchers" }
- lane_count = { type = "int", default = "256", desc = "lanes to open; vouchers will be distributed across these lanes in round-robin fashion" }
-
-
-[[testcases]]
-name = "recovery-failed-windowed-post"
-instances = { min = 1, max = 100, default = 5 }
-
- [testcases.params]
- clients = { type = "int", default = 1 }
- miners = { type = "int", default = 1 }
- balance = { type = "int", default = 1 }
- sectors = { type = "int", default = 1 }
- role = { type = "string" }
-
- genesis_timestamp_offset = { type = "int", default = 0 }
-
- random_beacon_type = { type = "enum", default = "mock", options = ["mock", "local-drand", "external-drand"] }
-
- # Params relevant to drand nodes. drand nodes should have role="drand", and must all be
- # in the same composition group. There must be at least threshold drand nodes.
- # To get lotus nodes to actually use the drand nodes, you must set random_beacon_type="local-drand"
- # for the lotus node groups.
- drand_period = { type = "duration", default="10s" }
- drand_threshold = { type = "int", default = 2 }
- drand_gossip_relay = { type = "bool", default = true }
- drand_log_level = { type = "string", default="info" }
-
- # Params relevant to pubsub tracing
- enable_pubsub_tracer = { type = "bool", default = false }
- mining_mode = { type = "enum", default = "synchronized", options = ["synchronized", "natural"] }
diff --git a/testplans/lotus-soup/paych/README.md b/testplans/lotus-soup/paych/README.md
deleted file mode 100644
index dbd5879ed..000000000
--- a/testplans/lotus-soup/paych/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Payment channels end-to-end tests
-
-This package contains the following test cases, each of which is described
-further below.
-
-- Payment channels stress test case (`stress.go`).
-
-## Payment channels stress test case (`stress.go`)
-
-***WIP | blocked due to https://github.com/filecoin-project/lotus/issues/2297***
-
-This test case turns all clients into payment receivers and senders.
-The first member to start in the group becomes the _receiver_.
-All other members become _senders_.
-
-The _senders_ will open a single payment channel to the _receiver_, and will
-wait for the message to be posted on-chain. We are setting
-`build.MessageConfidence=1`, in order to accelerate the test. So we'll only wait
-for a single tipset confirmation once we witness the message.
-
-Once the message is posted, we load the payment channel actor address and create
-as many lanes as the `lane_count` test parameter dictates.
-
-When then fetch our total balance, and start sending it on the payment channel,
-round-robinning across all lanes, until our balance is extinguished.
-
-**TODO:**
-
-- [ ] Assertions, metrics, etc. Actually gather statistics. Right now this is
- just a smoke test, and it fails.
-- [ ] Implement the _receiver_ logic.
-- [ ] Model test lifetime by signalling end.
\ No newline at end of file
diff --git a/testplans/lotus-soup/paych/stress.go b/testplans/lotus-soup/paych/stress.go
deleted file mode 100644
index 8f0097edf..000000000
--- a/testplans/lotus-soup/paych/stress.go
+++ /dev/null
@@ -1,316 +0,0 @@
-package paych
-
-import (
- "context"
- "fmt"
- "os"
- "time"
-
- "github.com/ipfs/go-cid"
- "github.com/testground/sdk-go/sync"
-
- "github.com/filecoin-project/go-address"
- "github.com/filecoin-project/go-state-types/big"
- "github.com/filecoin-project/go-state-types/builtin/v8/paych"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
-)
-
-var SendersDoneState = sync.State("senders-done")
-var ReceiverReadyState = sync.State("receiver-ready")
-var ReceiverAddedVouchersState = sync.State("receiver-added-vouchers")
-
-var VoucherTopic = sync.NewTopic("voucher", &paych.SignedVoucher{})
-var SettleTopic = sync.NewTopic("settle", cid.Cid{})
-
-type ClientMode uint64
-
-const (
- ModeSender ClientMode = iota
- ModeReceiver
-)
-
-func (cm ClientMode) String() string {
- return [...]string{"Sender", "Receiver"}[cm]
-}
-
-func getClientMode(groupSeq int64) ClientMode {
- if groupSeq == 1 {
- return ModeReceiver
- }
- return ModeSender
-}
-
-// TODO Stress is currently WIP. We found blockers in Lotus that prevent us from
-//
-// making progress. See https://github.com/filecoin-project/lotus/issues/2297.
-func Stress(t *testkit.TestEnvironment) error {
- // Dispatch/forward non-client roles to defaults.
- if t.Role != "client" {
- return testkit.HandleDefaultRole(t)
- }
-
- // This is a client role.
- t.RecordMessage("running payments client")
-
- ctx := context.Background()
- cl, err := testkit.PrepareClient(t)
- if err != nil {
- return err
- }
-
- // are we the receiver or a sender?
- mode := getClientMode(t.GroupSeq)
- t.RecordMessage("acting as %s", mode)
-
- var clients []*testkit.ClientAddressesMsg
- sctx, cancel := context.WithCancel(ctx)
- clientsCh := make(chan *testkit.ClientAddressesMsg)
- t.SyncClient.MustSubscribe(sctx, testkit.ClientsAddrsTopic, clientsCh)
- for i := 0; i < t.TestGroupInstanceCount; i++ {
- clients = append(clients, <-clientsCh)
- }
- cancel()
-
- switch mode {
- case ModeReceiver:
- err := runReceiver(t, ctx, cl)
- if err != nil {
- return err
- }
-
- case ModeSender:
- err := runSender(ctx, t, clients, cl)
- if err != nil {
- return err
- }
- }
-
- // Signal that the client is done
- t.SyncClient.MustSignalEntry(ctx, testkit.StateDone)
-
- // Signal to the miners to stop mining
- t.SyncClient.MustSignalEntry(ctx, testkit.StateStopMining)
-
- return nil
-}
-
-func runSender(ctx context.Context, t *testkit.TestEnvironment, clients []*testkit.ClientAddressesMsg, cl *testkit.LotusClient) error {
- var (
- // lanes to open; vouchers will be distributed across these lanes in round-robin fashion
- laneCount = t.IntParam("lane_count")
- // number of vouchers to send on each lane
- vouchersPerLane = t.IntParam("vouchers_per_lane")
- // increments in which to send payment vouchers
- increments = big.Mul(big.NewInt(int64(t.IntParam("increments"))), big.NewInt(int64(build.FilecoinPrecision)))
- // channel amount should be enough to cover all vouchers
- channelAmt = big.Mul(big.NewInt(int64(laneCount*vouchersPerLane)), increments)
- )
-
- // Lock up funds in the payment channel.
- recv := findReceiver(clients)
- balance, err := cl.FullApi.WalletBalance(ctx, cl.Wallet.Address)
- if err != nil {
- return fmt.Errorf("failed to acquire wallet balance: %w", err)
- }
-
- t.RecordMessage("my balance: %d", balance)
- t.RecordMessage("creating payment channel; from=%s, to=%s, funds=%d", cl.Wallet.Address, recv.WalletAddr, channelAmt)
-
- pid := os.Getpid()
- t.RecordMessage("sender pid: %d", pid)
-
- time.Sleep(20 * time.Second)
-
- channel, err := cl.FullApi.PaychGet(ctx, cl.Wallet.Address, recv.WalletAddr, channelAmt, api.PaychGetOpts{
- OffChain: false,
- })
- if err != nil {
- return fmt.Errorf("failed to create payment channel: %w", err)
- }
-
- if addr := channel.Channel; addr != address.Undef {
- return fmt.Errorf("expected an Undef channel address, got: %s", addr)
- }
-
- t.RecordMessage("payment channel created; msg_cid=%s", channel.WaitSentinel)
- t.RecordMessage("waiting for payment channel message to appear on chain")
-
- // wait for the channel creation message to appear on chain.
- _, err = cl.FullApi.StateWaitMsg(ctx, channel.WaitSentinel, 2, api.LookbackNoLimit, true)
- if err != nil {
- return fmt.Errorf("failed while waiting for payment channel creation msg to appear on chain: %w", err)
- }
-
- // need to wait so that the channel is tracked.
- // the full API waits for build.MessageConfidence (=1 in tests) before tracking the channel.
- // we wait for 2 confirmations, so we have the assurance the channel is tracked.
-
- t.RecordMessage("get payment channel address")
- channelAddr, err := cl.FullApi.PaychGetWaitReady(ctx, channel.WaitSentinel)
- if err != nil {
- return fmt.Errorf("failed to get payment channel address: %w", err)
- }
-
- t.RecordMessage("channel address: %s", channelAddr)
- t.RecordMessage("allocating lanes; count=%d", laneCount)
-
- // allocate as many lanes as required
- var lanes []uint64
- for i := 0; i < laneCount; i++ {
- lane, err := cl.FullApi.PaychAllocateLane(ctx, channelAddr)
- if err != nil {
- return fmt.Errorf("failed to allocate lane: %w", err)
- }
- lanes = append(lanes, lane)
- }
-
- t.RecordMessage("lanes allocated; count=%d", laneCount)
-
- <-t.SyncClient.MustBarrier(ctx, ReceiverReadyState, 1).C
-
- t.RecordMessage("sending payments in round-robin fashion across lanes; increments=%d", increments)
-
- // create vouchers
- remaining := channelAmt
- for i := 0; i < vouchersPerLane; i++ {
- for _, lane := range lanes {
- voucherAmt := big.Mul(big.NewInt(int64(i+1)), increments)
- voucher, err := cl.FullApi.PaychVoucherCreate(ctx, channelAddr, voucherAmt, lane)
- if err != nil {
- return fmt.Errorf("failed to create voucher: %w", err)
- }
- t.RecordMessage("payment voucher created; lane=%d, nonce=%d, amount=%d", voucher.Voucher.Lane, voucher.Voucher.Nonce, voucher.Voucher.Amount)
-
- _, err = t.SyncClient.Publish(ctx, VoucherTopic, voucher.Voucher)
- if err != nil {
- return fmt.Errorf("failed to publish voucher: %w", err)
- }
-
- remaining = big.Sub(remaining, increments)
- t.RecordMessage("remaining balance: %d", remaining)
- }
- }
-
- t.RecordMessage("finished sending all payment vouchers")
-
- // Inform the receiver that all vouchers have been created
- t.SyncClient.MustSignalEntry(ctx, SendersDoneState)
-
- // Wait for the receiver to add all vouchers
- <-t.SyncClient.MustBarrier(ctx, ReceiverAddedVouchersState, 1).C
-
- t.RecordMessage("settle channel")
-
- // Settle the channel. When the receiver sees the settle message, they
- // should automatically submit all vouchers.
- settleMsgCid, err := cl.FullApi.PaychSettle(ctx, channelAddr)
- if err != nil {
- return fmt.Errorf("failed to settle payment channel: %w", err)
- }
-
- t.SyncClient.Publish(ctx, SettleTopic, settleMsgCid)
- if err != nil {
- return fmt.Errorf("failed to publish settle message cid: %w", err)
- }
-
- return nil
-}
-
-func findReceiver(clients []*testkit.ClientAddressesMsg) *testkit.ClientAddressesMsg {
- for _, c := range clients {
- if getClientMode(c.GroupSeq) == ModeReceiver {
- return c
- }
- }
- return nil
-}
-
-func runReceiver(t *testkit.TestEnvironment, ctx context.Context, cl *testkit.LotusClient) error {
- // lanes to open; vouchers will be distributed across these lanes in round-robin fashion
- laneCount := t.IntParam("lane_count")
- // number of vouchers to send on each lane
- vouchersPerLane := t.IntParam("vouchers_per_lane")
- totalVouchers := laneCount * vouchersPerLane
-
- vouchers := make(chan *paych.SignedVoucher)
- vouchersSub, err := t.SyncClient.Subscribe(ctx, VoucherTopic, vouchers)
- if err != nil {
- return fmt.Errorf("failed to subscribe to voucher topic: %w", err)
- }
-
- settleMsgChan := make(chan cid.Cid)
- settleSub, err := t.SyncClient.Subscribe(ctx, SettleTopic, settleMsgChan)
- if err != nil {
- return fmt.Errorf("failed to subscribe to settle topic: %w", err)
- }
-
- // inform the clients that the receiver is ready for incoming vouchers
- t.SyncClient.MustSignalEntry(ctx, ReceiverReadyState)
-
- t.RecordMessage("adding %d payment vouchers", totalVouchers)
-
- // Add each of the vouchers
- var addedVouchers []*paych.SignedVoucher
- for i := 0; i < totalVouchers; i++ {
- v := <-vouchers
- addedVouchers = append(addedVouchers, v)
-
- _, err := cl.FullApi.PaychVoucherAdd(ctx, v.ChannelAddr, v, nil, big.NewInt(0))
- if err != nil {
- return fmt.Errorf("failed to add voucher: %w", err)
- }
- spendable, err := cl.FullApi.PaychVoucherCheckSpendable(ctx, v.ChannelAddr, v, nil, nil)
- if err != nil {
- return fmt.Errorf("failed to check voucher spendable: %w", err)
- }
- if !spendable {
- return fmt.Errorf("expected voucher %d to be spendable", i)
- }
-
- t.RecordMessage("payment voucher added; lane=%d, nonce=%d, amount=%d", v.Lane, v.Nonce, v.Amount)
- }
-
- vouchersSub.Done()
-
- t.RecordMessage("finished adding all payment vouchers")
-
- // Inform the clients that the receiver has added all vouchers
- t.SyncClient.MustSignalEntry(ctx, ReceiverAddedVouchersState)
-
- // Wait for the settle message (put on chain by the sender)
- t.RecordMessage("waiting for client to put settle message on chain")
- settleMsgCid := <-settleMsgChan
- settleSub.Done()
-
- time.Sleep(5 * time.Second)
-
- t.RecordMessage("waiting for confirmation of settle message on chain: %s", settleMsgCid)
- _, err = cl.FullApi.StateWaitMsg(ctx, settleMsgCid, 10, api.LookbackNoLimit, true)
- if err != nil {
- return fmt.Errorf("failed to wait for settle message: %w", err)
- }
-
- // Note: Once the receiver sees the settle message on chain, it will
- // automatically call submit voucher with the best vouchers
-
- // TODO: Uncomment this section once this PR is merged:
- // https://github.com/filecoin-project/lotus/pull/3197
- //t.RecordMessage("checking that all %d vouchers are no longer spendable", len(addedVouchers))
- //for i, v := range addedVouchers {
- // spendable, err := cl.FullApi.PaychVoucherCheckSpendable(ctx, v.ChannelAddr, v, nil, nil)
- // if err != nil {
- // return fmt.Errorf("failed to check voucher spendable: %w", err)
- // }
- // // Should no longer be spendable because the best voucher has been submitted
- // if spendable {
- // return fmt.Errorf("expected voucher %d to no longer be spendable", i)
- // }
- //}
-
- t.RecordMessage("all vouchers were submitted successfully")
-
- return nil
-}
diff --git a/testplans/lotus-soup/rfwp/chain_state.go b/testplans/lotus-soup/rfwp/chain_state.go
deleted file mode 100644
index 96ad91743..000000000
--- a/testplans/lotus-soup/rfwp/chain_state.go
+++ /dev/null
@@ -1,837 +0,0 @@
-package rfwp
-
-import (
- "bufio"
- "bytes"
- "context"
- "encoding/json"
- "fmt"
- "io"
- "math"
- corebig "math/big"
- "os"
- "sort"
- "text/tabwriter"
- "time"
-
- "github.com/filecoin-project/go-address"
- "github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/big"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/api/v0api"
- "github.com/filecoin-project/lotus/blockstore"
- "github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/actors/builtin"
- "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
- "github.com/filecoin-project/lotus/chain/store"
- "github.com/filecoin-project/lotus/chain/types"
- sealing "github.com/filecoin-project/lotus/storage/pipeline"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
- tsync "github.com/filecoin-project/lotus/tools/stats/sync"
-)
-
-func UpdateChainState(t *testkit.TestEnvironment, m *testkit.LotusMiner) error {
- height := 0
- headlag := 3
-
- ctx := context.Background()
-
- tipsetsCh, err := tsync.BufferedTipsetChannel(ctx, &v0api.WrapperV1Full{FullNode: m.FullApi}, abi.ChainEpoch(height), headlag)
- if err != nil {
- return err
- }
-
- jsonFilename := fmt.Sprintf("%s%cchain-state.ndjson", t.TestOutputsPath, os.PathSeparator)
- jsonFile, err := os.Create(jsonFilename)
- if err != nil {
- return err
- }
- defer jsonFile.Close()
- jsonEncoder := json.NewEncoder(jsonFile)
-
- for tipset := range tipsetsCh {
- maddrs, err := m.FullApi.StateListMiners(ctx, tipset.Key())
- if err != nil {
- return err
- }
-
- snapshot := ChainSnapshot{
- Height: tipset.Height(),
- MinerStates: make(map[string]*MinerStateSnapshot),
- }
-
- err = func() error {
- cs.Lock()
- defer cs.Unlock()
-
- for _, maddr := range maddrs {
- err := func() error {
- filename := fmt.Sprintf("%s%cstate-%s-%d", t.TestOutputsPath, os.PathSeparator, maddr, tipset.Height())
-
- f, err := os.Create(filename)
- if err != nil {
- return err
- }
- defer f.Close()
-
- w := bufio.NewWriter(f)
- defer w.Flush()
-
- minerInfo, err := info(t, m, maddr, w, tipset.Height())
- if err != nil {
- return err
- }
- writeText(w, minerInfo)
-
- if tipset.Height()%100 == 0 {
- printDiff(t, minerInfo, tipset.Height())
- }
-
- faultState, err := provingFaults(t, m, maddr, tipset.Height())
- if err != nil {
- return err
- }
- writeText(w, faultState)
-
- provState, err := provingInfo(t, m, maddr, tipset.Height())
- if err != nil {
- return err
- }
- writeText(w, provState)
-
- // record diff
- recordDiff(minerInfo, provState, tipset.Height())
-
- deadlines, err := provingDeadlines(t, m, maddr, tipset.Height())
- if err != nil {
- return err
- }
- writeText(w, deadlines)
-
- sectorInfo, err := sectorsList(t, m, maddr, w, tipset.Height())
- if err != nil {
- return err
- }
- writeText(w, sectorInfo)
-
- snapshot.MinerStates[maddr.String()] = &MinerStateSnapshot{
- Info: minerInfo,
- Faults: faultState,
- ProvingInfo: provState,
- Deadlines: deadlines,
- Sectors: sectorInfo,
- }
-
- return jsonEncoder.Encode(snapshot)
- }()
- if err != nil {
- return err
- }
- }
-
- cs.PrevHeight = tipset.Height()
-
- return nil
- }()
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
-type ChainSnapshot struct {
- Height abi.ChainEpoch
-
- MinerStates map[string]*MinerStateSnapshot
-}
-
-type MinerStateSnapshot struct {
- Info *MinerInfo
- Faults *ProvingFaultState
- ProvingInfo *ProvingInfoState
- Deadlines *ProvingDeadlines
- Sectors *SectorInfo
-}
-
-// writeText marshals m to text and writes to w, swallowing any errors along the way.
-func writeText(w io.Writer, m plainTextMarshaler) {
- b, err := m.MarshalPlainText()
- if err != nil {
- return
- }
- _, _ = w.Write(b)
-}
-
-// if we make our structs `encoding.TextMarshaler`s, they all get stringified when marshaling to JSON
-// instead of just using the default struct marshaler.
-// so here's encoding.TextMarshaler with a different name, so that doesn't happen.
-type plainTextMarshaler interface {
- MarshalPlainText() ([]byte, error)
-}
-
-type ProvingFaultState struct {
- // FaultedSectors is a slice per-deadline faulty sectors. If the miner
- // has no faulty sectors, this will be nil.
- FaultedSectors [][]uint64
-}
-
-func (s *ProvingFaultState) MarshalPlainText() ([]byte, error) {
- w := &bytes.Buffer{}
-
- if len(s.FaultedSectors) == 0 {
- fmt.Fprintf(w, "no faulty sectors\n")
- return w.Bytes(), nil
- }
-
- tw := tabwriter.NewWriter(w, 2, 4, 2, ' ', 0)
- _, _ = fmt.Fprintf(tw, "deadline\tsectors")
- for deadline, sectors := range s.FaultedSectors {
- for _, num := range sectors {
- _, _ = fmt.Fprintf(tw, "%d\t%d\n", deadline, num)
- }
- }
-
- return w.Bytes(), nil
-}
-
-func provingFaults(t *testkit.TestEnvironment, m *testkit.LotusMiner, maddr address.Address, height abi.ChainEpoch) (*ProvingFaultState, error) {
- api := m.FullApi
- ctx := context.Background()
-
- head, err := api.ChainHead(ctx)
- if err != nil {
- return nil, err
- }
- deadlines, err := api.StateMinerDeadlines(ctx, maddr, head.Key())
- if err != nil {
- return nil, err
- }
- faultedSectors := make([][]uint64, len(deadlines))
- hasFaults := false
- for dlIdx := range deadlines {
- partitions, err := api.StateMinerPartitions(ctx, maddr, uint64(dlIdx), types.EmptyTSK)
- if err != nil {
- return nil, err
- }
-
- for _, partition := range partitions {
- faulty, err := partition.FaultySectors.All(10000000)
- if err != nil {
- return nil, err
- }
-
- if len(faulty) > 0 {
- hasFaults = true
- }
-
- faultedSectors[dlIdx] = append(faultedSectors[dlIdx], faulty...)
- }
- }
- result := new(ProvingFaultState)
- if hasFaults {
- result.FaultedSectors = faultedSectors
- }
-
- return result, nil
-}
-
-type ProvingInfoState struct {
- CurrentEpoch abi.ChainEpoch
-
- ProvingPeriodStart abi.ChainEpoch
-
- Faults uint64
- ProvenSectors uint64
- FaultPercent float64
- Recoveries uint64
-
- DeadlineIndex uint64
- DeadlineSectors uint64
- DeadlineOpen abi.ChainEpoch
- DeadlineClose abi.ChainEpoch
- DeadlineChallenge abi.ChainEpoch
- DeadlineFaultCutoff abi.ChainEpoch
-
- WPoStProvingPeriod abi.ChainEpoch
-}
-
-func (s *ProvingInfoState) MarshalPlainText() ([]byte, error) {
- w := &bytes.Buffer{}
- fmt.Fprintf(w, "Current Epoch: %d\n", s.CurrentEpoch)
- fmt.Fprintf(w, "Chain Period: %d\n", s.CurrentEpoch/s.WPoStProvingPeriod)
- fmt.Fprintf(w, "Chain Period Start: %s\n", epochTime(s.CurrentEpoch, (s.CurrentEpoch/s.WPoStProvingPeriod)*s.WPoStProvingPeriod))
- fmt.Fprintf(w, "Chain Period End: %s\n\n", epochTime(s.CurrentEpoch, (s.CurrentEpoch/s.WPoStProvingPeriod+1)*s.WPoStProvingPeriod))
-
- fmt.Fprintf(w, "Proving Period Boundary: %d\n", s.ProvingPeriodStart%s.WPoStProvingPeriod)
- fmt.Fprintf(w, "Proving Period Start: %s\n", epochTime(s.CurrentEpoch, s.ProvingPeriodStart))
- fmt.Fprintf(w, "Next Period Start: %s\n\n", epochTime(s.CurrentEpoch, s.ProvingPeriodStart+s.WPoStProvingPeriod))
-
- fmt.Fprintf(w, "Faults: %d (%.2f%%)\n", s.Faults, s.FaultPercent)
- fmt.Fprintf(w, "Recovering: %d\n", s.Recoveries)
- //fmt.Fprintf(w, "New Sectors: %d\n\n", s.NewSectors)
-
- fmt.Fprintf(w, "Deadline Index: %d\n", s.DeadlineIndex)
- fmt.Fprintf(w, "Deadline Sectors: %d\n", s.DeadlineSectors)
-
- fmt.Fprintf(w, "Deadline Open: %s\n", epochTime(s.CurrentEpoch, s.DeadlineOpen))
- fmt.Fprintf(w, "Deadline Close: %s\n", epochTime(s.CurrentEpoch, s.DeadlineClose))
- fmt.Fprintf(w, "Deadline Challenge: %s\n", epochTime(s.CurrentEpoch, s.DeadlineChallenge))
- fmt.Fprintf(w, "Deadline FaultCutoff: %s\n", epochTime(s.CurrentEpoch, s.DeadlineFaultCutoff))
-
- return w.Bytes(), nil
-}
-
-func provingInfo(t *testkit.TestEnvironment, m *testkit.LotusMiner, maddr address.Address, height abi.ChainEpoch) (*ProvingInfoState, error) {
- lapi := m.FullApi
- ctx := context.Background()
-
- head, err := lapi.ChainHead(ctx)
- if err != nil {
- return nil, err
- }
-
- cd, err := lapi.StateMinerProvingDeadline(ctx, maddr, head.Key())
- if err != nil {
- return nil, err
- }
-
- deadlines, err := lapi.StateMinerDeadlines(ctx, maddr, head.Key())
- if err != nil {
- return nil, err
- }
-
- parts := map[uint64][]api.Partition{}
- for dlIdx := range deadlines {
- part, err := lapi.StateMinerPartitions(ctx, maddr, uint64(dlIdx), types.EmptyTSK)
- if err != nil {
- return nil, err
- }
-
- parts[uint64(dlIdx)] = part
- }
-
- proving := uint64(0)
- faults := uint64(0)
- recovering := uint64(0)
-
- for _, partitions := range parts {
- for _, partition := range partitions {
- sc, err := partition.LiveSectors.Count()
- if err != nil {
- return nil, err
- }
- proving += sc
-
- fc, err := partition.FaultySectors.Count()
- if err != nil {
- return nil, err
- }
- faults += fc
-
- rc, err := partition.RecoveringSectors.Count()
- if err != nil {
- return nil, err
- }
- recovering += rc
- }
- }
-
- var faultPerc float64
- if proving > 0 {
- faultPerc = float64(faults*10000/proving) / 100
- }
-
- s := ProvingInfoState{
- CurrentEpoch: cd.CurrentEpoch,
- ProvingPeriodStart: cd.PeriodStart,
- Faults: faults,
- ProvenSectors: proving,
- FaultPercent: faultPerc,
- Recoveries: recovering,
- DeadlineIndex: cd.Index,
- DeadlineOpen: cd.Open,
- DeadlineClose: cd.Close,
- DeadlineChallenge: cd.Challenge,
- DeadlineFaultCutoff: cd.FaultCutoff,
- WPoStProvingPeriod: cd.WPoStProvingPeriod,
- }
-
- if cd.Index < cd.WPoStPeriodDeadlines {
- for _, partition := range parts[cd.Index] {
- sc, err := partition.LiveSectors.Count()
- if err != nil {
- return nil, err
- }
- s.DeadlineSectors += sc
- }
- }
-
- return &s, nil
-}
-
-func epochTime(curr, e abi.ChainEpoch) string {
- switch {
- case curr > e:
- return fmt.Sprintf("%d (%s ago)", e, time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(curr-e)))
- case curr == e:
- return fmt.Sprintf("%d (now)", e)
- case curr < e:
- return fmt.Sprintf("%d (in %s)", e, time.Second*time.Duration(int64(build.BlockDelaySecs)*int64(e-curr)))
- }
-
- panic("math broke")
-}
-
-type ProvingDeadlines struct {
- Deadlines []DeadlineInfo
-}
-
-type DeadlineInfo struct {
- Sectors uint64
- Partitions int
- Proven uint64
- Current bool
-}
-
-func (d *ProvingDeadlines) MarshalPlainText() ([]byte, error) {
- w := new(bytes.Buffer)
- tw := tabwriter.NewWriter(w, 2, 4, 2, ' ', 0)
- _, _ = fmt.Fprintln(tw, "deadline\tsectors\tpartitions\tproven")
-
- for i, di := range d.Deadlines {
- var cur string
- if di.Current {
- cur += "\t(current)"
- }
- _, _ = fmt.Fprintf(tw, "%d\t%d\t%d\t%d%s\n", i, di.Sectors, di.Partitions, di.Proven, cur)
- }
- tw.Flush()
- return w.Bytes(), nil
-}
-
-func provingDeadlines(t *testkit.TestEnvironment, m *testkit.LotusMiner, maddr address.Address, height abi.ChainEpoch) (*ProvingDeadlines, error) {
- lapi := m.FullApi
- ctx := context.Background()
-
- deadlines, err := lapi.StateMinerDeadlines(ctx, maddr, types.EmptyTSK)
- if err != nil {
- return nil, err
- }
-
- di, err := lapi.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK)
- if err != nil {
- return nil, err
- }
-
- infos := make([]DeadlineInfo, 0, len(deadlines))
- for dlIdx, deadline := range deadlines {
- partitions, err := lapi.StateMinerPartitions(ctx, maddr, uint64(dlIdx), types.EmptyTSK)
- if err != nil {
- return nil, err
- }
-
- provenPartitions, err := deadline.PostSubmissions.Count()
- if err != nil {
- return nil, err
- }
-
- var cur string
- if di.Index == uint64(dlIdx) {
- cur += "\t(current)"
- }
-
- outInfo := DeadlineInfo{
- //Sectors: c,
- Partitions: len(partitions),
- Proven: provenPartitions,
- Current: di.Index == uint64(dlIdx),
- }
- infos = append(infos, outInfo)
- //_, _ = fmt.Fprintf(tw, "%d\t%d\t%d%s\n", dlIdx, len(partitions), provenPartitions, cur)
- }
-
- return &ProvingDeadlines{Deadlines: infos}, nil
-}
-
-type SectorInfo struct {
- Sectors []abi.SectorNumber
- SectorStates map[abi.SectorNumber]api.SectorInfo
- Committed []abi.SectorNumber
- Proving []abi.SectorNumber
-}
-
-func (i *SectorInfo) MarshalPlainText() ([]byte, error) {
- provingIDs := make(map[abi.SectorNumber]struct{}, len(i.Proving))
- for _, id := range i.Proving {
- provingIDs[id] = struct{}{}
- }
- commitedIDs := make(map[abi.SectorNumber]struct{}, len(i.Committed))
- for _, id := range i.Committed {
- commitedIDs[id] = struct{}{}
- }
-
- w := new(bytes.Buffer)
- tw := tabwriter.NewWriter(w, 8, 4, 1, ' ', 0)
-
- for _, s := range i.Sectors {
- _, inSSet := commitedIDs[s]
- _, inPSet := provingIDs[s]
-
- st, ok := i.SectorStates[s]
- if !ok {
- continue
- }
-
- fmt.Fprintf(tw, "%d: %s\tsSet: %s\tpSet: %s\ttktH: %d\tseedH: %d\tdeals: %v\n",
- s,
- st.State,
- yesno(inSSet),
- yesno(inPSet),
- st.Ticket.Epoch,
- st.Seed.Epoch,
- st.Deals,
- )
- }
-
- if err := tw.Flush(); err != nil {
- return nil, err
- }
- return w.Bytes(), nil
-}
-
-func sectorsList(t *testkit.TestEnvironment, m *testkit.LotusMiner, maddr address.Address, w io.Writer, height abi.ChainEpoch) (*SectorInfo, error) {
- node := m.FullApi
- ctx := context.Background()
-
- list, err := m.MinerApi.SectorsList(ctx)
- if err != nil {
- return nil, err
- }
-
- activeSet, err := node.StateMinerActiveSectors(ctx, maddr, types.EmptyTSK)
- if err != nil {
- return nil, err
- }
- activeIDs := make(map[abi.SectorNumber]struct{}, len(activeSet))
- for _, info := range activeSet {
- activeIDs[info.SectorNumber] = struct{}{}
- }
-
- sset, err := node.StateMinerSectors(ctx, maddr, nil, types.EmptyTSK)
- if err != nil {
- return nil, err
- }
- commitedIDs := make(map[abi.SectorNumber]struct{}, len(activeSet))
- for _, info := range sset {
- commitedIDs[info.SectorNumber] = struct{}{}
- }
-
- sort.Slice(list, func(i, j int) bool {
- return list[i] < list[j]
- })
-
- i := SectorInfo{Sectors: list, SectorStates: make(map[abi.SectorNumber]api.SectorInfo, len(list))}
-
- for _, s := range list {
- st, err := m.MinerApi.SectorsStatus(ctx, s, true)
- if err != nil {
- fmt.Fprintf(w, "%d:\tError: %s\n", s, err)
- continue
- }
- i.SectorStates[s] = st
- }
- return &i, nil
-}
-
-func yesno(b bool) string {
- if b {
- return "YES"
- }
- return "NO"
-}
-
-type MinerInfo struct {
- MinerAddr address.Address
- SectorSize string
-
- MinerPower *api.MinerPower
-
- CommittedBytes big.Int
- ProvingBytes big.Int
- FaultyBytes big.Int
- FaultyPercentage float64
-
- Balance big.Int
- PreCommitDeposits big.Int
- LockedFunds big.Int
- AvailableFunds big.Int
- WorkerBalance big.Int
- MarketEscrow big.Int
- MarketLocked big.Int
-
- SectorStateCounts map[sealing.SectorState]int
-}
-
-func (i *MinerInfo) MarshalPlainText() ([]byte, error) {
- w := new(bytes.Buffer)
- fmt.Fprintf(w, "Miner: %s\n", i.MinerAddr)
- fmt.Fprintf(w, "Sector Size: %s\n", i.SectorSize)
-
- pow := i.MinerPower
-
- fmt.Fprintf(w, "Byte Power: %s / %s (%0.4f%%)\n",
- types.SizeStr(pow.MinerPower.RawBytePower),
- types.SizeStr(pow.TotalPower.RawBytePower),
- types.BigDivFloat(
- types.BigMul(pow.MinerPower.RawBytePower, big.NewInt(100)),
- pow.TotalPower.RawBytePower,
- ),
- )
-
- fmt.Fprintf(w, "Actual Power: %s / %s (%0.4f%%)\n",
- types.DeciStr(pow.MinerPower.QualityAdjPower),
- types.DeciStr(pow.TotalPower.QualityAdjPower),
- types.BigDivFloat(
- types.BigMul(pow.MinerPower.QualityAdjPower, big.NewInt(100)),
- pow.TotalPower.QualityAdjPower,
- ),
- )
-
- fmt.Fprintf(w, "\tCommitted: %s\n", types.SizeStr(i.CommittedBytes))
-
- if i.FaultyBytes.Int == nil || i.FaultyBytes.IsZero() {
- fmt.Fprintf(w, "\tProving: %s\n", types.SizeStr(i.ProvingBytes))
- } else {
- fmt.Fprintf(w, "\tProving: %s (%s Faulty, %.2f%%)\n",
- types.SizeStr(i.ProvingBytes),
- types.SizeStr(i.FaultyBytes),
- i.FaultyPercentage)
- }
-
- if !i.MinerPower.HasMinPower {
- fmt.Fprintf(w, "Below minimum power threshold, no blocks will be won\n")
- } else {
-
- winRatio := new(corebig.Rat).SetFrac(
- types.BigMul(pow.MinerPower.QualityAdjPower, types.NewInt(build.BlocksPerEpoch)).Int,
- pow.TotalPower.QualityAdjPower.Int,
- )
-
- if winRatioFloat, _ := winRatio.Float64(); winRatioFloat > 0 {
-
- // if the corresponding poisson distribution isn't infinitely small then
- // throw it into the mix as well, accounting for multi-wins
- winRationWithPoissonFloat := -math.Expm1(-winRatioFloat)
- winRationWithPoisson := new(corebig.Rat).SetFloat64(winRationWithPoissonFloat)
- if winRationWithPoisson != nil {
- winRatio = winRationWithPoisson
- winRatioFloat = winRationWithPoissonFloat
- }
-
- weekly, _ := new(corebig.Rat).Mul(
- winRatio,
- new(corebig.Rat).SetInt64(7*builtin.EpochsInDay),
- ).Float64()
-
- avgDuration, _ := new(corebig.Rat).Mul(
- new(corebig.Rat).SetInt64(builtin.EpochDurationSeconds),
- new(corebig.Rat).Inv(winRatio),
- ).Float64()
-
- fmt.Fprintf(w, "Projected average block win rate: %.02f/week (every %s)\n",
- weekly,
- (time.Second * time.Duration(avgDuration)).Truncate(time.Second).String(),
- )
-
- // Geometric distribution of P(Y < k) calculated as described in https://en.wikipedia.org/wiki/Geometric_distribution#Probability_Outcomes_Examples
- // https://www.wolframalpha.com/input/?i=t+%3E+0%3B+p+%3E+0%3B+p+%3C+1%3B+c+%3E+0%3B+c+%3C1%3B+1-%281-p%29%5E%28t%29%3Dc%3B+solve+t
- // t == how many dice-rolls (epochs) before win
- // p == winRate == ( minerPower / netPower )
- // c == target probability of win ( 99.9% in this case )
- fmt.Fprintf(w, "Projected block win with 99.9%% probability every %s\n",
- (time.Second * time.Duration(
- builtin.EpochDurationSeconds*math.Log(1-0.999)/
- math.Log(1-winRatioFloat),
- )).Truncate(time.Second).String(),
- )
- fmt.Fprintln(w, "(projections DO NOT account for future network and miner growth)")
- }
- }
-
- fmt.Fprintf(w, "Miner Balance: %s\n", types.FIL(i.Balance))
- fmt.Fprintf(w, "\tPreCommit: %s\n", types.FIL(i.PreCommitDeposits))
- fmt.Fprintf(w, "\tLocked: %s\n", types.FIL(i.LockedFunds))
- fmt.Fprintf(w, "\tAvailable: %s\n", types.FIL(i.AvailableFunds))
- fmt.Fprintf(w, "Worker Balance: %s\n", types.FIL(i.WorkerBalance))
- fmt.Fprintf(w, "Market (Escrow): %s\n", types.FIL(i.MarketEscrow))
- fmt.Fprintf(w, "Market (Locked): %s\n\n", types.FIL(i.MarketLocked))
-
- buckets := i.SectorStateCounts
-
- var sorted []stateMeta
- for state, i := range buckets {
- sorted = append(sorted, stateMeta{i: i, state: state})
- }
-
- sort.Slice(sorted, func(i, j int) bool {
- return stateOrder[sorted[i].state].i < stateOrder[sorted[j].state].i
- })
-
- for _, s := range sorted {
- _, _ = fmt.Fprintf(w, "\t%s: %d\n", s.state, s.i)
- }
-
- return w.Bytes(), nil
-}
-
-func info(t *testkit.TestEnvironment, m *testkit.LotusMiner, maddr address.Address, w io.Writer, height abi.ChainEpoch) (*MinerInfo, error) {
- api := m.FullApi
- ctx := context.Background()
-
- ts, err := api.ChainHead(ctx)
- if err != nil {
- return nil, err
- }
-
- mact, err := api.StateGetActor(ctx, maddr, ts.Key())
- if err != nil {
- return nil, err
- }
-
- i := MinerInfo{MinerAddr: maddr}
-
- // Sector size
- mi, err := api.StateMinerInfo(ctx, maddr, ts.Key())
- if err != nil {
- return nil, err
- }
-
- i.SectorSize = types.SizeStr(types.NewInt(uint64(mi.SectorSize)))
-
- i.MinerPower, err = api.StateMinerPower(ctx, maddr, ts.Key())
- if err != nil {
- return nil, err
- }
-
- secCounts, err := api.StateMinerSectorCount(ctx, maddr, ts.Key())
- if err != nil {
- return nil, err
- }
- faults, err := api.StateMinerFaults(ctx, maddr, ts.Key())
- if err != nil {
- return nil, err
- }
-
- nfaults, err := faults.Count()
- if err != nil {
- return nil, err
- }
-
- i.CommittedBytes = types.BigMul(types.NewInt(secCounts.Live), types.NewInt(uint64(mi.SectorSize)))
- i.ProvingBytes = types.BigMul(types.NewInt(secCounts.Active), types.NewInt(uint64(mi.SectorSize)))
-
- if nfaults != 0 {
- if secCounts.Live != 0 {
- i.FaultyPercentage = float64(10000*nfaults/secCounts.Live) / 100.
- }
- i.FaultyBytes = types.BigMul(types.NewInt(nfaults), types.NewInt(uint64(mi.SectorSize)))
- }
-
- stor := store.ActorStore(ctx, blockstore.NewAPIBlockstore(api))
- mas, err := miner.Load(stor, mact)
- if err != nil {
- return nil, err
- }
-
- funds, err := mas.LockedFunds()
- if err != nil {
- return nil, err
- }
-
- i.Balance = mact.Balance
- i.PreCommitDeposits = funds.PreCommitDeposits
- i.LockedFunds = funds.VestingFunds
- i.AvailableFunds, err = mas.AvailableBalance(mact.Balance)
- if err != nil {
- return nil, err
- }
-
- wb, err := api.WalletBalance(ctx, mi.Worker)
- if err != nil {
- return nil, err
- }
- i.WorkerBalance = wb
-
- mb, err := api.StateMarketBalance(ctx, maddr, types.EmptyTSK)
- if err != nil {
- return nil, err
- }
- i.MarketEscrow = mb.Escrow
- i.MarketLocked = mb.Locked
-
- sectors, err := m.MinerApi.SectorsList(ctx)
- if err != nil {
- return nil, err
- }
-
- buckets := map[sealing.SectorState]int{
- "Total": len(sectors),
- }
- for _, s := range sectors {
- st, err := m.MinerApi.SectorsStatus(ctx, s, true)
- if err != nil {
- return nil, err
- }
-
- buckets[sealing.SectorState(st.State)]++
- }
- i.SectorStateCounts = buckets
-
- return &i, nil
-}
-
-type stateMeta struct {
- i int
- state sealing.SectorState
-}
-
-var stateOrder = map[sealing.SectorState]stateMeta{}
-var stateList = []stateMeta{
- {state: "Total"},
- {state: sealing.Proving},
-
- {state: sealing.UndefinedSectorState},
- {state: sealing.Empty},
- {state: sealing.Packing},
- {state: sealing.PreCommit1},
- {state: sealing.PreCommit2},
- {state: sealing.PreCommitting},
- {state: sealing.PreCommitWait},
- {state: sealing.WaitSeed},
- {state: sealing.Committing},
- {state: sealing.CommitWait},
- {state: sealing.FinalizeSector},
-
- {state: sealing.FailedUnrecoverable},
- {state: sealing.SealPreCommit1Failed},
- {state: sealing.SealPreCommit2Failed},
- {state: sealing.PreCommitFailed},
- {state: sealing.ComputeProofFailed},
- {state: sealing.CommitFailed},
- {state: sealing.PackingFailed},
- {state: sealing.FinalizeFailed},
- {state: sealing.Faulty},
- {state: sealing.FaultReported},
- {state: sealing.FaultedFinal},
-}
-
-func init() {
- for i, state := range stateList {
- stateOrder[state.state] = stateMeta{
- i: i,
- }
- }
-}
diff --git a/testplans/lotus-soup/rfwp/diffs.go b/testplans/lotus-soup/rfwp/diffs.go
deleted file mode 100644
index fed1148e8..000000000
--- a/testplans/lotus-soup/rfwp/diffs.go
+++ /dev/null
@@ -1,296 +0,0 @@
-package rfwp
-
-import (
- "bufio"
- "fmt"
- "os"
- "sort"
- "sync"
-
- "github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/big"
-
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
-)
-
-type ChainState struct {
- sync.Mutex
-
- PrevHeight abi.ChainEpoch
- DiffHeight map[string]map[string]map[abi.ChainEpoch]big.Int // height -> value
- DiffValue map[string]map[string]map[string][]abi.ChainEpoch // value -> []height
- DiffCmp map[string]map[string]map[string][]abi.ChainEpoch // difference (height, height-1) -> []height
- valueTypes []string
-}
-
-func NewChainState() *ChainState {
- cs := &ChainState{}
- cs.PrevHeight = abi.ChainEpoch(-1)
- cs.DiffHeight = make(map[string]map[string]map[abi.ChainEpoch]big.Int) // height -> value
- cs.DiffValue = make(map[string]map[string]map[string][]abi.ChainEpoch) // value -> []height
- cs.DiffCmp = make(map[string]map[string]map[string][]abi.ChainEpoch) // difference (height, height-1) -> []height
- cs.valueTypes = []string{"MinerPower", "CommittedBytes", "ProvingBytes", "Balance", "PreCommitDeposits", "LockedFunds", "AvailableFunds", "WorkerBalance", "MarketEscrow", "MarketLocked", "Faults", "ProvenSectors", "Recoveries"}
- return cs
-}
-
-var (
- cs *ChainState
-)
-
-func init() {
- cs = NewChainState()
-}
-
-func printDiff(t *testkit.TestEnvironment, mi *MinerInfo, height abi.ChainEpoch) {
- maddr := mi.MinerAddr.String()
- filename := fmt.Sprintf("%s%cdiff-%s-%d", t.TestOutputsPath, os.PathSeparator, maddr, height)
-
- f, err := os.Create(filename)
- if err != nil {
- panic(err)
- }
- defer f.Close()
-
- w := bufio.NewWriter(f)
- defer w.Flush()
-
- keys := make([]string, 0, len(cs.DiffCmp[maddr]))
- for k := range cs.DiffCmp[maddr] {
- keys = append(keys, k)
- }
- sort.Strings(keys)
-
- fmt.Fprintln(w, "=====", maddr, "=====")
- for i, valueName := range keys {
- fmt.Fprintln(w, toCharStr(i), "=====", valueName, "=====")
- if len(cs.DiffCmp[maddr][valueName]) > 0 {
- fmt.Fprintf(w, "%s diff of |\n", toCharStr(i))
- }
-
- for difference, heights := range cs.DiffCmp[maddr][valueName] {
- fmt.Fprintf(w, "%s diff of %30v at heights %v\n", toCharStr(i), difference, heights)
- }
- }
-}
-
-func recordDiff(mi *MinerInfo, ps *ProvingInfoState, height abi.ChainEpoch) {
- maddr := mi.MinerAddr.String()
- if _, ok := cs.DiffHeight[maddr]; !ok {
- cs.DiffHeight[maddr] = make(map[string]map[abi.ChainEpoch]big.Int)
- cs.DiffValue[maddr] = make(map[string]map[string][]abi.ChainEpoch)
- cs.DiffCmp[maddr] = make(map[string]map[string][]abi.ChainEpoch)
-
- for _, v := range cs.valueTypes {
- cs.DiffHeight[maddr][v] = make(map[abi.ChainEpoch]big.Int)
- cs.DiffValue[maddr][v] = make(map[string][]abi.ChainEpoch)
- cs.DiffCmp[maddr][v] = make(map[string][]abi.ChainEpoch)
- }
- }
-
- {
- value := big.Int(mi.MinerPower.MinerPower.RawBytePower)
- cs.DiffHeight[maddr]["MinerPower"][height] = value
- cs.DiffValue[maddr]["MinerPower"][value.String()] = append(cs.DiffValue[maddr]["MinerPower"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["MinerPower"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["MinerPower"][cmp.String()] = append(cs.DiffCmp[maddr]["MinerPower"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.CommittedBytes)
- cs.DiffHeight[maddr]["CommittedBytes"][height] = value
- cs.DiffValue[maddr]["CommittedBytes"][value.String()] = append(cs.DiffValue[maddr]["CommittedBytes"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["CommittedBytes"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["CommittedBytes"][cmp.String()] = append(cs.DiffCmp[maddr]["CommittedBytes"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.ProvingBytes)
- cs.DiffHeight[maddr]["ProvingBytes"][height] = value
- cs.DiffValue[maddr]["ProvingBytes"][value.String()] = append(cs.DiffValue[maddr]["ProvingBytes"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["ProvingBytes"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["ProvingBytes"][cmp.String()] = append(cs.DiffCmp[maddr]["ProvingBytes"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.Balance)
- roundBalance(&value)
- cs.DiffHeight[maddr]["Balance"][height] = value
- cs.DiffValue[maddr]["Balance"][value.String()] = append(cs.DiffValue[maddr]["Balance"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["Balance"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["Balance"][cmp.String()] = append(cs.DiffCmp[maddr]["Balance"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.PreCommitDeposits)
- cs.DiffHeight[maddr]["PreCommitDeposits"][height] = value
- cs.DiffValue[maddr]["PreCommitDeposits"][value.String()] = append(cs.DiffValue[maddr]["PreCommitDeposits"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["PreCommitDeposits"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["PreCommitDeposits"][cmp.String()] = append(cs.DiffCmp[maddr]["PreCommitDeposits"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.LockedFunds)
- roundBalance(&value)
- cs.DiffHeight[maddr]["LockedFunds"][height] = value
- cs.DiffValue[maddr]["LockedFunds"][value.String()] = append(cs.DiffValue[maddr]["LockedFunds"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["LockedFunds"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["LockedFunds"][cmp.String()] = append(cs.DiffCmp[maddr]["LockedFunds"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.AvailableFunds)
- roundBalance(&value)
- cs.DiffHeight[maddr]["AvailableFunds"][height] = value
- cs.DiffValue[maddr]["AvailableFunds"][value.String()] = append(cs.DiffValue[maddr]["AvailableFunds"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["AvailableFunds"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["AvailableFunds"][cmp.String()] = append(cs.DiffCmp[maddr]["AvailableFunds"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.WorkerBalance)
- cs.DiffHeight[maddr]["WorkerBalance"][height] = value
- cs.DiffValue[maddr]["WorkerBalance"][value.String()] = append(cs.DiffValue[maddr]["WorkerBalance"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["WorkerBalance"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["WorkerBalance"][cmp.String()] = append(cs.DiffCmp[maddr]["WorkerBalance"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.MarketEscrow)
- cs.DiffHeight[maddr]["MarketEscrow"][height] = value
- cs.DiffValue[maddr]["MarketEscrow"][value.String()] = append(cs.DiffValue[maddr]["MarketEscrow"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["MarketEscrow"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["MarketEscrow"][cmp.String()] = append(cs.DiffCmp[maddr]["MarketEscrow"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.Int(mi.MarketLocked)
- cs.DiffHeight[maddr]["MarketLocked"][height] = value
- cs.DiffValue[maddr]["MarketLocked"][value.String()] = append(cs.DiffValue[maddr]["MarketLocked"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["MarketLocked"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["MarketLocked"][cmp.String()] = append(cs.DiffCmp[maddr]["MarketLocked"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.NewInt(int64(ps.Faults))
- cs.DiffHeight[maddr]["Faults"][height] = value
- cs.DiffValue[maddr]["Faults"][value.String()] = append(cs.DiffValue[maddr]["Faults"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["Faults"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["Faults"][cmp.String()] = append(cs.DiffCmp[maddr]["Faults"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.NewInt(int64(ps.ProvenSectors))
- cs.DiffHeight[maddr]["ProvenSectors"][height] = value
- cs.DiffValue[maddr]["ProvenSectors"][value.String()] = append(cs.DiffValue[maddr]["ProvenSectors"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["ProvenSectors"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["ProvenSectors"][cmp.String()] = append(cs.DiffCmp[maddr]["ProvenSectors"][cmp.String()], height)
- }
- }
- }
-
- {
- value := big.NewInt(int64(ps.Recoveries))
- cs.DiffHeight[maddr]["Recoveries"][height] = value
- cs.DiffValue[maddr]["Recoveries"][value.String()] = append(cs.DiffValue[maddr]["Recoveries"][value.String()], height)
-
- if cs.PrevHeight != -1 {
- prevValue := cs.DiffHeight[maddr]["Recoveries"][cs.PrevHeight]
- cmp := big.Zero()
- cmp.Sub(value.Int, prevValue.Int) // value - prevValue
- if big.Cmp(cmp, big.Zero()) != 0 {
- cs.DiffCmp[maddr]["Recoveries"][cmp.String()] = append(cs.DiffCmp[maddr]["Recoveries"][cmp.String()], height)
- }
- }
- }
-}
-
-func roundBalance(i *big.Int) {
- *i = big.Div(*i, big.NewInt(1000000000000000))
- *i = big.Mul(*i, big.NewInt(1000000000000000))
-}
-
-func toCharStr(i int) string {
- return string('a' + i)
-}
diff --git a/testplans/lotus-soup/rfwp/e2e.go b/testplans/lotus-soup/rfwp/e2e.go
deleted file mode 100644
index 29832c4f8..000000000
--- a/testplans/lotus-soup/rfwp/e2e.go
+++ /dev/null
@@ -1,349 +0,0 @@
-package rfwp
-
-import (
- "context"
- "errors"
- "fmt"
- "io/ioutil"
- "math/rand"
- "os"
- "sort"
- "strings"
- "time"
-
- "golang.org/x/sync/errgroup"
-
- "github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-state-types/big"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
-)
-
-func RecoveryFromFailedWindowedPoStE2E(t *testkit.TestEnvironment) error {
- switch t.Role {
- case "bootstrapper":
- return testkit.HandleDefaultRole(t)
- case "client":
- return handleClient(t)
- case "miner":
- return handleMiner(t)
- case "miner-full-slash":
- return handleMinerFullSlash(t)
- case "miner-partial-slash":
- return handleMinerPartialSlash(t)
- }
-
- return fmt.Errorf("unknown role: %s", t.Role)
-}
-
-func handleMiner(t *testkit.TestEnvironment) error {
- m, err := testkit.PrepareMiner(t)
- if err != nil {
- return err
- }
-
- ctx := context.Background()
- myActorAddr, err := m.MinerApi.ActorAddress(ctx)
- if err != nil {
- return err
- }
-
- t.RecordMessage("running miner: %s", myActorAddr)
-
- if t.GroupSeq == 1 {
- go FetchChainState(t, m)
- }
-
- go UpdateChainState(t, m)
-
- minersToBeSlashed := 2
- ch := make(chan testkit.SlashedMinerMsg)
- sub := t.SyncClient.MustSubscribe(ctx, testkit.SlashedMinerTopic, ch)
- var eg errgroup.Group
-
- for i := 0; i < minersToBeSlashed; i++ {
- select {
- case slashedMiner := <-ch:
- // wait for slash
- eg.Go(func() error {
- select {
- case <-waitForSlash(t, slashedMiner):
- case err = <-t.SyncClient.MustBarrier(ctx, testkit.StateAbortTest, 1).C:
- if err != nil {
- return err
- }
- return errors.New("got abort signal, exitting")
- }
- return nil
- })
- case err := <-sub.Done():
- return fmt.Errorf("got error while waiting for slashed miners: %w", err)
- case err := <-t.SyncClient.MustBarrier(ctx, testkit.StateAbortTest, 1).C:
- if err != nil {
- return err
- }
- return errors.New("got abort signal, exitting")
- }
- }
-
- errc := make(chan error)
- go func() {
- errc <- eg.Wait()
- }()
-
- select {
- case err := <-errc:
- if err != nil {
- return err
- }
- case err := <-t.SyncClient.MustBarrier(ctx, testkit.StateAbortTest, 1).C:
- if err != nil {
- return err
- }
- return errors.New("got abort signal, exitting")
- }
-
- t.SyncClient.MustSignalAndWait(ctx, testkit.StateDone, t.TestInstanceCount)
- return nil
-}
-
-func waitForSlash(t *testkit.TestEnvironment, msg testkit.SlashedMinerMsg) chan error {
- // assert that balance got reduced with that much 5 times (sector fee)
- // assert that balance got reduced with that much 2 times (termination fee)
- // assert that balance got increased with that much 10 times (block reward)
- // assert that power got increased with that much 1 times (after sector is sealed)
- // assert that power got reduced with that much 1 times (after sector is announced faulty)
- slashedMiner := msg.MinerActorAddr
-
- errc := make(chan error)
- go func() {
- foundSlashConditions := false
- for range time.Tick(10 * time.Second) {
- if foundSlashConditions {
- close(errc)
- return
- }
- t.RecordMessage("wait for slashing, tick")
- func() {
- cs.Lock()
- defer cs.Unlock()
-
- negativeAmounts := []big.Int{}
- negativeDiffs := make(map[big.Int][]abi.ChainEpoch)
-
- for am, heights := range cs.DiffCmp[slashedMiner.String()]["LockedFunds"] {
- amount, err := big.FromString(am)
- if err != nil {
- errc <- fmt.Errorf("cannot parse LockedFunds amount: %w:", err)
- return
- }
-
- // amount is negative => slash condition
- if big.Cmp(amount, big.Zero()) < 0 {
- negativeDiffs[amount] = heights
- negativeAmounts = append(negativeAmounts, amount)
- }
- }
-
- t.RecordMessage("negative diffs: %d", len(negativeDiffs))
- if len(negativeDiffs) < 3 {
- return
- }
-
- sort.Slice(negativeAmounts, func(i, j int) bool { return big.Cmp(negativeAmounts[i], negativeAmounts[j]) > 0 })
-
- // TODO: confirm the largest is > 18 filecoin
- // TODO: confirm the next largest is > 9 filecoin
- foundSlashConditions = true
- }()
- }
- }()
-
- return errc
-}
-
-func handleMinerFullSlash(t *testkit.TestEnvironment) error {
- m, err := testkit.PrepareMiner(t)
- if err != nil {
- return err
- }
-
- ctx := context.Background()
- myActorAddr, err := m.MinerApi.ActorAddress(ctx)
- if err != nil {
- return err
- }
-
- t.RecordMessage("running miner, full slash: %s", myActorAddr)
-
- // TODO: wait until we have sealed a deal for a client
- time.Sleep(240 * time.Second)
-
- t.RecordMessage("shutting down miner, full slash: %s", myActorAddr)
-
- ctxt, cancel := context.WithTimeout(ctx, 10*time.Second)
- defer cancel()
- err = m.StopFn(ctxt)
- if err != nil {
- //return err
- t.RecordMessage("err from StopFn: %s", err.Error()) // TODO: expect this to be fixed on Lotus
- }
-
- t.RecordMessage("shutdown miner, full slash: %s", myActorAddr)
-
- t.SyncClient.MustPublish(ctx, testkit.SlashedMinerTopic, testkit.SlashedMinerMsg{
- MinerActorAddr: myActorAddr,
- })
-
- t.SyncClient.MustSignalAndWait(ctx, testkit.StateDone, t.TestInstanceCount)
- return nil
-}
-
-func handleMinerPartialSlash(t *testkit.TestEnvironment) error {
- m, err := testkit.PrepareMiner(t)
- if err != nil {
- return err
- }
-
- ctx := context.Background()
- myActorAddr, err := m.MinerApi.ActorAddress(ctx)
- if err != nil {
- return err
- }
-
- t.RecordMessage("running miner, partial slash: %s", myActorAddr)
-
- // TODO: wait until we have sealed a deal for a client
- time.Sleep(185 * time.Second)
-
- t.RecordMessage("shutting down miner, partial slash: %s", myActorAddr)
-
- ctxt, cancel := context.WithTimeout(ctx, 10*time.Second)
- defer cancel()
- err = m.StopFn(ctxt)
- if err != nil {
- //return err
- t.RecordMessage("err from StopFn: %s", err.Error()) // TODO: expect this to be fixed on Lotus
- }
-
- t.RecordMessage("shutdown miner, partial slash: %s", myActorAddr)
-
- t.SyncClient.MustPublish(ctx, testkit.SlashedMinerTopic, testkit.SlashedMinerMsg{
- MinerActorAddr: myActorAddr,
- })
-
- time.Sleep(300 * time.Second)
-
- rm, err := testkit.RestoreMiner(t, m)
- if err != nil {
- t.RecordMessage("got err: %s", err.Error())
- return err
- }
-
- myActorAddr, err = rm.MinerApi.ActorAddress(ctx)
- if err != nil {
- t.RecordMessage("got err: %s", err.Error())
- return err
- }
-
- t.RecordMessage("running miner again, partial slash: %s", myActorAddr)
-
- time.Sleep(3600 * time.Second)
-
- //t.SyncClient.MustSignalAndWait(ctx, testkit.StateDone, t.TestInstanceCount)
- return nil
-}
-
-func handleClient(t *testkit.TestEnvironment) error {
- cl, err := testkit.PrepareClient(t)
- if err != nil {
- return err
- }
-
- // This is a client role
- t.RecordMessage("running client")
-
- ctx := context.Background()
- client := cl.FullApi
-
- time.Sleep(10 * time.Second)
-
- // select a miner based on our GroupSeq (client 1 -> miner 1 ; client 2 -> miner 2)
- // this assumes that all miner instances receive the same sorted MinerAddrs slice
- minerAddr := cl.MinerAddrs[t.InitContext.GroupSeq-1]
- if err := client.NetConnect(ctx, minerAddr.MinerNetAddrs); err != nil {
- return err
- }
- t.D().Counter(fmt.Sprintf("send-data-to,miner=%s", minerAddr.MinerActorAddr)).Inc(1)
-
- t.RecordMessage("selected %s as the miner", minerAddr.MinerActorAddr)
-
- time.Sleep(2 * time.Second)
-
- // generate 1800 bytes of random data
- data := make([]byte, 1800)
- rand.New(rand.NewSource(time.Now().UnixNano())).Read(data)
-
- file, err := ioutil.TempFile("/tmp", "data")
- if err != nil {
- return err
- }
- defer os.Remove(file.Name())
-
- _, err = file.Write(data)
- if err != nil {
- return err
- }
-
- fcid, err := client.ClientImport(ctx, api.FileRef{Path: file.Name(), IsCAR: false})
- if err != nil {
- return err
- }
- t.RecordMessage("file cid: %s", fcid)
-
- // start deal
- t1 := time.Now()
- fastRetrieval := false
- deal := testkit.StartDeal(ctx, minerAddr.MinerActorAddr, client, fcid.Root, fastRetrieval)
- t.RecordMessage("started deal: %s", deal)
-
- // this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this
- time.Sleep(2 * time.Second)
-
- t.RecordMessage("waiting for deal to be sealed")
- testkit.WaitDealSealed(t, ctx, client, deal)
- t.D().ResettingHistogram("deal.sealed").Update(int64(time.Since(t1)))
-
- // TODO: wait to stop miner (ideally get a signal, rather than sleep)
- time.Sleep(180 * time.Second)
-
- t.RecordMessage("trying to retrieve %s", fcid)
- info, err := client.ClientGetDealInfo(ctx, *deal)
- if err != nil {
- return err
- }
-
- carExport := true
- err = testkit.RetrieveData(t, ctx, client, fcid.Root, &info.PieceCID, carExport, data)
- if err != nil && strings.Contains(err.Error(), "cannot make retrieval deal for zero bytes") {
- t.D().Counter("deal.expect-slashing").Inc(1)
- } else if err != nil {
- // unknown error => fail test
- t.RecordFailure(err)
-
- // send signal to abort test
- t.SyncClient.MustSignalEntry(ctx, testkit.StateAbortTest)
-
- t.D().ResettingHistogram("deal.retrieved.err").Update(int64(time.Since(t1)))
- time.Sleep(10 * time.Second) // wait for metrics to be emitted
-
- return nil
- }
-
- t.D().ResettingHistogram("deal.retrieved").Update(int64(time.Since(t1)))
- time.Sleep(10 * time.Second) // wait for metrics to be emitted
-
- t.SyncClient.MustSignalAndWait(ctx, testkit.StateDone, t.TestInstanceCount) // TODO: not sure about this
- return nil
-}
diff --git a/testplans/lotus-soup/rfwp/html_chain_state.go b/testplans/lotus-soup/rfwp/html_chain_state.go
deleted file mode 100644
index 9dbd271a3..000000000
--- a/testplans/lotus-soup/rfwp/html_chain_state.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package rfwp
-
-import (
- "context"
- "fmt"
- "os"
-
- "github.com/ipfs/go-cid"
-
- "github.com/filecoin-project/go-address"
- "github.com/filecoin-project/go-state-types/abi"
-
- "github.com/filecoin-project/lotus/api/v0api"
- "github.com/filecoin-project/lotus/cli"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/testkit"
- tsync "github.com/filecoin-project/lotus/tools/stats/sync"
-)
-
-func FetchChainState(t *testkit.TestEnvironment, m *testkit.LotusMiner) error {
- height := 0
- headlag := 3
-
- ctx := context.Background()
- api := m.FullApi
-
- tipsetsCh, err := tsync.BufferedTipsetChannel(ctx, &v0api.WrapperV1Full{FullNode: m.FullApi}, abi.ChainEpoch(height), headlag)
- if err != nil {
-
- return err
- }
-
- for tipset := range tipsetsCh {
- err := func() error {
- filename := fmt.Sprintf("%s%cchain-state-%d.html", t.TestOutputsPath, os.PathSeparator, tipset.Height())
- file, err := os.Create(filename)
- defer file.Close()
- if err != nil {
- return err
- }
-
- stout, err := api.StateCompute(ctx, tipset.Height(), nil, tipset.Key())
- if err != nil {
- return err
- }
-
- codeCache := map[address.Address]cid.Cid{}
- getCode := func(addr address.Address) (cid.Cid, error) {
- if c, found := codeCache[addr]; found {
- return c, nil
- }
-
- c, err := api.StateGetActor(ctx, addr, tipset.Key())
- if err != nil {
- return cid.Cid{}, err
- }
-
- codeCache[addr] = c.Code
- return c.Code, nil
- }
-
- return cli.ComputeStateHTMLTempl(file, tipset, stout, true, getCode)
- }()
- if err != nil {
- return err
- }
- }
-
- return nil
-}
diff --git a/testplans/lotus-soup/runner/main.go b/testplans/lotus-soup/runner/main.go
deleted file mode 100644
index e867533f0..000000000
--- a/testplans/lotus-soup/runner/main.go
+++ /dev/null
@@ -1,120 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "os"
- "path"
-
- "github.com/codeskyblue/go-sh"
-)
-
-type jobDefinition struct {
- runNumber int
- compositionPath string
- outputDir string
- skipStdout bool
-}
-
-type jobResult struct {
- job jobDefinition
- runError error
-}
-
-func runComposition(job jobDefinition) jobResult {
- outputArchive := path.Join(job.outputDir, "test-outputs.tgz")
- cmd := sh.Command("testground", "run", "composition", "-f", job.compositionPath, "--collect", "-o", outputArchive)
- if err := os.MkdirAll(job.outputDir, os.ModePerm); err != nil {
- return jobResult{runError: fmt.Errorf("unable to make output directory: %w", err)}
- }
-
- outPath := path.Join(job.outputDir, "run.out")
- outFile, err := os.Create(outPath)
- if err != nil {
- return jobResult{runError: fmt.Errorf("unable to create output file %s: %w", outPath, err)}
- }
- if job.skipStdout {
- cmd.Stdout = outFile
- } else {
- cmd.Stdout = io.MultiWriter(os.Stdout, outFile)
- }
- log.Printf("starting test run %d. writing testground client output to %s\n", job.runNumber, outPath)
- if err = cmd.Run(); err != nil {
- return jobResult{job: job, runError: err}
- }
- return jobResult{job: job}
-}
-
-func worker(id int, jobs <-chan jobDefinition, results chan<- jobResult) {
- log.Printf("started worker %d\n", id)
- for j := range jobs {
- log.Printf("worker %d started test run %d\n", id, j.runNumber)
- results <- runComposition(j)
- }
-}
-
-func buildComposition(compositionPath string, outputDir string) (string, error) {
- outComp := path.Join(outputDir, "composition.toml")
- err := sh.Command("cp", compositionPath, outComp).Run()
- if err != nil {
- return "", err
- }
-
- return outComp, sh.Command("testground", "build", "composition", "-w", "-f", outComp).Run()
-}
-
-func main() {
- runs := flag.Int("runs", 1, "number of times to run composition")
- parallelism := flag.Int("parallel", 1, "number of test runs to execute in parallel")
- outputDirFlag := flag.String("output", "", "path to output directory (will use temp dir if unset)")
- flag.Parse()
-
- if len(flag.Args()) != 1 {
- log.Fatal("must provide a single composition file path argument")
- }
-
- outdir := *outputDirFlag
- if outdir == "" {
- var err error
- outdir, err = ioutil.TempDir(os.TempDir(), "oni-batch-run-")
- if err != nil {
- log.Fatal(err)
- }
- }
- if err := os.MkdirAll(outdir, os.ModePerm); err != nil {
- log.Fatal(err)
- }
-
- compositionPath := flag.Args()[0]
-
- // first build the composition and write out the artifacts.
- // we copy to a temp file first to avoid modifying the original
- log.Printf("building composition %s\n", compositionPath)
- compositionPath, err := buildComposition(compositionPath, outdir)
- if err != nil {
- log.Fatal(err)
- }
-
- jobs := make(chan jobDefinition, *runs)
- results := make(chan jobResult, *runs)
- for w := 1; w <= *parallelism; w++ {
- go worker(w, jobs, results)
- }
-
- for j := 1; j <= *runs; j++ {
- dir := path.Join(outdir, fmt.Sprintf("run-%d", j))
- skipStdout := *parallelism != 1
- jobs <- jobDefinition{runNumber: j, compositionPath: compositionPath, outputDir: dir, skipStdout: skipStdout}
- }
- close(jobs)
-
- for i := 0; i < *runs; i++ {
- r := <-results
- if r.runError != nil {
- log.Printf("error running job %d: %s\n", r.job.runNumber, r.runError)
- }
- }
-}
diff --git a/testplans/lotus-soup/sanity.go b/testplans/lotus-soup/sanity.go
deleted file mode 100644
index b06a653c5..000000000
--- a/testplans/lotus-soup/sanity.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package main
-
-import (
- "fmt"
- "io/ioutil"
- "os"
-)
-
-func sanityCheck() {
- enhanceMsg := func(msg string, a ...interface{}) string {
- return fmt.Sprintf("sanity check: "+msg+"; if running on local:exec, make sure to run `make` from the root of the oni repo", a...)
- }
-
- dir := "/var/tmp/filecoin-proof-parameters"
- stat, err := os.Stat(dir)
- if os.IsNotExist(err) {
- panic(enhanceMsg("proofs parameters not available in /var/tmp/filecoin-proof-parameters"))
- }
- if err != nil {
- panic(enhanceMsg("failed to stat /var/tmp/filecoin-proof-parameters: %s", err))
- }
-
- if !stat.IsDir() {
- panic(enhanceMsg("/var/tmp/filecoin-proof-parameters is not a directory; aborting"))
- }
-
- files, err := ioutil.ReadDir(dir)
- if err != nil {
- panic(enhanceMsg("failed list directory /var/tmp/filecoin-proof-parameters: %s", err))
- }
-
- if len(files) == 0 {
- panic(enhanceMsg("no files in /var/tmp/filecoin-proof-parameters"))
- }
-}
diff --git a/testplans/lotus-soup/statemachine/statemachine.go b/testplans/lotus-soup/statemachine/statemachine.go
deleted file mode 100644
index 17de614db..000000000
--- a/testplans/lotus-soup/statemachine/statemachine.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package statemachine
-
-import (
- "errors"
- "sync"
-)
-
-// This code has been shamelessly lifted from this blog post:
-// https://venilnoronha.io/a-simple-state-machine-framework-in-go
-// Many thanks to the author, Venil Norohnha
-
-// ErrEventRejected is the error returned when the state machine cannot process
-// an event in the state that it is in.
-var ErrEventRejected = errors.New("event rejected")
-
-const (
- // Default represents the default state of the system.
- Default StateType = ""
-
- // NoOp represents a no-op event.
- NoOp EventType = "NoOp"
-)
-
-// StateType represents an extensible state type in the state machine.
-type StateType string
-
-// EventType represents an extensible event type in the state machine.
-type EventType string
-
-// EventContext represents the context to be passed to the action implementation.
-type EventContext interface{}
-
-// Action represents the action to be executed in a given state.
-type Action interface {
- Execute(eventCtx EventContext) EventType
-}
-
-// Events represents a mapping of events and states.
-type Events map[EventType]StateType
-
-// State binds a state with an action and a set of events it can handle.
-type State struct {
- Action Action
- Events Events
-}
-
-// States represents a mapping of states and their implementations.
-type States map[StateType]State
-
-// StateMachine represents the state machine.
-type StateMachine struct {
- // Previous represents the previous state.
- Previous StateType
-
- // Current represents the current state.
- Current StateType
-
- // States holds the configuration of states and events handled by the state machine.
- States States
-
- // mutex ensures that only 1 event is processed by the state machine at any given time.
- mutex sync.Mutex
-}
-
-// getNextState returns the next state for the event given the machine's current
-// state, or an error if the event can't be handled in the given state.
-func (s *StateMachine) getNextState(event EventType) (StateType, error) {
- if state, ok := s.States[s.Current]; ok {
- if state.Events != nil {
- if next, ok := state.Events[event]; ok {
- return next, nil
- }
- }
- }
- return Default, ErrEventRejected
-}
-
-// SendEvent sends an event to the state machine.
-func (s *StateMachine) SendEvent(event EventType, eventCtx EventContext) error {
- s.mutex.Lock()
- defer s.mutex.Unlock()
-
- for {
- // Determine the next state for the event given the machine's current state.
- nextState, err := s.getNextState(event)
- if err != nil {
- return ErrEventRejected
- }
-
- // Identify the state definition for the next state.
- state, ok := s.States[nextState]
- if !ok || state.Action == nil {
- // configuration error
- }
-
- // Transition over to the next state.
- s.Previous = s.Current
- s.Current = nextState
-
- // Execute the next state's action and loop over again if the event returned
- // is not a no-op.
- nextEvent := state.Action.Execute(eventCtx)
- if nextEvent == NoOp {
- return nil
- }
- event = nextEvent
- }
-}
diff --git a/testplans/lotus-soup/statemachine/suspend.go b/testplans/lotus-soup/statemachine/suspend.go
deleted file mode 100644
index 11bade7c1..000000000
--- a/testplans/lotus-soup/statemachine/suspend.go
+++ /dev/null
@@ -1,128 +0,0 @@
-package statemachine
-
-import (
- "fmt"
- "strings"
- "time"
-)
-
-const (
- Running StateType = "running"
- Suspended StateType = "suspended"
-
- Halt EventType = "halt"
- Resume EventType = "resume"
-)
-
-type Suspendable interface {
- Halt()
- Resume()
-}
-
-type HaltAction struct{}
-
-func (a *HaltAction) Execute(ctx EventContext) EventType {
- s, ok := ctx.(*Suspender)
- if !ok {
- fmt.Println("unable to halt, event context is not Suspendable")
- return NoOp
- }
- s.target.Halt()
- return NoOp
-}
-
-type ResumeAction struct{}
-
-func (a *ResumeAction) Execute(ctx EventContext) EventType {
- s, ok := ctx.(*Suspender)
- if !ok {
- fmt.Println("unable to resume, event context is not Suspendable")
- return NoOp
- }
- s.target.Resume()
- return NoOp
-}
-
-type Suspender struct {
- StateMachine
- target Suspendable
- log LogFn
-}
-
-type LogFn func(fmt string, args ...interface{})
-
-func NewSuspender(target Suspendable, log LogFn) *Suspender {
- return &Suspender{
- target: target,
- log: log,
- StateMachine: StateMachine{
- Current: Running,
- States: States{
- Running: State{
- Action: &ResumeAction{},
- Events: Events{
- Halt: Suspended,
- },
- },
-
- Suspended: State{
- Action: &HaltAction{},
- Events: Events{
- Resume: Running,
- },
- },
- },
- },
- }
-}
-
-func (s *Suspender) RunEvents(eventSpec string) {
- s.log("running event spec: %s", eventSpec)
- for _, et := range parseEventSpec(eventSpec, s.log) {
- if et.delay != 0 {
- //s.log("waiting %s", et.delay.String())
- time.Sleep(et.delay)
- continue
- }
- if et.event == "" {
- s.log("ignoring empty event")
- continue
- }
- s.log("sending event %s", et.event)
- err := s.SendEvent(et.event, s)
- if err != nil {
- s.log("error sending event %s: %s", et.event, err)
- }
- }
-}
-
-type eventTiming struct {
- delay time.Duration
- event EventType
-}
-
-func parseEventSpec(spec string, log LogFn) []eventTiming {
- fields := strings.Split(spec, "->")
- out := make([]eventTiming, 0, len(fields))
- for _, f := range fields {
- f = strings.TrimSpace(f)
- words := strings.Split(f, " ")
-
- // TODO: try to implement a "waiting" state instead of special casing like this
- if words[0] == "wait" {
- if len(words) != 2 {
- log("expected 'wait' to be followed by duration, e.g. 'wait 30s'. ignoring.")
- continue
- }
- d, err := time.ParseDuration(words[1])
- if err != nil {
- log("bad argument for 'wait': %s", err)
- continue
- }
- out = append(out, eventTiming{delay: d})
- } else {
- out = append(out, eventTiming{event: EventType(words[0])})
- }
- }
- return out
-}
diff --git a/testplans/lotus-soup/testkit/deals.go b/testplans/lotus-soup/testkit/deals.go
deleted file mode 100644
index b65517c4d..000000000
--- a/testplans/lotus-soup/testkit/deals.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package testkit
-
-import (
- "context"
- "fmt"
-
- "github.com/ipfs/go-cid"
-
- "github.com/filecoin-project/go-address"
- "github.com/filecoin-project/go-fil-markets/storagemarket"
- "github.com/filecoin-project/go-state-types/abi"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/api/v0api"
- "github.com/filecoin-project/lotus/chain/types"
- tsync "github.com/filecoin-project/lotus/tools/stats/sync"
-)
-
-func StartDeal(ctx context.Context, minerActorAddr address.Address, client api.FullNode, fcid cid.Cid, fastRetrieval bool) *cid.Cid {
- addr, err := client.WalletDefaultAddress(ctx)
- if err != nil {
- panic(err)
- }
-
- deal, err := client.ClientStartDeal(ctx, &api.StartDealParams{
- Data: &storagemarket.DataRef{
- TransferType: storagemarket.TTGraphsync,
- Root: fcid,
- },
- Wallet: addr,
- Miner: minerActorAddr,
- EpochPrice: types.NewInt(4000000),
- MinBlocksDuration: 640000,
- DealStartEpoch: 200,
- FastRetrieval: fastRetrieval,
- })
- if err != nil {
- panic(err)
- }
- return deal
-}
-
-func WaitDealSealed(t *TestEnvironment, ctx context.Context, client api.FullNode, deal *cid.Cid) {
- height := 0
- headlag := 3
-
- cctx, cancel := context.WithCancel(ctx)
- defer cancel()
-
- tipsetsCh, err := tsync.BufferedTipsetChannel(cctx, &v0api.WrapperV1Full{FullNode: client}, abi.ChainEpoch(height), headlag)
- if err != nil {
- panic(err)
- }
-
- for tipset := range tipsetsCh {
- t.RecordMessage("got tipset: height %d", tipset.Height())
-
- di, err := client.ClientGetDealInfo(ctx, *deal)
- if err != nil {
- panic(err)
- }
- switch di.State {
- case storagemarket.StorageDealProposalRejected:
- panic("deal rejected")
- case storagemarket.StorageDealFailing:
- panic("deal failed")
- case storagemarket.StorageDealError:
- panic(fmt.Sprintf("deal errored %s", di.Message))
- case storagemarket.StorageDealActive:
- t.RecordMessage("completed deal: %s", di)
- return
- }
-
- t.RecordMessage("deal state: %s", storagemarket.DealStates[di.State])
- }
-}
diff --git a/testplans/lotus-soup/testkit/defaults.go b/testplans/lotus-soup/testkit/defaults.go
deleted file mode 100644
index a0681f37c..000000000
--- a/testplans/lotus-soup/testkit/defaults.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package testkit
-
-import "fmt"
-
-type RoleName = string
-
-var DefaultRoles = map[RoleName]func(*TestEnvironment) error{
- "bootstrapper": func(t *TestEnvironment) error {
- b, err := PrepareBootstrapper(t)
- if err != nil {
- return err
- }
- return b.RunDefault()
- },
- "miner": func(t *TestEnvironment) error {
- m, err := PrepareMiner(t)
- if err != nil {
- return err
- }
- return m.RunDefault()
- },
- "client": func(t *TestEnvironment) error {
- c, err := PrepareClient(t)
- if err != nil {
- return err
- }
- return c.RunDefault()
- },
- "drand": func(t *TestEnvironment) error {
- d, err := PrepareDrandInstance(t)
- if err != nil {
- return err
- }
- return d.RunDefault()
- },
- "pubsub-tracer": func(t *TestEnvironment) error {
- tr, err := PreparePubsubTracer(t)
- if err != nil {
- return err
- }
- return tr.RunDefault()
- },
-}
-
-// HandleDefaultRole handles a role by running its default behaviour.
-//
-// This function is suitable to forward to when a test case doesn't need to
-// explicitly handle/alter a role.
-func HandleDefaultRole(t *TestEnvironment) error {
- f, ok := DefaultRoles[t.Role]
- if !ok {
- panic(fmt.Sprintf("unrecognized role: %s", t.Role))
- }
- return f(t)
-}
diff --git a/testplans/lotus-soup/testkit/lotus_opts.go b/testplans/lotus-soup/testkit/lotus_opts.go
deleted file mode 100644
index 768c6d0d3..000000000
--- a/testplans/lotus-soup/testkit/lotus_opts.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package testkit
-
-import (
- "fmt"
-
- "github.com/libp2p/go-libp2p/core/peer"
- ma "github.com/multiformats/go-multiaddr"
-
- "github.com/filecoin-project/lotus/node"
- "github.com/filecoin-project/lotus/node/config"
- "github.com/filecoin-project/lotus/node/modules"
- "github.com/filecoin-project/lotus/node/modules/dtypes"
- "github.com/filecoin-project/lotus/node/modules/lp2p"
- "github.com/filecoin-project/lotus/node/repo"
-)
-
-func withGenesis(gb []byte) node.Option {
- return node.Override(new(modules.Genesis), modules.LoadGenesis(gb))
-}
-
-func withBootstrapper(ab []byte) node.Option {
- return node.Override(new(dtypes.BootstrapPeers),
- func() (dtypes.BootstrapPeers, error) {
- if ab == nil {
- return dtypes.BootstrapPeers{}, nil
- }
-
- a, err := ma.NewMultiaddrBytes(ab)
- if err != nil {
- return nil, err
- }
- ai, err := peer.AddrInfoFromP2pAddr(a)
- if err != nil {
- return nil, err
- }
- return dtypes.BootstrapPeers{*ai}, nil
- })
-}
-
-func withPubsubConfig(bootstrapper bool, pubsubTracer string) node.Option {
- return node.Override(new(*config.Pubsub), func() *config.Pubsub {
- return &config.Pubsub{
- Bootstrapper: bootstrapper,
- RemoteTracer: pubsubTracer,
- }
- })
-}
-
-func withListenAddress(ip string) node.Option {
- addrs := []string{fmt.Sprintf("/ip4/%s/tcp/0", ip)}
- return node.Override(node.StartListeningKey, lp2p.StartListening(addrs))
-}
-
-func withMinerListenAddress(ip string) node.Option {
- addrs := []string{fmt.Sprintf("/ip4/%s/tcp/0", ip)}
- return node.Override(node.StartListeningKey, lp2p.StartListening(addrs))
-}
-
-func withApiEndpoint(addr string) node.Option {
- return node.Override(node.SetApiEndpointKey, func(lr repo.LockedRepo) error {
- apima, err := ma.NewMultiaddr(addr)
- if err != nil {
- return err
- }
- return lr.SetAPIEndpoint(apima)
- })
-}
diff --git a/testplans/lotus-soup/testkit/net.go b/testplans/lotus-soup/testkit/net.go
deleted file mode 100644
index d2dbc2ae6..000000000
--- a/testplans/lotus-soup/testkit/net.go
+++ /dev/null
@@ -1,92 +0,0 @@
-package testkit
-
-import (
- "context"
- "fmt"
- "time"
-
- "github.com/testground/sdk-go/network"
- "github.com/testground/sdk-go/sync"
-)
-
-func ApplyNetworkParameters(t *TestEnvironment) {
- if !t.TestSidecar {
- t.RecordMessage("no test sidecar, skipping network config")
- return
- }
-
- ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
- defer cancel()
-
- ls := network.LinkShape{}
-
- if t.IsParamSet("latency_range") {
- r := t.DurationRangeParam("latency_range")
- ls.Latency = r.ChooseRandom()
- t.D().RecordPoint("latency_ms", float64(ls.Latency.Milliseconds()))
- }
-
- if t.IsParamSet("jitter_range") {
- r := t.DurationRangeParam("jitter_range")
- ls.Jitter = r.ChooseRandom()
- t.D().RecordPoint("jitter_ms", float64(ls.Jitter.Milliseconds()))
- }
-
- if t.IsParamSet("loss_range") {
- r := t.FloatRangeParam("loss_range")
- ls.Loss = r.ChooseRandom()
- t.D().RecordPoint("packet_loss", float64(ls.Loss))
- }
-
- if t.IsParamSet("corrupt_range") {
- r := t.FloatRangeParam("corrupt_range")
- ls.Corrupt = r.ChooseRandom()
- t.D().RecordPoint("corrupt_packet_probability", float64(ls.Corrupt))
- }
-
- if t.IsParamSet("corrupt_corr_range") {
- r := t.FloatRangeParam("corrupt_corr_range")
- ls.CorruptCorr = r.ChooseRandom()
- t.D().RecordPoint("corrupt_packet_correlation", float64(ls.CorruptCorr))
- }
-
- if t.IsParamSet("reorder_range") {
- r := t.FloatRangeParam("reorder_range")
- ls.Reorder = r.ChooseRandom()
- t.D().RecordPoint("reordered_packet_probability", float64(ls.Reorder))
- }
-
- if t.IsParamSet("reorder_corr_range") {
- r := t.FloatRangeParam("reorder_corr_range")
- ls.ReorderCorr = r.ChooseRandom()
- t.D().RecordPoint("reordered_packet_correlation", float64(ls.ReorderCorr))
- }
-
- if t.IsParamSet("duplicate_range") {
- r := t.FloatRangeParam("duplicate_range")
- ls.Duplicate = r.ChooseRandom()
- t.D().RecordPoint("duplicate_packet_probability", float64(ls.Duplicate))
- }
-
- if t.IsParamSet("duplicate_corr_range") {
- r := t.FloatRangeParam("duplicate_corr_range")
- ls.DuplicateCorr = r.ChooseRandom()
- t.D().RecordPoint("duplicate_packet_correlation", float64(ls.DuplicateCorr))
- }
-
- if t.IsParamSet("bandwidth") {
- ls.Bandwidth = t.SizeParam("bandwidth")
- t.D().RecordPoint("bandwidth_bytes", float64(ls.Bandwidth))
- }
-
- t.NetClient.MustConfigureNetwork(ctx, &network.Config{
- Network: "default",
- Enable: true,
- Default: ls,
- CallbackState: sync.State(fmt.Sprintf("latency-configured-%s", t.TestGroupID)),
- CallbackTarget: t.TestGroupInstanceCount,
- RoutingPolicy: network.AllowAll,
- })
-
- t.DumpJSON("network-link-shape.json", ls)
-}
diff --git a/testplans/lotus-soup/testkit/node.go b/testplans/lotus-soup/testkit/node.go
deleted file mode 100644
index 4d8d04aeb..000000000
--- a/testplans/lotus-soup/testkit/node.go
+++ /dev/null
@@ -1,288 +0,0 @@
-package testkit
-
-import (
- "context"
- "fmt"
- "net/http"
- "os"
- "sort"
- "time"
-
- influxdb "github.com/kpacha/opencensus-influxdb"
- ma "github.com/multiformats/go-multiaddr"
- manet "github.com/multiformats/go-multiaddr/net"
- "go.opencensus.io/stats"
- "go.opencensus.io/stats/view"
-
- "github.com/filecoin-project/go-state-types/abi"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/chain/beacon"
- "github.com/filecoin-project/lotus/chain/wallet/key"
- "github.com/filecoin-project/lotus/metrics"
- "github.com/filecoin-project/lotus/miner"
- "github.com/filecoin-project/lotus/node"
- "github.com/filecoin-project/lotus/node/modules/dtypes"
- modtest "github.com/filecoin-project/lotus/node/modules/testing"
- tinflux "github.com/filecoin-project/lotus/tools/stats/influx"
- tipldstore "github.com/filecoin-project/lotus/tools/stats/ipldstore"
- tpoints "github.com/filecoin-project/lotus/tools/stats/points"
- tsync "github.com/filecoin-project/lotus/tools/stats/sync"
-)
-
-var PrepareNodeTimeout = 3 * time.Minute
-
-type LotusNode struct {
- FullApi api.FullNode
- MinerApi api.StorageMiner
- StopFn node.StopFunc
- Wallet *key.Key
- MineOne func(context.Context, miner.MineReq) error
-}
-
-func (n *LotusNode) setWallet(ctx context.Context, walletKey *key.Key) error {
- _, err := n.FullApi.WalletImport(ctx, &walletKey.KeyInfo)
- if err != nil {
- return err
- }
-
- err = n.FullApi.WalletSetDefault(ctx, walletKey.Address)
- if err != nil {
- return err
- }
-
- n.Wallet = walletKey
-
- return nil
-}
-
-func WaitForBalances(t *TestEnvironment, ctx context.Context, nodes int) ([]*InitialBalanceMsg, error) {
- ch := make(chan *InitialBalanceMsg)
- sub := t.SyncClient.MustSubscribe(ctx, BalanceTopic, ch)
-
- balances := make([]*InitialBalanceMsg, 0, nodes)
- for i := 0; i < nodes; i++ {
- select {
- case m := <-ch:
- balances = append(balances, m)
- case err := <-sub.Done():
- return nil, fmt.Errorf("got error while waiting for balances: %w", err)
- }
- }
-
- return balances, nil
-}
-
-func CollectPreseals(t *TestEnvironment, ctx context.Context, miners int) ([]*PresealMsg, error) {
- ch := make(chan *PresealMsg)
- sub := t.SyncClient.MustSubscribe(ctx, PresealTopic, ch)
-
- preseals := make([]*PresealMsg, 0, miners)
- for i := 0; i < miners; i++ {
- select {
- case m := <-ch:
- preseals = append(preseals, m)
- case err := <-sub.Done():
- return nil, fmt.Errorf("got error while waiting for preseals: %w", err)
- }
- }
-
- sort.Slice(preseals, func(i, j int) bool {
- return preseals[i].Seqno < preseals[j].Seqno
- })
-
- return preseals, nil
-}
-
-func WaitForGenesis(t *TestEnvironment, ctx context.Context) (*GenesisMsg, error) {
- genesisCh := make(chan *GenesisMsg)
- sub := t.SyncClient.MustSubscribe(ctx, GenesisTopic, genesisCh)
-
- select {
- case genesisMsg := <-genesisCh:
- return genesisMsg, nil
- case err := <-sub.Done():
- return nil, fmt.Errorf("error while waiting for genesis msg: %w", err)
- }
-}
-
-func CollectMinerAddrs(t *TestEnvironment, ctx context.Context, miners int) ([]MinerAddressesMsg, error) {
- ch := make(chan MinerAddressesMsg)
- sub := t.SyncClient.MustSubscribe(ctx, MinersAddrsTopic, ch)
-
- addrs := make([]MinerAddressesMsg, 0, miners)
- for i := 0; i < miners; i++ {
- select {
- case a := <-ch:
- addrs = append(addrs, a)
- case err := <-sub.Done():
- return nil, fmt.Errorf("got error while waiting for miners addrs: %w", err)
- }
- }
-
- return addrs, nil
-}
-
-func CollectClientAddrs(t *TestEnvironment, ctx context.Context, clients int) ([]*ClientAddressesMsg, error) {
- ch := make(chan *ClientAddressesMsg)
- sub := t.SyncClient.MustSubscribe(ctx, ClientsAddrsTopic, ch)
-
- addrs := make([]*ClientAddressesMsg, 0, clients)
- for i := 0; i < clients; i++ {
- select {
- case a := <-ch:
- addrs = append(addrs, a)
- case err := <-sub.Done():
- return nil, fmt.Errorf("got error while waiting for clients addrs: %w", err)
- }
- }
-
- return addrs, nil
-}
-
-func GetPubsubTracerMaddr(ctx context.Context, t *TestEnvironment) (string, error) {
- if !t.BooleanParam("enable_pubsub_tracer") {
- return "", nil
- }
-
- ch := make(chan *PubsubTracerMsg)
- sub := t.SyncClient.MustSubscribe(ctx, PubsubTracerTopic, ch)
-
- select {
- case m := <-ch:
- return m.Multiaddr, nil
- case err := <-sub.Done():
- return "", fmt.Errorf("got error while waiting for pubsub tracer config: %w", err)
- }
-}
-
-func GetRandomBeaconOpts(ctx context.Context, t *TestEnvironment) (node.Option, error) {
- beaconType := t.StringParam("random_beacon_type")
- switch beaconType {
- case "external-drand":
- noop := func(settings *node.Settings) error {
- return nil
- }
- return noop, nil
-
- case "local-drand":
- cfg, err := waitForDrandConfig(ctx, t.SyncClient)
- if err != nil {
- t.RecordMessage("error getting drand config: %w", err)
- return nil, err
-
- }
- t.RecordMessage("setting drand config: %v", cfg)
- return node.Options(
- node.Override(new(dtypes.DrandConfig), cfg.Config),
- node.Override(new(dtypes.DrandBootstrap), cfg.GossipBootstrap),
- ), nil
-
- case "mock":
- return node.Options(
- node.Override(new(beacon.RandomBeacon), modtest.RandomBeacon),
- node.Override(new(dtypes.DrandConfig), dtypes.DrandConfig{
- ChainInfoJSON: "{\"Hash\":\"wtf\"}",
- }),
- node.Override(new(dtypes.DrandBootstrap), dtypes.DrandBootstrap{}),
- ), nil
-
- default:
- return nil, fmt.Errorf("unknown random_beacon_type: %s", beaconType)
- }
-}
-
-func startServer(endpoint ma.Multiaddr, srv *http.Server) (listenAddr string, err error) {
- lst, err := manet.Listen(endpoint)
- if err != nil {
- return "", fmt.Errorf("could not listen: %w", err)
- }
-
- go func() {
- _ = srv.Serve(manet.NetListener(lst))
- }()
-
- return lst.Addr().String(), nil
-}
-
-func registerAndExportMetrics(instanceName string) {
- // Register all Lotus metric views
- err := view.Register(metrics.DefaultViews...)
- if err != nil {
- panic(err)
- }
-
- // Set the metric to one so it is published to the exporter
- stats.Record(context.Background(), metrics.LotusInfo.M(1))
-
- // Register our custom exporter to opencensus
- e, err := influxdb.NewExporter(context.Background(), influxdb.Options{
- Database: "testground",
- Address: os.Getenv("INFLUXDB_URL"),
- Username: "",
- Password: "",
- InstanceName: instanceName,
- })
- if err != nil {
- panic(err)
- }
- view.RegisterExporter(e)
- view.SetReportingPeriod(5 * time.Second)
-}
-
-func collectStats(t *TestEnvironment, ctx context.Context, api api.FullNode) error {
- t.RecordMessage("collecting blockchain stats")
-
- influxAddr := os.Getenv("INFLUXDB_URL")
- influxUser := ""
- influxPass := ""
- influxDb := "testground"
-
- influxClient, err := tinflux.NewClient(influxAddr, influxUser, influxPass)
- if err != nil {
- t.RecordMessage(err.Error())
- return err
- }
-
- height := int64(0)
- headlag := 1
-
- go func() {
- time.Sleep(15 * time.Second)
- t.RecordMessage("calling tstats.Collect")
-
- store, err := tipldstore.NewApiIpldStore(ctx, api, 1024)
- if err != nil {
- t.RecordMessage(err.Error())
- return
- }
-
- collector, err := tpoints.NewChainPointCollector(ctx, store, api)
- if err != nil {
- t.RecordMessage(err.Error())
- return
- }
-
- tipsets, err := tsync.BufferedTipsetChannel(ctx, api, abi.ChainEpoch(height), headlag)
- if err != nil {
- t.RecordMessage(err.Error())
- return
- }
-
- wq := tinflux.NewWriteQueue(ctx, influxClient)
- defer wq.Close()
-
- for tipset := range tipsets {
- if nb, err := collector.Collect(ctx, tipset); err != nil {
- t.RecordMessage(err.Error())
- return
- } else {
- nb.SetDatabase(influxDb)
- wq.AddBatch(nb)
- }
- }
-
- }()
-
- return nil
-}
diff --git a/testplans/lotus-soup/testkit/retrieval.go b/testplans/lotus-soup/testkit/retrieval.go
deleted file mode 100644
index 0182b0907..000000000
--- a/testplans/lotus-soup/testkit/retrieval.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package testkit
-
-import (
- "bytes"
- "context"
- "errors"
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "time"
-
- "github.com/ipfs/go-cid"
- files "github.com/ipfs/go-ipfs-files"
- ipld "github.com/ipfs/go-ipld-format"
- dag "github.com/ipfs/go-merkledag"
- dstest "github.com/ipfs/go-merkledag/test"
- unixfile "github.com/ipfs/go-unixfs/file"
- "github.com/ipld/go-car"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/api/v0api"
-)
-
-func RetrieveData(t *TestEnvironment, ctx context.Context, client api.FullNode, fcid cid.Cid, _ *cid.Cid, carExport bool, data []byte) error {
- t1 := time.Now()
- offers, err := client.ClientFindData(ctx, fcid, nil)
- if err != nil {
- panic(err)
- }
- for _, o := range offers {
- t.D().Counter(fmt.Sprintf("find-data.offer,miner=%s", o.Miner)).Inc(1)
- }
- t.D().ResettingHistogram("find-data").Update(int64(time.Since(t1)))
-
- if len(offers) < 1 {
- panic("no offers")
- }
-
- rpath, err := ioutil.TempDir("", "lotus-retrieve-test-")
- if err != nil {
- panic(err)
- }
- defer os.RemoveAll(rpath)
-
- caddr, err := client.WalletDefaultAddress(ctx)
- if err != nil {
- return err
- }
-
- ref := &api.FileRef{
- Path: filepath.Join(rpath, "ret"),
- IsCAR: carExport,
- }
- t1 = time.Now()
- err = (&v0api.WrapperV1Full{FullNode: client}).ClientRetrieve(ctx, v0api.OfferOrder(offers[0], caddr), ref)
- if err != nil {
- return err
- }
- t.D().ResettingHistogram("retrieve-data").Update(int64(time.Since(t1)))
-
- rdata, err := ioutil.ReadFile(filepath.Join(rpath, "ret"))
- if err != nil {
- return err
- }
-
- if carExport {
- rdata = ExtractCarData(ctx, rdata, rpath)
- }
-
- if !bytes.Equal(rdata, data) {
- return errors.New("wrong data retrieved")
- }
-
- t.RecordMessage("retrieved successfully")
-
- return nil
-}
-
-func ExtractCarData(ctx context.Context, rdata []byte, rpath string) []byte {
- bserv := dstest.Bserv()
- ch, err := car.LoadCar(ctx, bserv.Blockstore(), bytes.NewReader(rdata))
- if err != nil {
- panic(err)
- }
- b, err := bserv.GetBlock(ctx, ch.Roots[0])
- if err != nil {
- panic(err)
- }
- nd, err := ipld.Decode(b)
- if err != nil {
- panic(err)
- }
- dserv := dag.NewDAGService(bserv)
- fil, err := unixfile.NewUnixfsFile(ctx, dserv, nd)
- if err != nil {
- panic(err)
- }
- outPath := filepath.Join(rpath, "retLoadedCAR")
- if err := files.WriteTo(fil, outPath); err != nil {
- panic(err)
- }
- rdata, err = ioutil.ReadFile(outPath)
- if err != nil {
- panic(err)
- }
- return rdata
-}
diff --git a/testplans/lotus-soup/testkit/role_bootstrapper.go b/testplans/lotus-soup/testkit/role_bootstrapper.go
deleted file mode 100644
index 6c19f26f1..000000000
--- a/testplans/lotus-soup/testkit/role_bootstrapper.go
+++ /dev/null
@@ -1,203 +0,0 @@
-package testkit
-
-import (
- "bytes"
- "context"
- "fmt"
- mbig "math/big"
- "time"
-
- "github.com/google/uuid"
- "github.com/libp2p/go-libp2p/core/peer"
- ma "github.com/multiformats/go-multiaddr"
-
- "github.com/filecoin-project/go-state-types/big"
-
- "github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/gen"
- "github.com/filecoin-project/lotus/chain/types"
- "github.com/filecoin-project/lotus/genesis"
- "github.com/filecoin-project/lotus/node"
- "github.com/filecoin-project/lotus/node/modules"
- modtest "github.com/filecoin-project/lotus/node/modules/testing"
- "github.com/filecoin-project/lotus/node/repo"
-)
-
-// Bootstrapper is a special kind of process that produces a genesis block with
-// the initial wallet balances and preseals for all enlisted miners and clients.
-type Bootstrapper struct {
- *LotusNode
-
- t *TestEnvironment
-}
-
-func PrepareBootstrapper(t *TestEnvironment) (*Bootstrapper, error) {
- var (
- clients = t.IntParam("clients")
- miners = t.IntParam("miners")
- nodes = clients + miners
- )
-
- ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout)
- defer cancel()
-
- pubsubTracerMaddr, err := GetPubsubTracerMaddr(ctx, t)
- if err != nil {
- return nil, err
- }
-
- randomBeaconOpt, err := GetRandomBeaconOpts(ctx, t)
- if err != nil {
- return nil, err
- }
-
- // the first duty of the boostrapper is to construct the genesis block
- // first collect all client and miner balances to assign initial funds
- balances, err := WaitForBalances(t, ctx, nodes)
- if err != nil {
- return nil, err
- }
-
- totalBalance := big.Zero()
- for _, b := range balances {
- totalBalance = big.Add(filToAttoFil(b.Balance), totalBalance)
- }
-
- totalBalanceFil := attoFilToFil(totalBalance)
- t.RecordMessage("TOTAL BALANCE: %s AttoFIL (%s FIL)", totalBalance, totalBalanceFil)
- if max := types.TotalFilecoinInt; totalBalanceFil.GreaterThanEqual(max) {
- panic(fmt.Sprintf("total sum of balances is greater than max Filecoin ever; sum=%s, max=%s", totalBalance, max))
- }
-
- // then collect all preseals from miners
- preseals, err := CollectPreseals(t, ctx, miners)
- if err != nil {
- return nil, err
- }
-
- // now construct the genesis block
- var genesisActors []genesis.Actor
- var genesisMiners []genesis.Miner
-
- for _, bm := range balances {
- balance := filToAttoFil(bm.Balance)
- t.RecordMessage("balance assigned to actor %s: %s AttoFIL", bm.Addr, balance)
- genesisActors = append(genesisActors,
- genesis.Actor{
- Type: genesis.TAccount,
- Balance: balance,
- Meta: (&genesis.AccountMeta{Owner: bm.Addr}).ActorMeta(),
- })
- }
-
- for _, pm := range preseals {
- genesisMiners = append(genesisMiners, pm.Miner)
- }
-
- genesisTemplate := genesis.Template{
- Accounts: genesisActors,
- Miners: genesisMiners,
- Timestamp: uint64(time.Now().Unix()) - uint64(t.IntParam("genesis_timestamp_offset")),
- VerifregRootKey: gen.DefaultVerifregRootkeyActor,
- RemainderAccount: gen.DefaultRemainderAccountActor,
- NetworkName: "testground-local-" + uuid.New().String(),
- }
-
- // dump the genesis block
- // var jsonBuf bytes.Buffer
- // jsonEnc := json.NewEncoder(&jsonBuf)
- // err := jsonEnc.Encode(genesisTemplate)
- // if err != nil {
- // panic(err)
- // }
- // runenv.RecordMessage(fmt.Sprintf("Genesis template: %s", string(jsonBuf.Bytes())))
-
- // this is horrendously disgusting, we use this contraption to side effect the construction
- // of the genesis block in the buffer -- yes, a side effect of dependency injection.
- // I remember when software was straightforward...
- var genesisBuffer bytes.Buffer
-
- bootstrapperIP := t.NetClient.MustGetDataNetworkIP().String()
-
- n := &LotusNode{}
- r := repo.NewMemory(nil)
- stop, err := node.New(context.Background(),
- node.FullAPI(&n.FullApi),
- node.Base(),
- node.Repo(r),
- node.Override(new(modules.Genesis), modtest.MakeGenesisMem(&genesisBuffer, genesisTemplate)),
- withApiEndpoint(fmt.Sprintf("/ip4/0.0.0.0/tcp/%s", t.PortNumber("node_rpc", "0"))),
- withListenAddress(bootstrapperIP),
- withBootstrapper(nil),
- withPubsubConfig(true, pubsubTracerMaddr),
- randomBeaconOpt,
- )
- if err != nil {
- return nil, err
- }
- n.StopFn = stop
-
- var bootstrapperAddr ma.Multiaddr
-
- bootstrapperAddrs, err := n.FullApi.NetAddrsListen(ctx)
- if err != nil {
- stop(context.TODO())
- return nil, err
- }
- for _, a := range bootstrapperAddrs.Addrs {
- ip, err := a.ValueForProtocol(ma.P_IP4)
- if err != nil {
- continue
- }
- if ip != bootstrapperIP {
- continue
- }
- addrs, err := peer.AddrInfoToP2pAddrs(&peer.AddrInfo{
- ID: bootstrapperAddrs.ID,
- Addrs: []ma.Multiaddr{a},
- })
- if err != nil {
- panic(err)
- }
- bootstrapperAddr = addrs[0]
- break
- }
-
- if bootstrapperAddr == nil {
- panic("failed to determine bootstrapper address")
- }
-
- genesisMsg := &GenesisMsg{
- Genesis: genesisBuffer.Bytes(),
- Bootstrapper: bootstrapperAddr.Bytes(),
- }
- t.SyncClient.MustPublish(ctx, GenesisTopic, genesisMsg)
-
- t.RecordMessage("waiting for all nodes to be ready")
- t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount)
-
- return &Bootstrapper{n, t}, nil
-}
-
-// RunDefault runs a default bootstrapper.
-func (b *Bootstrapper) RunDefault() error {
- b.t.RecordMessage("running bootstrapper")
- ctx := context.Background()
- b.t.SyncClient.MustSignalAndWait(ctx, StateDone, b.t.TestInstanceCount)
- return nil
-}
-
-// filToAttoFil converts a fractional filecoin value into AttoFIL, rounding if necessary
-func filToAttoFil(f float64) big.Int {
- a := mbig.NewFloat(f)
- a.Mul(a, mbig.NewFloat(float64(build.FilecoinPrecision)))
- i, _ := a.Int(nil)
- return big.Int{Int: i}
-}
-
-func attoFilToFil(atto big.Int) big.Int {
- i := big.NewInt(0)
- i.Add(i.Int, atto.Int)
- i.Div(i.Int, big.NewIntUnsigned(build.FilecoinPrecision).Int)
- return i
-}
diff --git a/testplans/lotus-soup/testkit/role_client.go b/testplans/lotus-soup/testkit/role_client.go
deleted file mode 100644
index afde27420..000000000
--- a/testplans/lotus-soup/testkit/role_client.go
+++ /dev/null
@@ -1,199 +0,0 @@
-package testkit
-
-import (
- "context"
- "fmt"
- "net/http"
- "time"
-
- "contrib.go.opencensus.io/exporter/prometheus"
- "github.com/gorilla/mux"
- "github.com/hashicorp/go-multierror"
-
- "github.com/filecoin-project/go-jsonrpc"
- "github.com/filecoin-project/go-jsonrpc/auth"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/chain/types"
- "github.com/filecoin-project/lotus/chain/wallet/key"
- "github.com/filecoin-project/lotus/node"
- "github.com/filecoin-project/lotus/node/repo"
-)
-
-type LotusClient struct {
- *LotusNode
-
- t *TestEnvironment
- MinerAddrs []MinerAddressesMsg
-}
-
-func PrepareClient(t *TestEnvironment) (*LotusClient, error) {
- ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout)
- defer cancel()
-
- ApplyNetworkParameters(t)
-
- pubsubTracer, err := GetPubsubTracerMaddr(ctx, t)
- if err != nil {
- return nil, err
- }
-
- drandOpt, err := GetRandomBeaconOpts(ctx, t)
- if err != nil {
- return nil, err
- }
-
- // first create a wallet
- walletKey, err := key.GenerateKey(types.KTBLS)
- if err != nil {
- return nil, err
- }
-
- // publish the account ID/balance
- balance := t.FloatParam("balance")
- balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance}
- t.SyncClient.Publish(ctx, BalanceTopic, balanceMsg)
-
- // then collect the genesis block and bootstrapper address
- genesisMsg, err := WaitForGenesis(t, ctx)
- if err != nil {
- return nil, err
- }
-
- clientIP := t.NetClient.MustGetDataNetworkIP().String()
-
- nodeRepo := repo.NewMemory(nil)
-
- // create the node
- n := &LotusNode{}
- stop, err := node.New(context.Background(),
- node.FullAPI(&n.FullApi),
- node.Base(),
- node.Repo(nodeRepo),
- withApiEndpoint(fmt.Sprintf("/ip4/0.0.0.0/tcp/%s", t.PortNumber("node_rpc", "0"))),
- withGenesis(genesisMsg.Genesis),
- withListenAddress(clientIP),
- withBootstrapper(genesisMsg.Bootstrapper),
- withPubsubConfig(false, pubsubTracer),
- drandOpt,
- )
- if err != nil {
- return nil, err
- }
-
- // set the wallet
- err = n.setWallet(ctx, walletKey)
- if err != nil {
- _ = stop(context.TODO())
- return nil, err
- }
-
- fullSrv, err := startFullNodeAPIServer(t, nodeRepo, n.FullApi)
- if err != nil {
- return nil, err
- }
-
- n.StopFn = func(ctx context.Context) error {
- var err *multierror.Error
- err = multierror.Append(fullSrv.Shutdown(ctx))
- err = multierror.Append(stop(ctx))
- return err.ErrorOrNil()
- }
-
- registerAndExportMetrics(fmt.Sprintf("client_%d", t.GroupSeq))
-
- t.RecordMessage("publish our address to the clients addr topic")
- addrinfo, err := n.FullApi.NetAddrsListen(ctx)
- if err != nil {
- return nil, err
- }
- t.SyncClient.MustPublish(ctx, ClientsAddrsTopic, &ClientAddressesMsg{
- PeerNetAddr: addrinfo,
- WalletAddr: walletKey.Address,
- GroupSeq: t.GroupSeq,
- })
-
- t.RecordMessage("waiting for all nodes to be ready")
- t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount)
-
- // collect miner addresses.
- addrs, err := CollectMinerAddrs(t, ctx, t.IntParam("miners"))
- if err != nil {
- return nil, err
- }
- t.RecordMessage("got %v miner addrs", len(addrs))
-
- // densely connect the client to the full node and the miners themselves.
- for _, miner := range addrs {
- if err := n.FullApi.NetConnect(ctx, miner.FullNetAddrs); err != nil {
- return nil, fmt.Errorf("client failed to connect to full node of miner: %w", err)
- }
- if err := n.FullApi.NetConnect(ctx, miner.MinerNetAddrs); err != nil {
- return nil, fmt.Errorf("client failed to connect to storage miner node node of miner: %w", err)
- }
- }
-
- // wait for all clients to have completed identify, pubsub negotiation with miners.
- time.Sleep(1 * time.Second)
-
- peers, err := n.FullApi.NetPeers(ctx)
- if err != nil {
- return nil, fmt.Errorf("failed to query connected peers: %w", err)
- }
-
- t.RecordMessage("connected peers: %d", len(peers))
-
- cl := &LotusClient{
- t: t,
- LotusNode: n,
- MinerAddrs: addrs,
- }
- return cl, nil
-}
-
-func (c *LotusClient) RunDefault() error {
- // run forever
- c.t.RecordMessage("running default client forever")
- c.t.WaitUntilAllDone()
- return nil
-}
-
-func startFullNodeAPIServer(t *TestEnvironment, repo repo.Repo, napi api.FullNode) (*http.Server, error) {
- mux := mux.NewRouter()
-
- rpcServer := jsonrpc.NewServer()
- rpcServer.Register("Filecoin", napi)
-
- mux.Handle("/rpc/v0", rpcServer)
-
- exporter, err := prometheus.NewExporter(prometheus.Options{
- Namespace: "lotus",
- })
- if err != nil {
- return nil, err
- }
-
- mux.Handle("/debug/metrics", exporter)
-
- ah := &auth.Handler{
- Verify: func(ctx context.Context, token string) ([]auth.Permission, error) {
- return api.AllPermissions, nil
- },
- Next: mux.ServeHTTP,
- }
-
- srv := &http.Server{Handler: ah}
-
- endpoint, err := repo.APIEndpoint()
- if err != nil {
- return nil, fmt.Errorf("no API endpoint in repo: %w", err)
- }
-
- listenAddr, err := startServer(endpoint, srv)
- if err != nil {
- return nil, fmt.Errorf("failed to start client API endpoint: %w", err)
- }
-
- t.RecordMessage("started node API server at %s", listenAddr)
- return srv, nil
-}
diff --git a/testplans/lotus-soup/testkit/role_drand.go b/testplans/lotus-soup/testkit/role_drand.go
deleted file mode 100644
index bae36bd61..000000000
--- a/testplans/lotus-soup/testkit/role_drand.go
+++ /dev/null
@@ -1,391 +0,0 @@
-package testkit
-
-import (
- "bytes"
- "context"
- "encoding/hex"
- "fmt"
- "io/ioutil"
- "net"
- "os"
- "path"
- "time"
-
- "github.com/drand/drand/chain"
- "github.com/drand/drand/client"
- hclient "github.com/drand/drand/client/http"
- "github.com/drand/drand/core"
- "github.com/drand/drand/key"
- "github.com/drand/drand/log"
- "github.com/drand/drand/lp2p"
- dnet "github.com/drand/drand/net"
- "github.com/drand/drand/protobuf/drand"
- dtest "github.com/drand/drand/test"
- "github.com/libp2p/go-libp2p/core/peer"
- ma "github.com/multiformats/go-multiaddr"
- "github.com/testground/sdk-go/sync"
-
- "github.com/filecoin-project/lotus/node/modules/dtypes"
- "github.com/filecoin-project/lotus/testplans/lotus-soup/statemachine"
-)
-
-var (
- PrepareDrandTimeout = 3 * time.Minute
- secretDKG = "dkgsecret"
-)
-
-type DrandInstance struct {
- daemon *core.Drand
- httpClient client.Client
- ctrlClient *dnet.ControlClient
- gossipRelay *lp2p.GossipRelayNode
-
- t *TestEnvironment
- stateDir string
- priv *key.Pair
- pubAddr string
- privAddr string
- ctrlAddr string
-}
-
-func (dr *DrandInstance) Start() error {
- opts := []core.ConfigOption{
- core.WithLogLevel(getLogLevel(dr.t)),
- core.WithConfigFolder(dr.stateDir),
- core.WithPublicListenAddress(dr.pubAddr),
- core.WithPrivateListenAddress(dr.privAddr),
- core.WithControlPort(dr.ctrlAddr),
- core.WithInsecure(),
- }
- conf := core.NewConfig(opts...)
- fs := key.NewFileStore(conf.ConfigFolder())
- fs.SaveKeyPair(dr.priv)
- key.Save(path.Join(dr.stateDir, "public.toml"), dr.priv.Public, false)
- if dr.daemon == nil {
- drand, err := core.NewDrand(fs, conf)
- if err != nil {
- return err
- }
- dr.daemon = drand
- } else {
- drand, err := core.LoadDrand(fs, conf)
- if err != nil {
- return err
- }
- drand.StartBeacon(true)
- dr.daemon = drand
- }
- return nil
-}
-
-func (dr *DrandInstance) Ping() bool {
- cl := dr.ctrl()
- if err := cl.Ping(); err != nil {
- return false
- }
- return true
-}
-
-func (dr *DrandInstance) Close() error {
- dr.gossipRelay.Shutdown()
- dr.daemon.Stop(context.Background())
- return os.RemoveAll(dr.stateDir)
-}
-
-func (dr *DrandInstance) ctrl() *dnet.ControlClient {
- if dr.ctrlClient != nil {
- return dr.ctrlClient
- }
- cl, err := dnet.NewControlClient(dr.ctrlAddr)
- if err != nil {
- dr.t.RecordMessage("drand can't instantiate control client: %w", err)
- return nil
- }
- dr.ctrlClient = cl
- return cl
-}
-
-func (dr *DrandInstance) RunDKG(nodes, thr int, timeout string, leader bool, leaderAddr string, beaconOffset int) *key.Group {
- cl := dr.ctrl()
- p := dr.t.DurationParam("drand_period")
- catchupPeriod := dr.t.DurationParam("drand_catchup_period")
- t, _ := time.ParseDuration(timeout)
- var grp *drand.GroupPacket
- var err error
- if leader {
- grp, err = cl.InitDKGLeader(nodes, thr, p, catchupPeriod, t, nil, secretDKG, beaconOffset)
- } else {
- leader := dnet.CreatePeer(leaderAddr, false)
- grp, err = cl.InitDKG(leader, nil, secretDKG)
- }
- if err != nil {
- dr.t.RecordMessage("drand dkg run failed: %w", err)
- return nil
- }
- kg, _ := key.GroupFromProto(grp)
- return kg
-}
-
-func (dr *DrandInstance) Halt() {
- dr.t.RecordMessage("drand node #%d halting", dr.t.GroupSeq)
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- dr.daemon.Stop(ctx)
-}
-
-func (dr *DrandInstance) Resume() {
- dr.t.RecordMessage("drand node #%d resuming", dr.t.GroupSeq)
- dr.Start()
- // block until we can fetch the round corresponding to the current time
- startTime := time.Now()
- round := dr.httpClient.RoundAt(startTime)
- timeout := 120 * time.Second
- ctx, cancel := context.WithTimeout(context.Background(), timeout)
- defer cancel()
-
- done := make(chan struct{}, 1)
- go func() {
- for {
- res, err := dr.httpClient.Get(ctx, round)
- if err == nil {
- dr.t.RecordMessage("drand chain caught up to round %d", res.Round())
- done <- struct{}{}
- return
- }
- time.Sleep(2 * time.Second)
- }
- }()
-
- select {
- case <-ctx.Done():
- dr.t.RecordMessage("drand chain failed to catch up after %s", timeout.String())
- case <-done:
- dr.t.RecordMessage("drand chain resumed after %s catchup time", time.Since(startTime))
- }
-}
-
-func (dr *DrandInstance) RunDefault() error {
- dr.t.RecordMessage("running drand node")
-
- if dr.t.IsParamSet("suspend_events") {
- suspender := statemachine.NewSuspender(dr, dr.t.RecordMessage)
- suspender.RunEvents(dr.t.StringParam("suspend_events"))
- }
-
- dr.t.WaitUntilAllDone()
- return nil
-}
-
-// prepareDrandNode starts a drand instance and runs a DKG with the other members of the composition group.
-// Once the chain is running, the leader publishes the chain info needed by lotus nodes on
-// drandConfigTopic
-func PrepareDrandInstance(t *TestEnvironment) (*DrandInstance, error) {
- ctx, cancel := context.WithTimeout(context.Background(), PrepareDrandTimeout)
- defer cancel()
-
- ApplyNetworkParameters(t)
-
- startTime := time.Now()
-
- seq := t.GroupSeq
- isLeader := seq == 1
- nNodes := t.TestGroupInstanceCount
-
- myAddr := t.NetClient.MustGetDataNetworkIP()
- threshold := t.IntParam("drand_threshold")
- runGossipRelay := t.BooleanParam("drand_gossip_relay")
-
- beaconOffset := 3
-
- stateDir, err := ioutil.TempDir("/tmp", fmt.Sprintf("drand-%d", t.GroupSeq))
- if err != nil {
- return nil, err
- }
-
- dr := DrandInstance{
- t: t,
- stateDir: stateDir,
- pubAddr: dtest.FreeBind(myAddr.String()),
- privAddr: dtest.FreeBind(myAddr.String()),
- ctrlAddr: dtest.FreeBind("localhost"),
- }
- dr.priv = key.NewKeyPair(dr.privAddr)
-
- // share the node addresses with other nodes
- // TODO: if we implement TLS, this is where we'd share public TLS keys
- type NodeAddr struct {
- PrivateAddr string
- PublicAddr string
- IsLeader bool
- }
- addrTopic := sync.NewTopic("drand-addrs", &NodeAddr{})
- var publicAddrs []string
- var leaderAddr string
- ch := make(chan *NodeAddr)
- _, sub := t.SyncClient.MustPublishSubscribe(ctx, addrTopic, &NodeAddr{
- PrivateAddr: dr.privAddr,
- PublicAddr: dr.pubAddr,
- IsLeader: isLeader,
- }, ch)
- for i := 0; i < nNodes; i++ {
- select {
- case msg := <-ch:
- publicAddrs = append(publicAddrs, fmt.Sprintf("http://%s", msg.PublicAddr))
- if msg.IsLeader {
- leaderAddr = msg.PrivateAddr
- }
- case err := <-sub.Done():
- return nil, fmt.Errorf("unable to read drand addrs from sync service: %w", err)
- }
- }
- if leaderAddr == "" {
- return nil, fmt.Errorf("got %d drand addrs, but no leader", len(publicAddrs))
- }
-
- t.SyncClient.MustSignalAndWait(ctx, "drand-start", nNodes)
- t.RecordMessage("Starting drand sharing ceremony")
- if err := dr.Start(); err != nil {
- return nil, err
- }
-
- alive := false
- waitSecs := 10
- for i := 0; i < waitSecs; i++ {
- if !dr.Ping() {
- time.Sleep(time.Second)
- continue
- }
- t.R().RecordPoint("drand_first_ping", time.Now().Sub(startTime).Seconds())
- alive = true
- break
- }
- if !alive {
- return nil, fmt.Errorf("drand node %d failed to start after %d seconds", t.GroupSeq, waitSecs)
- }
-
- // run DKG
- t.SyncClient.MustSignalAndWait(ctx, "drand-dkg-start", nNodes)
- if !isLeader {
- time.Sleep(3 * time.Second)
- }
- grp := dr.RunDKG(nNodes, threshold, "10s", isLeader, leaderAddr, beaconOffset)
- if grp == nil {
- return nil, fmt.Errorf("drand dkg failed")
- }
- t.R().RecordPoint("drand_dkg_complete", time.Now().Sub(startTime).Seconds())
-
- t.RecordMessage("drand dkg complete, waiting for chain start: %v", time.Until(time.Unix(grp.GenesisTime, 0).Add(grp.Period)))
-
- // wait for chain to begin
- to := time.Until(time.Unix(grp.GenesisTime, 0).Add(5 * time.Second).Add(grp.Period))
- time.Sleep(to)
-
- t.RecordMessage("drand beacon chain started, fetching initial round via http")
- // verify that we can get a round of randomness from the chain using an http client
- info := chain.NewChainInfo(grp)
- myPublicAddr := fmt.Sprintf("http://%s", dr.pubAddr)
- dr.httpClient, err = hclient.NewWithInfo(myPublicAddr, info, nil)
- if err != nil {
- return nil, fmt.Errorf("unable to create drand http client: %w", err)
- }
-
- _, err = dr.httpClient.Get(ctx, 1)
- if err != nil {
- return nil, fmt.Errorf("unable to get initial drand round: %w", err)
- }
-
- // start gossip relay (unless disabled via testplan parameter)
- var relayAddrs []peer.AddrInfo
-
- if runGossipRelay {
- gossipDir := path.Join(stateDir, "gossip-relay")
- listenAddr := fmt.Sprintf("/ip4/%s/tcp/7777", myAddr.String())
- relayCfg := lp2p.GossipRelayConfig{
- ChainHash: hex.EncodeToString(info.Hash()),
- Addr: listenAddr,
- DataDir: gossipDir,
- IdentityPath: path.Join(gossipDir, "identity.key"),
- Insecure: true,
- Client: dr.httpClient,
- }
- t.RecordMessage("starting drand gossip relay")
- dr.gossipRelay, err = lp2p.NewGossipRelayNode(log.NewLogger(nil, getLogLevel(t)), &relayCfg)
- if err != nil {
- return nil, fmt.Errorf("failed to construct drand gossip relay: %w", err)
- }
-
- t.RecordMessage("sharing gossip relay addrs")
- // share the gossip relay addrs so we can publish them in DrandRuntimeInfo
- relayInfo, err := relayAddrInfo(dr.gossipRelay.Multiaddrs(), myAddr)
- if err != nil {
- return nil, err
- }
- infoCh := make(chan *peer.AddrInfo, nNodes)
- infoTopic := sync.NewTopic("drand-gossip-addrs", &peer.AddrInfo{})
-
- _, sub := t.SyncClient.MustPublishSubscribe(ctx, infoTopic, relayInfo, infoCh)
- for i := 0; i < nNodes; i++ {
- select {
- case ai := <-infoCh:
- relayAddrs = append(relayAddrs, *ai)
- case err := <-sub.Done():
- return nil, fmt.Errorf("unable to get drand relay addr from sync service: %w", err)
- }
- }
- }
-
- // if we're the leader, publish the config to the sync service
- if isLeader {
- buf := bytes.Buffer{}
- if err := info.ToJSON(&buf); err != nil {
- return nil, fmt.Errorf("error marshaling chain info: %w", err)
- }
- cfg := DrandRuntimeInfo{
- Config: dtypes.DrandConfig{
- Servers: publicAddrs,
- ChainInfoJSON: buf.String(),
- },
- GossipBootstrap: relayAddrs,
- }
- t.DebugSpew("publishing drand config on sync topic: %v", cfg)
- t.SyncClient.MustPublish(ctx, DrandConfigTopic, &cfg)
- }
-
- // signal ready state
- t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount)
- return &dr, nil
-}
-
-// waitForDrandConfig should be called by filecoin instances before constructing the lotus Node
-// you can use the returned dtypes.DrandConfig to override the default production config.
-func waitForDrandConfig(ctx context.Context, client sync.Client) (*DrandRuntimeInfo, error) {
- ch := make(chan *DrandRuntimeInfo, 1)
- sub := client.MustSubscribe(ctx, DrandConfigTopic, ch)
- select {
- case cfg := <-ch:
- return cfg, nil
- case err := <-sub.Done():
- return nil, err
- }
-}
-
-func relayAddrInfo(addrs []ma.Multiaddr, dataIP net.IP) (*peer.AddrInfo, error) {
- for _, a := range addrs {
- if ip, _ := a.ValueForProtocol(ma.P_IP4); ip != dataIP.String() {
- continue
- }
- return peer.AddrInfoFromP2pAddr(a)
- }
- return nil, fmt.Errorf("no addr found with data ip %s in addrs: %v", dataIP, addrs)
-}
-
-func getLogLevel(t *TestEnvironment) int {
- switch t.StringParam("drand_log_level") {
- case "info":
- return log.LogInfo
- case "debug":
- return log.LogDebug
- default:
- return log.LogNone
- }
-}
diff --git a/testplans/lotus-soup/testkit/role_miner.go b/testplans/lotus-soup/testkit/role_miner.go
deleted file mode 100644
index 3f67d056b..000000000
--- a/testplans/lotus-soup/testkit/role_miner.go
+++ /dev/null
@@ -1,652 +0,0 @@
-package testkit
-
-import (
- "context"
- "crypto/rand"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net/http"
- "path/filepath"
- "time"
-
- "contrib.go.opencensus.io/exporter/prometheus"
- "github.com/google/uuid"
- "github.com/gorilla/mux"
- "github.com/hashicorp/go-multierror"
- "github.com/ipfs/go-datastore"
- libp2pcrypto "github.com/libp2p/go-libp2p/core/crypto"
- "github.com/libp2p/go-libp2p/core/peer"
- "github.com/testground/sdk-go/sync"
-
- "github.com/filecoin-project/go-address"
- "github.com/filecoin-project/go-jsonrpc"
- "github.com/filecoin-project/go-jsonrpc/auth"
- "github.com/filecoin-project/go-state-types/abi"
- "github.com/filecoin-project/go-storedcounter"
- "github.com/filecoin-project/specs-actors/actors/builtin"
- saminer "github.com/filecoin-project/specs-actors/actors/builtin/miner"
-
- "github.com/filecoin-project/lotus/api"
- "github.com/filecoin-project/lotus/build"
- "github.com/filecoin-project/lotus/chain/actors"
- genesis_chain "github.com/filecoin-project/lotus/chain/gen/genesis"
- "github.com/filecoin-project/lotus/chain/types"
- "github.com/filecoin-project/lotus/chain/wallet/key"
- "github.com/filecoin-project/lotus/cmd/lotus-seed/seed"
- "github.com/filecoin-project/lotus/markets/storageadapter"
- "github.com/filecoin-project/lotus/miner"
- "github.com/filecoin-project/lotus/node"
- "github.com/filecoin-project/lotus/node/config"
- "github.com/filecoin-project/lotus/node/impl"
- "github.com/filecoin-project/lotus/node/repo"
- "github.com/filecoin-project/lotus/storage/paths"
- sealing "github.com/filecoin-project/lotus/storage/pipeline"
- "github.com/filecoin-project/lotus/storage/sealer/storiface"
-)
-
-const (
- sealDelay = 30 * time.Second
-)
-
-type LotusMiner struct {
- *LotusNode
-
- MinerRepo repo.Repo
- NodeRepo repo.Repo
- FullNetAddrs []peer.AddrInfo
- GenesisMsg *GenesisMsg
- Subsystems config.MinerSubsystemConfig
-
- t *TestEnvironment
-}
-
-func PrepareMiner(t *TestEnvironment) (*LotusMiner, error) {
- ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout)
- defer cancel()
-
- ApplyNetworkParameters(t)
-
- pubsubTracer, err := GetPubsubTracerMaddr(ctx, t)
- if err != nil {
- return nil, err
- }
-
- drandOpt, err := GetRandomBeaconOpts(ctx, t)
- if err != nil {
- return nil, err
- }
-
- // first create a wallet
- walletKey, err := key.GenerateKey(types.KTBLS)
- if err != nil {
- return nil, err
- }
-
- // publish the account ID/balance
- balance := t.FloatParam("balance")
- balanceMsg := &InitialBalanceMsg{Addr: walletKey.Address, Balance: balance}
- t.SyncClient.Publish(ctx, BalanceTopic, balanceMsg)
-
- // create and publish the preseal commitment
- priv, _, err := libp2pcrypto.GenerateEd25519Key(rand.Reader)
- if err != nil {
- return nil, err
- }
-
- minerID, err := peer.IDFromPrivateKey(priv)
- if err != nil {
- return nil, err
- }
-
- // pick unique sequence number for each miner, no matter in which group they are
- seq := t.SyncClient.MustSignalAndWait(ctx, StateMinerPickSeqNum, t.IntParam("miners"))
-
- minerAddr, err := address.NewIDAddress(genesis_chain.MinerStart + uint64(seq-1))
- if err != nil {
- return nil, err
- }
-
- presealDir, err := ioutil.TempDir("", "preseal")
- if err != nil {
- return nil, err
- }
-
- sectors := t.IntParam("sectors")
- genMiner, _, err := seed.PreSeal(minerAddr, abi.RegisteredSealProof_StackedDrg8MiBV1, 0, sectors, presealDir, []byte("TODO: randomize this"), &walletKey.KeyInfo, false)
- if err != nil {
- return nil, err
- }
- genMiner.PeerId = minerID
-
- t.RecordMessage("Miner Info: Owner: %s Worker: %s", genMiner.Owner, genMiner.Worker)
-
- presealMsg := &PresealMsg{Miner: *genMiner, Seqno: seq}
- t.SyncClient.Publish(ctx, PresealTopic, presealMsg)
-
- // then collect the genesis block and bootstrapper address
- genesisMsg, err := WaitForGenesis(t, ctx)
- if err != nil {
- return nil, err
- }
-
- // prepare the repo
- minerRepoDir, err := ioutil.TempDir("", "miner-repo-dir")
- if err != nil {
- return nil, err
- }
-
- minerRepo, err := repo.NewFS(minerRepoDir)
- if err != nil {
- return nil, err
- }
-
- err = minerRepo.Init(repo.StorageMiner)
- if err != nil {
- return nil, err
- }
-
- var subsystems config.MinerSubsystemConfig
-
- {
- lr, err := minerRepo.Lock(repo.StorageMiner)
- if err != nil {
- return nil, err
- }
-
- c, err := lr.Config()
- if err != nil {
- return nil, err
- }
-
- cfg := c.(*config.StorageMiner)
- subsystems = cfg.Subsystems
-
- ks, err := lr.KeyStore()
- if err != nil {
- return nil, err
- }
-
- kbytes, err := libp2pcrypto.MarshalPrivateKey(priv)
- if err != nil {
- return nil, err
- }
-
- err = ks.Put("libp2p-host", types.KeyInfo{
- Type: "libp2p-host",
- PrivateKey: kbytes,
- })
- if err != nil {
- return nil, err
- }
-
- ds, err := lr.Datastore(context.Background(), "/metadata")
- if err != nil {
- return nil, err
- }
-
- err = ds.Put(context.Background(), datastore.NewKey("miner-address"), minerAddr.Bytes())
- if err != nil {
- return nil, err
- }
-
- nic := storedcounter.New(ds, datastore.NewKey(sealing.StorageCounterDSPrefix))
- for i := 0; i < (sectors + 1); i++ {
- _, err = nic.Next()
- if err != nil {
- return nil, err
- }
- }
-
- var localPaths []paths.LocalPath
-
- b, err := json.MarshalIndent(&paths.LocalStorageMeta{
- ID: storiface.ID(uuid.New().String()),
- Weight: 10,
- CanSeal: true,
- CanStore: true,
- }, "", " ")
- if err != nil {
- return nil, fmt.Errorf("marshaling storage config: %w", err)
- }
-
- if err := ioutil.WriteFile(filepath.Join(lr.Path(), "sectorstore.json"), b, 0644); err != nil {
- return nil, fmt.Errorf("persisting storage metadata (%s): %w", filepath.Join(lr.Path(), "sectorstore.json"), err)
- }
-
- localPaths = append(localPaths, paths.LocalPath{
- Path: lr.Path(),
- })
-
- if err := lr.SetStorage(func(sc *paths.StorageConfig) {
- sc.StoragePaths = append(sc.StoragePaths, localPaths...)
- }); err != nil {
- return nil, err
- }
-
- err = lr.Close()
- if err != nil {
- return nil, err
- }
- }
-
- minerIP := t.NetClient.MustGetDataNetworkIP().String()
-
- // create the node
- // we need both a full node _and_ and storage miner node
- n := &LotusNode{}
-
- // prepare the repo
- nodeRepoDir, err := ioutil.TempDir("", "node-repo-dir")
- if err != nil {
- return nil, err
- }
-
- nodeRepo, err := repo.NewFS(nodeRepoDir)
- if err != nil {
- return nil, err
- }
-
- err = nodeRepo.Init(repo.FullNode)
- if err != nil {
- return nil, err
- }
-
- stop1, err := node.New(context.Background(),
- node.FullAPI(&n.FullApi),
- node.Base(),
- node.Repo(nodeRepo),
- withGenesis(genesisMsg.Genesis),
- withApiEndpoint(fmt.Sprintf("/ip4/0.0.0.0/tcp/%s", t.PortNumber("node_rpc", "0"))),
- withListenAddress(minerIP),
- withBootstrapper(genesisMsg.Bootstrapper),
- withPubsubConfig(false, pubsubTracer),
- drandOpt,
- )
- if err != nil {
- return nil, fmt.Errorf("node node.new error: %w", err)
- }
-
- // set the wallet
- err = n.setWallet(ctx, walletKey)
- if err != nil {
- stop1(context.TODO())
- return nil, err
- }
-
- minerOpts := []node.Option{
- node.StorageMiner(&n.MinerApi, subsystems),
- node.Base(),
- node.Repo(minerRepo),
- node.Override(new(api.FullNode), n.FullApi),
- node.Override(new(*storageadapter.DealPublisher), storageadapter.NewDealPublisher(nil, storageadapter.PublishMsgConfig{
- Period: 15 * time.Second,
- MaxDealsPerMsg: 1,
- })),
- withApiEndpoint(fmt.Sprintf("/ip4/0.0.0.0/tcp/%s", t.PortNumber("miner_rpc", "0"))),
- withMinerListenAddress(minerIP),
- }
-
- if t.StringParam("mining_mode") != "natural" {
- mineBlock := make(chan miner.MineReq)
-
- minerOpts = append(minerOpts,
- node.Override(new(*miner.Miner), miner.NewTestMiner(mineBlock, minerAddr)))
-
- n.MineOne = func(ctx context.Context, cb miner.MineReq) error {
- select {
- case mineBlock <- cb:
- return nil
- case <-ctx.Done():
- return ctx.Err()
- }
- }
- }
-
- stop2, err := node.New(context.Background(), minerOpts...)
- if err != nil {
- stop1(context.TODO())
- return nil, fmt.Errorf("miner node.new error: %w", err)
- }
-
- registerAndExportMetrics(minerAddr.String())
-
- // collect stats based on blockchain from first instance of `miner` role
- if t.InitContext.GroupSeq == 1 && t.Role == "miner" {
- go collectStats(t, ctx, n.FullApi)
- }
-
- // Start listening on the full node.
- fullNodeNetAddrs, err := n.FullApi.NetAddrsListen(ctx)
- if err != nil {
- panic(err)
- }
-
- // set seal delay to lower value than 1 hour
- err = n.MinerApi.SectorSetSealDelay(ctx, sealDelay)
- if err != nil {
- return nil, err
- }
-
- // set expected seal duration to 1 minute
- err = n.MinerApi.SectorSetExpectedSealDuration(ctx, 1*time.Minute)
- if err != nil {
- return nil, err
- }
-
- // print out the admin auth token
- token, err := n.MinerApi.AuthNew(ctx, api.AllPermissions)
- if err != nil {
- return nil, err
- }
-
- t.RecordMessage("Auth token: %s", string(token))
-
- // add local storage for presealed sectors
- err = n.MinerApi.StorageAddLocal(ctx, presealDir)
- if err != nil {
- return nil, err
- }
-
- // set the miner PeerID
- minerIDEncoded, err := actors.SerializeParams(&saminer.ChangePeerIDParams{NewID: abi.PeerID(minerID)})
- if err != nil {
- return nil, err
- }
-
- changeMinerID := &types.Message{
- To: minerAddr,
- From: genMiner.Worker,
- Method: builtin.MethodsMiner.ChangePeerID,
- Params: minerIDEncoded,
- Value: types.NewInt(0),
- }
-
- _, err = n.FullApi.MpoolPushMessage(ctx, changeMinerID, nil)
- if err != nil {
- return nil, err
- }
-
- t.RecordMessage("publish our address to the miners addr topic")
- minerActor, err := n.MinerApi.ActorAddress(ctx)
- if err != nil {
- return nil, err
- }
-
- minerNetAddrs, err := n.MinerApi.NetAddrsListen(ctx)
- if err != nil {
- return nil, err
- }
-
- t.SyncClient.MustPublish(ctx, MinersAddrsTopic, MinerAddressesMsg{
- FullNetAddrs: fullNodeNetAddrs,
- MinerNetAddrs: minerNetAddrs,
- MinerActorAddr: minerActor,
- WalletAddr: walletKey.Address,
- })
-
- t.RecordMessage("connecting to all other miners")
-
- // densely connect the miner's full nodes.
- minerCh := make(chan *MinerAddressesMsg, 16)
- sctx, cancel := context.WithCancel(ctx)
- defer cancel()
- t.SyncClient.MustSubscribe(sctx, MinersAddrsTopic, minerCh)
- var fullNetAddrs []peer.AddrInfo
- for i := 0; i < t.IntParam("miners"); i++ {
- m := <-minerCh
- if m.MinerActorAddr == minerActor {
- // once I find myself, I stop connecting to others, to avoid a simopen problem.
- break
- }
- err := n.FullApi.NetConnect(ctx, m.FullNetAddrs)
- if err != nil {
- return nil, fmt.Errorf("failed to connect to miner %s on: %v", m.MinerActorAddr, m.FullNetAddrs)
- }
- t.RecordMessage("connected to full node of miner %s on %v", m.MinerActorAddr, m.FullNetAddrs)
-
- fullNetAddrs = append(fullNetAddrs, m.FullNetAddrs)
- }
-
- t.RecordMessage("waiting for all nodes to be ready")
- t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount)
-
- fullSrv, err := startFullNodeAPIServer(t, nodeRepo, n.FullApi)
- if err != nil {
- return nil, err
- }
-
- minerSrv, err := startStorageMinerAPIServer(t, minerRepo, n.MinerApi)
- if err != nil {
- return nil, err
- }
-
- n.StopFn = func(ctx context.Context) error {
- var err *multierror.Error
- err = multierror.Append(fullSrv.Shutdown(ctx))
- err = multierror.Append(minerSrv.Shutdown(ctx))
- err = multierror.Append(stop2(ctx))
- err = multierror.Append(stop2(ctx))
- err = multierror.Append(stop1(ctx))
- return err.ErrorOrNil()
- }
-
- m := &LotusMiner{n, minerRepo, nodeRepo, fullNetAddrs, genesisMsg, subsystems, t}
-
- return m, nil
-}
-
-func RestoreMiner(t *TestEnvironment, m *LotusMiner) (*LotusMiner, error) {
- ctx, cancel := context.WithTimeout(context.Background(), PrepareNodeTimeout)
- defer cancel()
-
- minerRepo := m.MinerRepo
- nodeRepo := m.NodeRepo
- fullNetAddrs := m.FullNetAddrs
- genesisMsg := m.GenesisMsg
-
- minerIP := t.NetClient.MustGetDataNetworkIP().String()
-
- drandOpt, err := GetRandomBeaconOpts(ctx, t)
- if err != nil {
- return nil, err
- }
-
- // create the node
- // we need both a full node _and_ and storage miner node
- n := &LotusNode{}
-
- stop1, err := node.New(context.Background(),
- node.FullAPI(&n.FullApi),
- node.Base(),
- node.Repo(nodeRepo),
- //withGenesis(genesisMsg.Genesis),
- withApiEndpoint(fmt.Sprintf("/ip4/0.0.0.0/tcp/%s", t.PortNumber("node_rpc", "0"))),
- withListenAddress(minerIP),
- withBootstrapper(genesisMsg.Bootstrapper),
- //withPubsubConfig(false, pubsubTracer),
- drandOpt,
- )
- if err != nil {
- return nil, err
- }
-
- minerOpts := []node.Option{
- node.StorageMiner(&n.MinerApi, m.Subsystems),
- node.Base(),
- node.Repo(minerRepo),
- node.Override(new(api.FullNode), n.FullApi),
- withApiEndpoint(fmt.Sprintf("/ip4/0.0.0.0/tcp/%s", t.PortNumber("miner_rpc", "0"))),
- withMinerListenAddress(minerIP),
- }
-
- stop2, err := node.New(context.Background(), minerOpts...)
- if err != nil {
- stop1(context.TODO())
- return nil, err
- }
-
- fullSrv, err := startFullNodeAPIServer(t, nodeRepo, n.FullApi)
- if err != nil {
- return nil, err
- }
-
- minerSrv, err := startStorageMinerAPIServer(t, minerRepo, n.MinerApi)
- if err != nil {
- return nil, err
- }
-
- n.StopFn = func(ctx context.Context) error {
- var err *multierror.Error
- err = multierror.Append(fullSrv.Shutdown(ctx))
- err = multierror.Append(minerSrv.Shutdown(ctx))
- err = multierror.Append(stop2(ctx))
- err = multierror.Append(stop2(ctx))
- err = multierror.Append(stop1(ctx))
- return err.ErrorOrNil()
- }
-
- for i := 0; i < len(fullNetAddrs); i++ {
- err := n.FullApi.NetConnect(ctx, fullNetAddrs[i])
- if err != nil {
- // we expect a failure since we also shutdown another miner
- t.RecordMessage("failed to connect to miner %d on: %v", i, fullNetAddrs[i])
- continue
- }
- t.RecordMessage("connected to full node of miner %d on %v", i, fullNetAddrs[i])
- }
-
- pm := &LotusMiner{n, minerRepo, nodeRepo, fullNetAddrs, genesisMsg, m.Subsystems, t}
-
- return pm, err
-}
-
-func (m *LotusMiner) RunDefault() error {
- var (
- t = m.t
- clients = t.IntParam("clients")
- miners = t.IntParam("miners")
- )
-
- t.RecordMessage("running miner")
- t.RecordMessage("block delay: %v", build.BlockDelaySecs)
- t.D().Gauge("miner.block-delay").Update(float64(build.BlockDelaySecs))
-
- ctx := context.Background()
- myActorAddr, err := m.MinerApi.ActorAddress(ctx)
- if err != nil {
- return err
- }
-
- // mine / stop mining
- mine := true
- done := make(chan struct{})
-
- if m.MineOne != nil {
- go func() {
- defer t.RecordMessage("shutting down mining")
- defer close(done)
-
- mine = true
- var i int
- for i = 0; mine; i++ {
- // synchronize all miners to mine the next block
- t.RecordMessage("synchronizing all miners to mine next block [%d]", i)
- stateMineNext := sync.State(fmt.Sprintf("mine-block-%d", i))
- t.SyncClient.MustSignalAndWait(ctx, stateMineNext, miners)
-
- ch := make(chan error)
- const maxRetries = 100
- success := false
- for retries := 0; retries < maxRetries; retries++ {
- f := func(mined bool, epoch abi.ChainEpoch, err error) {
- if mined {
- t.D().Counter(fmt.Sprintf("block.mine,miner=%s", myActorAddr)).Inc(1)
- }
- ch <- err
- }
- req := miner.MineReq{
- Done: f,
- }
- err := m.MineOne(ctx, req)
- if err != nil {
- panic(err)
- }
-
- miningErr := <-ch
- if miningErr == nil {
- success = true
- break
- }
- t.D().Counter("block.mine.err").Inc(1)
- t.RecordMessage("retrying block [%d] after %d attempts due to mining error: %s",
- i, retries, miningErr)
- }
- if !success {
- panic(fmt.Errorf("failed to mine block %d after %d retries", i, maxRetries))
- }
- }
-
- // signal the last block to make sure no miners are left stuck waiting for the next block signal
- // while the others have stopped
- stateMineLast := sync.State(fmt.Sprintf("mine-block-%d", i))
- t.SyncClient.MustSignalEntry(ctx, stateMineLast)
- }()
- } else {
- close(done)
- }
-
- // wait for a signal from all clients to stop mining
- err = <-t.SyncClient.MustBarrier(ctx, StateStopMining, clients).C
- if err != nil {
- return err
- }
-
- mine = false
- <-done
-
- t.SyncClient.MustSignalAndWait(ctx, StateDone, t.TestInstanceCount)
- return nil
-}
-
-func startStorageMinerAPIServer(t *TestEnvironment, repo repo.Repo, minerApi api.StorageMiner) (*http.Server, error) {
- mux := mux.NewRouter()
-
- rpcServer := jsonrpc.NewServer()
- rpcServer.Register("Filecoin", minerApi)
-
- mux.Handle("/rpc/v0", rpcServer)
- mux.PathPrefix("/remote").HandlerFunc(minerApi.(*impl.StorageMinerAPI).ServeRemote(true))
- mux.PathPrefix("/").Handler(http.DefaultServeMux) // pprof
-
- exporter, err := prometheus.NewExporter(prometheus.Options{
- Namespace: "lotus",
- })
- if err != nil {
- return nil, err
- }
-
- mux.Handle("/debug/metrics", exporter)
-
- ah := &auth.Handler{
- Verify: func(ctx context.Context, token string) ([]auth.Permission, error) {
- return api.AllPermissions, nil
- },
- Next: mux.ServeHTTP,
- }
-
- endpoint, err := repo.APIEndpoint()
- if err != nil {
- return nil, fmt.Errorf("no API endpoint in repo: %w", err)
- }
-
- srv := &http.Server{Handler: ah}
-
- listenAddr, err := startServer(endpoint, srv)
- if err != nil {
- return nil, fmt.Errorf("failed to start storage miner API endpoint: %w", err)
- }
-
- t.RecordMessage("started storage miner API server at %s", listenAddr)
- return srv, nil
-}
diff --git a/testplans/lotus-soup/testkit/role_pubsub_tracer.go b/testplans/lotus-soup/testkit/role_pubsub_tracer.go
deleted file mode 100644
index 8d89f23d7..000000000
--- a/testplans/lotus-soup/testkit/role_pubsub_tracer.go
+++ /dev/null
@@ -1,78 +0,0 @@
-package testkit
-
-import (
- "context"
- "crypto/rand"
- "fmt"
-
- "github.com/libp2p/go-libp2p"
- "github.com/libp2p/go-libp2p-pubsub-tracer/traced"
- "github.com/libp2p/go-libp2p/core/crypto"
- "github.com/libp2p/go-libp2p/core/host"
- ma "github.com/multiformats/go-multiaddr"
-)
-
-type PubsubTracer struct {
- t *TestEnvironment
- host host.Host
- traced *traced.TraceCollector
-}
-
-func PreparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) {
- ctx := context.Background()
-
- privk, _, err := crypto.GenerateEd25519Key(rand.Reader)
- if err != nil {
- return nil, err
- }
-
- tracedIP := t.NetClient.MustGetDataNetworkIP().String()
- tracedAddr := fmt.Sprintf("/ip4/%s/tcp/4001", tracedIP)
-
- host, err := libp2p.New(
- libp2p.Identity(privk),
- libp2p.ListenAddrStrings(tracedAddr),
- )
- if err != nil {
- return nil, err
- }
-
- tracedDir := t.TestOutputsPath + "/traced.logs"
- traced, err := traced.NewTraceCollector(host, tracedDir)
- if err != nil {
- host.Close()
- return nil, err
- }
-
- tracedMultiaddrStr := fmt.Sprintf("%s/p2p/%s", tracedAddr, host.ID())
- t.RecordMessage("I am %s", tracedMultiaddrStr)
-
- _ = ma.StringCast(tracedMultiaddrStr)
- tracedMsg := &PubsubTracerMsg{Multiaddr: tracedMultiaddrStr}
- t.SyncClient.MustPublish(ctx, PubsubTracerTopic, tracedMsg)
-
- t.RecordMessage("waiting for all nodes to be ready")
- t.SyncClient.MustSignalAndWait(ctx, StateReady, t.TestInstanceCount)
-
- tracer := &PubsubTracer{t: t, host: host, traced: traced}
- return tracer, nil
-}
-
-func (tr *PubsubTracer) RunDefault() error {
- tr.t.RecordMessage("running pubsub tracer")
-
- defer func() {
- err := tr.Stop()
- if err != nil {
- tr.t.RecordMessage("error stoping tracer: %s", err)
- }
- }()
-
- tr.t.WaitUntilAllDone()
- return nil
-}
-
-func (tr *PubsubTracer) Stop() error {
- tr.traced.Stop()
- return tr.host.Close()
-}
diff --git a/testplans/lotus-soup/testkit/sync.go b/testplans/lotus-soup/testkit/sync.go
deleted file mode 100644
index cab08594c..000000000
--- a/testplans/lotus-soup/testkit/sync.go
+++ /dev/null
@@ -1,71 +0,0 @@
-package testkit
-
-import (
- "github.com/libp2p/go-libp2p/core/peer"
- "github.com/testground/sdk-go/sync"
-
- "github.com/filecoin-project/go-address"
-
- "github.com/filecoin-project/lotus/genesis"
- "github.com/filecoin-project/lotus/node/modules/dtypes"
-)
-
-var (
- GenesisTopic = sync.NewTopic("genesis", &GenesisMsg{})
- BalanceTopic = sync.NewTopic("balance", &InitialBalanceMsg{})
- PresealTopic = sync.NewTopic("preseal", &PresealMsg{})
- ClientsAddrsTopic = sync.NewTopic("clients_addrs", &ClientAddressesMsg{})
- MinersAddrsTopic = sync.NewTopic("miners_addrs", &MinerAddressesMsg{})
- SlashedMinerTopic = sync.NewTopic("slashed_miner", &SlashedMinerMsg{})
- PubsubTracerTopic = sync.NewTopic("pubsub_tracer", &PubsubTracerMsg{})
- DrandConfigTopic = sync.NewTopic("drand_config", &DrandRuntimeInfo{})
-)
-
-var (
- StateReady = sync.State("ready")
- StateDone = sync.State("done")
- StateStopMining = sync.State("stop-mining")
- StateMinerPickSeqNum = sync.State("miner-pick-seq-num")
- StateAbortTest = sync.State("abort-test")
-)
-
-type InitialBalanceMsg struct {
- Addr address.Address
- Balance float64
-}
-
-type PresealMsg struct {
- Miner genesis.Miner
- Seqno int64
-}
-
-type GenesisMsg struct {
- Genesis []byte
- Bootstrapper []byte
-}
-
-type ClientAddressesMsg struct {
- PeerNetAddr peer.AddrInfo
- WalletAddr address.Address
- GroupSeq int64
-}
-
-type MinerAddressesMsg struct {
- FullNetAddrs peer.AddrInfo
- MinerNetAddrs peer.AddrInfo
- MinerActorAddr address.Address
- WalletAddr address.Address
-}
-
-type SlashedMinerMsg struct {
- MinerActorAddr address.Address
-}
-
-type PubsubTracerMsg struct {
- Multiaddr string
-}
-
-type DrandRuntimeInfo struct {
- Config dtypes.DrandConfig
- GossipBootstrap dtypes.DrandBootstrap
-}
diff --git a/testplans/lotus-soup/testkit/testenv.go b/testplans/lotus-soup/testkit/testenv.go
deleted file mode 100644
index 63c297b03..000000000
--- a/testplans/lotus-soup/testkit/testenv.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package testkit
-
-import (
- "context"
- "encoding/json"
- "fmt"
- "strings"
- "time"
-
- "github.com/davecgh/go-spew/spew"
- "github.com/testground/sdk-go/run"
- "github.com/testground/sdk-go/runtime"
-)
-
-type TestEnvironment struct {
- *runtime.RunEnv
- *run.InitContext
-
- Role string
-}
-
-// workaround for default params being wrapped in quote chars
-func (t *TestEnvironment) StringParam(name string) string {
- return strings.Trim(t.RunEnv.StringParam(name), "\"")
-}
-
-func (t *TestEnvironment) DurationParam(name string) time.Duration {
- d, err := time.ParseDuration(t.StringParam(name))
- if err != nil {
- panic(fmt.Errorf("invalid duration value for param '%s': %w", name, err))
- }
- return d
-}
-
-func (t *TestEnvironment) DurationRangeParam(name string) DurationRange {
- var r DurationRange
- t.JSONParam(name, &r)
- return r
-}
-
-func (t *TestEnvironment) FloatRangeParam(name string) FloatRange {
- r := FloatRange{}
- t.JSONParam(name, &r)
- return r
-}
-
-func (t *TestEnvironment) DebugSpew(format string, args ...interface{}) {
- t.RecordMessage(spew.Sprintf(format, args...))
-}
-
-func (t *TestEnvironment) DumpJSON(filename string, v interface{}) {
- b, err := json.Marshal(v)
- if err != nil {
- t.RecordMessage("unable to marshal object to JSON: %s", err)
- return
- }
- f, err := t.CreateRawAsset(filename)
- if err != nil {
- t.RecordMessage("unable to create asset file: %s", err)
- return
- }
- defer f.Close()
-
- _, err = f.Write(b)
- if err != nil {
- t.RecordMessage("error writing json object dump: %s", err)
- }
-}
-
-// WaitUntilAllDone waits until all instances in the test case are done.
-func (t *TestEnvironment) WaitUntilAllDone() {
- ctx := context.Background()
- t.SyncClient.MustSignalAndWait(ctx, StateDone, t.TestInstanceCount)
-}
-
-// WrapTestEnvironment takes a test case function that accepts a
-// *TestEnvironment, and adapts it to the original unwrapped SDK style
-// (run.InitializedTestCaseFn).
-func WrapTestEnvironment(f func(t *TestEnvironment) error) run.InitializedTestCaseFn {
- return func(runenv *runtime.RunEnv, initCtx *run.InitContext) error {
- t := &TestEnvironment{RunEnv: runenv, InitContext: initCtx}
- t.Role = t.StringParam("role")
-
- t.DumpJSON("test-parameters.json", t.TestInstanceParams)
-
- return f(t)
- }
-}
diff --git a/testplans/lotus-soup/testkit/testenv_ranges.go b/testplans/lotus-soup/testkit/testenv_ranges.go
deleted file mode 100644
index 110ce60d1..000000000
--- a/testplans/lotus-soup/testkit/testenv_ranges.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package testkit
-
-import (
- "encoding/json"
- "fmt"
- "math/rand"
- "time"
-
- "github.com/testground/sdk-go/ptypes"
-)
-
-// DurationRange is a Testground parameter type that represents a duration
-// range, suitable use in randomized tests. This type is encoded as a JSON array
-// of length 2 of element type ptypes.Duration, e.g. ["10s", "10m"].
-type DurationRange struct {
- Min time.Duration
- Max time.Duration
-}
-
-func (r *DurationRange) ChooseRandom() time.Duration {
- i := int64(r.Min) + rand.Int63n(int64(r.Max)-int64(r.Min))
- return time.Duration(i)
-}
-
-func (r *DurationRange) UnmarshalJSON(b []byte) error {
- var s []ptypes.Duration
- if err := json.Unmarshal(b, &s); err != nil {
- return err
- }
- if len(s) != 2 {
- return fmt.Errorf("expected two-element array of duration strings, got array of length %d", len(s))
- }
- if s[0].Duration > s[1].Duration {
- return fmt.Errorf("expected first element to be <= second element")
- }
- r.Min = s[0].Duration
- r.Max = s[1].Duration
- return nil
-}
-
-func (r *DurationRange) MarshalJSON() ([]byte, error) {
- s := []ptypes.Duration{{r.Min}, {r.Max}}
- return json.Marshal(s)
-}
-
-// FloatRange is a Testground parameter type that represents a float
-// range, suitable use in randomized tests. This type is encoded as a JSON array
-// of length 2 of element type float32, e.g. [1.45, 10.675].
-type FloatRange struct {
- Min float32
- Max float32
-}
-
-func (r *FloatRange) ChooseRandom() float32 {
- return r.Min + rand.Float32()*(r.Max-r.Min)
-}
-
-func (r *FloatRange) UnmarshalJSON(b []byte) error {
- var s []float32
- if err := json.Unmarshal(b, &s); err != nil {
- return err
- }
- if len(s) != 2 {
- return fmt.Errorf("expected two-element array of floats, got array of length %d", len(s))
- }
- if s[0] > s[1] {
- return fmt.Errorf("expected first element to be <= second element")
- }
- r.Min = s[0]
- r.Max = s[1]
- return nil
-}
-
-func (r *FloatRange) MarshalJSON() ([]byte, error) {
- s := []float32{r.Min, r.Max}
- return json.Marshal(s)
-}
diff --git a/testplans/notes/.empty b/testplans/notes/.empty
deleted file mode 100644
index e69de29bb..000000000
diff --git a/testplans/notes/raulk.md b/testplans/notes/raulk.md
deleted file mode 100644
index 88476f2a3..000000000
--- a/testplans/notes/raulk.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Raúl's notes
-
-## Storage mining
-
-The Storage Mining System is the part of the Filecoin Protocol that deals with
-storing Client’s data, producing proof artifacts that demonstrate correct
-storage behavior, and managing the work involved.
-
-## Preseals
-
-In the Filecoin consensus protocol, the miners' probability of being eligible
-to mine a block in a given epoch is directly correlated with their power in the
-network. This creates a chicken-and-egg problem at genesis. Since there are no
-miners, there is no power in the network, therefore no miner is eligible to mine
-and advance the chain.
-
-Preseals are sealed sectors that are blessed at genesis, thus conferring
-their miners the possibility to win round elections and successfully mine a
-block. Without preseals, the chain would be dead on arrival.
-
-Preseals work with fauxrep and faux sealing, which are special-case
-implementations of PoRep and the sealing logic that do not depend on slow
-sealing.
-
-### Not implemented things
-
-**Sector Resealing:** Miners should be able to ’re-seal’ sectors, to allow them
-to take a set of sectors with mostly expired pieces, and combine the
-not-yet-expired pieces into a single (or multiple) sectors.
-
-**Sector Transfer:** Miners should be able to re-delegate the responsibility of
-storing data to another miner. This is tricky for many reasons, and will not be
-implemented in the initial release of Filecoin, but could provide interesting
-capabilities down the road.
-
-## Catch-up/rush mining
-
-In catch-up or rush mining, miners make up for chain history that does not
-exist. It's a recovery/healing procedure. The chain runs at at constant
-25 second epoch time. When in the network mining halts for some reason
-(consensus/liveness bug, drand availability issues, etc.), upon a restart miners
-will go and backfill the chain history by mining backdated blocks in
-the appropriate timestamps.
-
-There are a few things worth highlighting:
- * mining runs in a hot loop, and there is no time for miners to gossip about
- their blocks; therefore they end up building the chain solo, as they can't
- incorprate other blocks into tipsets.
- * the miner with most power will mine most blocks.
- * presumably, as many forks in the network will appear as miners who mined a
- block + a fork filled with null rounds only (for miners that didn't win a
- round).
- * at the end of the catch-up, the heaviest fork will win the race, and it may
- be possible for the most powerful miner pre-disruption to affect the
- outcome by choosing the messages that go in their blocks.
diff --git a/tools/dockers/docker-examples/README.md b/tools/dockers/docker-examples/README.md
index 3b8c34480..22ddd2476 100644
--- a/tools/dockers/docker-examples/README.md
+++ b/tools/dockers/docker-examples/README.md
@@ -11,7 +11,7 @@ In this `docker-examples/` directory are community-contributed Docker and Docker
- local node for a developer (`api-local-`)
- hosted endpoint for apps / multiple developers (`api-hosted-`)
- **For a local devnet or shared devnet**
- - basic local devnet (also see [lotus docs on setting up a local devnet](https://docs.filecoin.io/build/local-devnet/))
+ - basic local devnet (also see [lotus docs on setting up a local devnet](https://lotus.filecoin.io/developers/local-network/))
- shared devnet
diff --git a/tools/kibana/README.md b/tools/kibana/README.md
new file mode 100644
index 000000000..c556ae10c
--- /dev/null
+++ b/tools/kibana/README.md
@@ -0,0 +1,20 @@
+## Lotus Kibana Dashboard
+
+This folder contains configuration files to create Kibana dashboards to track peer scores and block propagation
+throughout Filecoin network.
+
+### Importing index template
+
+Index template needs to be imported into Elasticsearch for score weights and to
+prevent Elasticsearch from infering wrong field type.
+
+The [template](./index-template.json) is loaded via [Kibana Index Management](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-mgmt.html) and pasted
+into newly created Index Template.
+
+### Importing dashboard
+
+The peer score and block propagation dashboard configuration is imported via Kibana import saved object [functionality](https://www.elastic.co/guide/en/kibana/current/managing-saved-objects.html#managing-saved-objects-export-objects).
+
+#### Custom index
+
+By default, the dashboards and index template target `lotus-pubsub` index which is the default one when running node. The index can be customised via edit on dashboard visualizations and also index template needs to be updated to target new index.
diff --git a/tools/kibana/block-propagation-dashboard.ndjson b/tools/kibana/block-propagation-dashboard.ndjson
new file mode 100644
index 000000000..c7b14c0c3
--- /dev/null
+++ b/tools/kibana/block-propagation-dashboard.ndjson
@@ -0,0 +1,2 @@
+{"attributes":{"description":"Force layout vega graph where link force distance between peers is block propagation","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"7.14.1\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":42,\"i\":\"c7e4001d-38c9-4fa0-a488-e069dd50d274\"},\"panelIndex\":\"c7e4001d-38c9-4fa0-a488-e069dd50d274\",\"embeddableConfig\":{\"savedVis\":{\"title\":\"Block propagation\",\"description\":\"\",\"type\":\"vega\",\"params\":{\"spec\":\"{\\n $schema: https://vega.github.io/schema/vega/v5.json\\n title: Node block propagation\\n\\n\\n \\\"signals\\\": [\\n { \\\"name\\\": \\\"cx\\\", \\\"update\\\": \\\"width / 2\\\" },\\n { \\\"name\\\": \\\"cy\\\", \\\"update\\\": \\\"height / 2\\\" },\\n { \\\"name\\\": \\\"nodeRadius\\\", \\\"value\\\": 10,\\n \\\"bind\\\": {\\\"input\\\": \\\"range\\\", \\\"min\\\": 1, \\\"max\\\": 20, \\\"step\\\": 1} },\\n { \\\"name\\\": \\\"propagationMultiplier\\\", \\\"value\\\": 1,\\n \\\"bind\\\": {\\\"input\\\": \\\"range\\\", \\\"min\\\": 1, \\\"max\\\": 100, \\\"step\\\": 1} },\\n ],\\n\\n data: [\\n {\\n \\n name: \\\"node-data\\\",\\n url: {\\n index: lotus-pubsub\\n body: {\\n size: 0,\\n aggs: {\\n unique_peerID: {\\n terms: { \\n field: \\\"peerID\\\",\\n size: 10000\\n },\\n }\\n }\\n }\\n },\\n format: {\\\"property\\\": \\\"aggregations.unique_peerID.buckets\\\"},\\n transform: [\\n {\\n \\\"type\\\": \\\"project\\\",\\n \\\"fields\\\": [\\\"key\\\"],\\n \\\"as\\\": [\\\"peerID\\\"]\\n },\\n {\\n type: \\\"identifier\\\",\\n as: \\\"id\\\"\\n },\\n {\\n type: \\\"formula\\\",\\n expr: \\\"datum.id - 1\\\",\\n as: \\\"index\\\"\\n }\\n ]\\n },\\n {\\n name: \\\"published-message-data\\\",\\n url: {\\n index: lotus-pubsub\\n body: {\\n size: 10000,\\n query: {\\n bool: {\\n must: [\\n {\\n match: {\\n type: 0\\n }\\n }\\n ]\\n }\\n }\\n }\\n },\\n format: {\\\"property\\\": \\\"hits.hits\\\"},\\n },\\n {\\n name: \\\"link-data\\\",\\n url: {\\n index: lotus-pubsub\\n body: {\\n size: 10000,\\n query: {\\n bool: {\\n must: [\\n {\\n match: {\\n type: 1\\n }\\n }\\n ]\\n }\\n }\\n }\\n },\\n format: {\\\"property\\\": \\\"hits.hits\\\"},\\n transform: [\\n {\\n \\\"type\\\": \\\"lookup\\\",\\n \\\"from\\\": \\\"published-message-data\\\",\\n \\\"key\\\": \\\"_source.publishMessage.messageID\\\",\\n \\\"fields\\\": [\\\"_source.deliverMessage.messageID\\\"],\\n \\\"as\\\": [\\\"publishedMessage\\\"],\\n },\\n {\\n \\\"type\\\": \\\"filter\\\",\\n \\\"expr\\\": \\\"datum.publishedMessage != null\\\"\\n },\\n {\\n \\\"type\\\": \\\"lookup\\\",\\n \\\"from\\\": \\\"node-data\\\",\\n \\\"key\\\": \\\"peerID\\\",\\n \\\"fields\\\": [\\\"_source.peerID\\\"],\\n \\\"as\\\": [\\\"source\\\"],\\n },\\n {\\n \\\"type\\\": \\\"lookup\\\",\\n \\\"from\\\": \\\"node-data\\\",\\n \\\"key\\\": \\\"peerID\\\",\\n \\\"fields\\\": [\\\"publishedMessage._source.peerID\\\"],\\n \\\"as\\\": [\\\"target\\\"],\\n },\\n {\\n \\\"type\\\": \\\"formula\\\",\\n \\\"expr\\\": \\\"(datum._source.timestamp - datum.publishedMessage._source.timestamp) * propagationMultiplier\\\",\\n \\\"as\\\": \\\"distance\\\"\\n },\\n {\\n \\\"type\\\": \\\"project\\\",\\n \\\"fields\\\": [\\\"source.index\\\", \\\"target.index\\\", \\\"distance\\\"]\\n \\\"as\\\": [\\\"source\\\", \\\"target\\\", \\\"distance\\\"]\\n },\\n {\\n \\\"type\\\": \\\"aggregate\\\",\\n \\\"ops\\\": [\\\"average\\\"],\\n \\\"fields\\\": [\\\"distance\\\"],\\n \\\"groupby\\\": [\\\"source\\\", \\\"target\\\"],\\n \\\"as\\\": [\\\"distance\\\"]\\n }\\n ]\\n }\\n ]\\n\\n scales: [\\n {\\n \\\"name\\\": \\\"color\\\",\\n \\\"type\\\": \\\"ordinal\\\",\\n \\\"domain\\\": {\\\"data\\\": \\\"node-data\\\", \\\"field\\\": \\\"id\\\"},\\n \\\"range\\\": {\\\"scheme\\\": \\\"category20c\\\"}\\n }\\n ]\\n\\n marks: [\\n {\\n \\\"name\\\": \\\"nodes\\\",\\n \\\"type\\\": \\\"symbol\\\",\\n \\\"zindex\\\": 1,\\n \\n \\\"encode\\\": {\\n \\\"enter\\\": {\\n \\\"fill\\\": {\\\"scale\\\": \\\"color\\\", \\\"field\\\": \\\"id\\\"},\\n \\\"stroke\\\": {\\\"value\\\": \\\"black\\\"},\\n \\\"tooltip\\\": {\\\"signal\\\": \\\"{'PeerID': datum.peerID}\\\"}\\n },\\n \\\"update\\\": {\\n \\\"size\\\": {\\\"signal\\\": \\\"2 * nodeRadius * nodeRadius\\\"},\\n \\\"fill\\\": {\\\"scale\\\": \\\"color\\\", \\\"field\\\": \\\"id\\\"},\\n },\\n \\\"hover\\\": { \\\"fill\\\": {\\\"value\\\": \\\"red\\\"} },\\n },\\n\\n \\\"from\\\": {\\\"data\\\": \\\"node-data\\\"},\\n \\\"transform\\\": [\\n {\\n \\\"type\\\": \\\"force\\\",\\n \\\"restart\\\": false,\\n \\\"static\\\": true,\\n \\\"signal\\\": \\\"force\\\",\\n \\\"forces\\\": [\\n {\\\"force\\\": \\\"link\\\", \\\"links\\\": \\\"link-data\\\", distance: {field: \\\"distance\\\"}},\\n {\\\"force\\\": \\\"center\\\", \\\"x\\\": {\\\"signal\\\": \\\"cx\\\"}, \\\"y\\\": {\\\"signal\\\": \\\"cy\\\"}},\\n ]\\n }\\n ]\\n },\\n {\\n \\\"type\\\": \\\"path\\\",\\n \\\"from\\\": {\\\"data\\\": \\\"link-data\\\"},\\n \\\"encode\\\": {\\n \\\"enter\\\": {\\n \\\"tooltip\\\": {\\\"signal\\\": \\\"{'Block propagation': datum.distance}\\\"}\\n },\\n \\\"update\\\": {\\n \\\"stroke\\\": {\\\"value\\\": \\\"#ccc\\\"},\\n \\\"strokeWidth\\\": {\\\"value\\\": 1.5}\\n },\\n \\\"hover\\\": { \\\"stroke\\\": { \\\"value\\\": \\\"#0B33A0\\\" }}\\n },\\n \\\"transform\\\": [\\n {\\n \\\"type\\\": \\\"linkpath\\\",\\n \\\"require\\\": {\\\"signal\\\": \\\"force\\\"},\\n \\\"shape\\\": \\\"line\\\",\\n \\\"sourceX\\\": \\\"datum.source.x\\\", \\\"sourceY\\\": \\\"datum.source.y\\\",\\n \\\"targetX\\\": \\\"datum.target.x\\\", \\\"targetY\\\": \\\"datum.target.y\\\"\\n }\\n ]\\n }\\n ]\\n}\\n\"},\"uiState\":{},\"data\":{\"aggs\":[],\"searchSource\":{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}}},\"enhancements\":{}}}]","timeRestore":false,"title":"Peer block propagation","version":1},"coreMigrationVersion":"7.14.1","id":"937b1470-212b-11ec-99f4-75d57f0cd0d8","migrationVersion":{"dashboard":"7.14.0"},"references":[],"type":"dashboard","updated_at":"2021-09-29T13:45:58.342Z","version":"Wzg4NzMsMV0="}
+{"excludedObjects":[],"excludedObjectsCount":0,"exportedCount":1,"missingRefCount":0,"missingReferences":[]}
diff --git a/tools/kibana/index-template.json b/tools/kibana/index-template.json
new file mode 100644
index 000000000..f08298ad1
--- /dev/null
+++ b/tools/kibana/index-template.json
@@ -0,0 +1,66 @@
+{
+ "template": {
+ "settings": {},
+ "mappings": {
+ "runtime": {
+ "peerScore.weightedScore": {
+ "type": "double",
+ "script": {
+ "source": "if (doc['type'].value == 100) {\n def score = doc['peerScore.score'].value;\n if (doc['sourceAuth'] == \"\") {\n\n emit(score * 1.2)\n } else {\n emit(score)\n }\n}\n",
+ "lang": "painless"
+ }
+ }
+ },
+ "properties": {
+ "peerScore": {
+ "properties": {
+ "appSpecificScore": {
+ "type": "double"
+ },
+ "behaviourPenalty": {
+ "type": "double"
+ },
+ "ipColocationFactor": {
+ "type": "double"
+ },
+ "score": {
+ "type": "double"
+ },
+ "topics": {
+ "type": "nested",
+ "properties": {
+ "firstMessageDeliveries": {
+ "type": "double",
+ "ignore_malformed": false,
+ "coerce": true
+ },
+ "invalidMessageDeliveries": {
+ "type": "double",
+ "ignore_malformed": false,
+ "coerce": true
+ },
+ "meshMessageDeliveries": {
+ "type": "double",
+ "ignore_malformed": false,
+ "coerce": true
+ },
+ "timeInMesh": {
+ "type": "double",
+ "ignore_malformed": false,
+ "coerce": true
+ },
+ "topic": {
+ "type": "keyword"
+ }
+ }
+ }
+ }
+ },
+ "sourceAuth": {
+ "type": "keyword"
+ }
+ }
+ },
+ "aliases": {}
+ }
+}
diff --git a/tools/kibana/peer-scores-dashboard.ndjson b/tools/kibana/peer-scores-dashboard.ndjson
new file mode 100644
index 000000000..4df376ab3
--- /dev/null
+++ b/tools/kibana/peer-scores-dashboard.ndjson
@@ -0,0 +1,2 @@
+{"attributes":{"description":"Average peer score table per node peerID","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"7.14.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":43,\"i\":\"cddc98a5-45f3-4ba7-a7c6-6b9d216b19da\"},\"panelIndex\":\"cddc98a5-45f3-4ba7-a7c6-6b9d216b19da\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"type\":\"lens\",\"visualizationType\":\"lnsDatatable\",\"state\":{\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"666e2f39-8868-45ad-b747-fe124830b0ae\":{\"columns\":{\"504c50bd-14c1-4119-820e-c961866fc3b4\":{\"label\":\"peerID\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"peerScore.peerID.keyword\",\"isBucketed\":true,\"params\":{\"size\":100,\"orderBy\":{\"type\":\"column\",\"columnId\":\"ec82c5f7-b3c4-4715-8646-a8fe584400fc\"},\"orderDirection\":\"desc\",\"otherBucket\":false,\"missingBucket\":false},\"customLabel\":true},\"ec82c5f7-b3c4-4715-8646-a8fe584400fc\":{\"label\":\"Score\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"peerScore.score\",\"isBucketed\":false,\"scale\":\"ratio\",\"customLabel\":true},\"e22a19e8-1d71-43d6-9ca0-b30ddd423447\":{\"label\":\"Weighted Score\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"peerScore.weightedScore\",\"isBucketed\":false,\"scale\":\"ratio\",\"customLabel\":true}},\"columnOrder\":[\"504c50bd-14c1-4119-820e-c961866fc3b4\",\"ec82c5f7-b3c4-4715-8646-a8fe584400fc\",\"e22a19e8-1d71-43d6-9ca0-b30ddd423447\"],\"incompleteColumns\":{}}}}},\"visualization\":{\"columns\":[{\"isTransposed\":false,\"columnId\":\"504c50bd-14c1-4119-820e-c961866fc3b4\"},{\"isTransposed\":false,\"columnId\":\"ec82c5f7-b3c4-4715-8646-a8fe584400fc\",\"colorMode\":\"cell\",\"palette\":{\"type\":\"palette\",\"name\":\"positive\",\"params\":{\"stops\":[{\"color\":\"#d6e9e4\",\"stop\":20},{\"color\":\"#aed3ca\",\"stop\":40},{\"color\":\"#85bdb1\",\"stop\":60},{\"color\":\"#5aa898\",\"stop\":80},{\"color\":\"#209280\",\"stop\":100}]}}},{\"columnId\":\"e22a19e8-1d71-43d6-9ca0-b30ddd423447\",\"isTransposed\":false,\"colorMode\":\"cell\",\"palette\":{\"type\":\"palette\",\"name\":\"positive\",\"params\":{\"stops\":[{\"color\":\"#d6e9e4\",\"stop\":20},{\"color\":\"#aed3ca\",\"stop\":40},{\"color\":\"#85bdb1\",\"stop\":60},{\"color\":\"#5aa898\",\"stop\":80},{\"color\":\"#209280\",\"stop\":100}]}}}],\"layerId\":\"666e2f39-8868-45ad-b747-fe124830b0ae\"},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[]},\"references\":[{\"type\":\"index-pattern\",\"id\":\"9890c040-17b7-11ec-99f4-75d57f0cd0d8\",\"name\":\"indexpattern-datasource-current-indexpattern\"},{\"type\":\"index-pattern\",\"id\":\"2c407db0-1acb-11ec-99f4-75d57f0cd0d8\",\"name\":\"indexpattern-datasource-layer-666e2f39-8868-45ad-b747-fe124830b0ae\"}]},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Peer Scores\"}]","timeRestore":false,"title":"Peer Scores","version":1},"coreMigrationVersion":"7.14.1","id":"e7e4fd70-1acb-11ec-99f4-75d57f0cd0d8","migrationVersion":{"dashboard":"7.14.0"},"references":[{"id":"2c407db0-1acb-11ec-99f4-75d57f0cd0d8","name":"cddc98a5-45f3-4ba7-a7c6-6b9d216b19da:indexpattern-datasource-current-indexpattern","type":"index-pattern"},{"id":"2c407db0-1acb-11ec-99f4-75d57f0cd0d8","name":"cddc98a5-45f3-4ba7-a7c6-6b9d216b19da:indexpattern-datasource-layer-666e2f39-8868-45ad-b747-fe124830b0ae","type":"index-pattern"}],"type":"dashboard","updated_at":"2021-09-24T12:06:00.625Z","version":"WzczNDgsMV0="}
+{"excludedObjects":[],"excludedObjectsCount":0,"exportedCount":1,"missingRefCount":0,"missingReferences":[]}
diff --git a/tools/packer/etc/motd b/tools/packer/etc/motd
index 5966d972b..892b156e1 100644
--- a/tools/packer/etc/motd
+++ b/tools/packer/etc/motd
@@ -55,10 +55,10 @@ You only need to do this once, after which, you can enable and start the miner.
Do you want to access your lotus daemon remotely? Learn how to setup token authentication
and use client libraries from lotus docs.
-https://docs.filecoin.io/build/lotus/enable-remote-api-access/
+https://lotus.filecoin.io/reference/basics/api-access/
-For more information, see https://docs.filecoin.io/
+For more information, see https://lotus.filecoin.io/
Found a bug? let us know! https://github.com/filecoin-project/lotus
Chat with us on slack! https://filecoinproject.slack.com/archives/CEGN061C5
diff --git a/tools/packer/lotus-snap.pkr.hcl b/tools/packer/lotus-snap.pkr.hcl
index 8ceb743d0..b42272c20 100644
--- a/tools/packer/lotus-snap.pkr.hcl
+++ b/tools/packer/lotus-snap.pkr.hcl
@@ -56,6 +56,11 @@ source "amazon-ebs" "lotus" {
owners = ["099720109477"]
}
ssh_username = "ubuntu"
+
+ aws_polling {
+ delay_seconds = 60
+ max_attempts = 60
+ }
}
source "digitalocean" "lotus" {
@@ -82,3 +87,4 @@ build {
script = "./tools/packer/setup-snap.sh"
}
}
+
diff --git a/tools/packer/setup-snap.sh b/tools/packer/setup-snap.sh
index 3db06e5b4..615877f83 100644
--- a/tools/packer/setup-snap.sh
+++ b/tools/packer/setup-snap.sh
@@ -23,13 +23,11 @@ MANAGED_FILES=(
)
# this is required on digitalocean, which does not have snap seeded correctly at this phase.
-apt update
-apt reinstall snapd
+apt-get -y -o DPkg::Lock::Timeout=3 update \
+ && apt-get -y -o DPkg::Lock::Timeout=3 reinstall snapd
snap install lotus
-snap alias lotus.lotus lotus
-snap alias lotus.lotus-daemon lotus-daemon
snap alias lotus.lotus-miner lotus-miner
snap alias lotus.lotus-worker lotus-worker