From a75010848ee4fc16e329f85a08d56024abd234c8 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 13:07:45 -0400 Subject: [PATCH 1/7] Revert "fix(miner): Do not use pending block for now (#1255)" This reverts commit 9c25a75572f5b7220e55104a7c72652c109f040b. --- eth/polar/api_backend.go | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/eth/polar/api_backend.go b/eth/polar/api_backend.go index 22f86b435..b810b98d7 100644 --- a/eth/polar/api_backend.go +++ b/eth/polar/api_backend.go @@ -243,10 +243,8 @@ func (b *backend) BlockByNumber(_ context.Context, number rpc.BlockNumber) (*typ // Pending block is only known by the miner switch number { case rpc.PendingBlockNumber: - header := b.polar.blockchain.CurrentBlock() - return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - // block := b.polar.miner.PendingBlock() - // return block, nil + block := b.polar.miner.PendingBlock() + return block, nil // Otherwise resolve and return the block case rpc.LatestBlockNumber: header := b.polar.blockchain.CurrentBlock() @@ -309,25 +307,16 @@ func (b *backend) StateAndHeaderByNumber( ctx context.Context, number rpc.BlockNumber, ) (state.StateDB, *types.Header, error) { - var header *types.Header // Pending state is only known by the miner if number == rpc.PendingBlockNumber { - header = b.polar.blockchain.CurrentBlock() - // The above code is returning a block from the blockchain based on the given header - // hash and block - // number. - // return b.polar.blockchain.GetBlock(header.Hash(), header.Number.Uint64()), nil - // block, state := b.polar.miner.Pending() - // return state, block.Header(), nil - } else { - // Otherwise resolve the block number and return its state - var err error - header, err = b.HeaderByNumber(ctx, number) - if err != nil { - return nil, nil, err - } + block, state := b.polar.miner.Pending() + return state, block.Header(), nil + } + // Otherwise resolve the block number and return its state + header, err := b.HeaderByNumber(ctx, number) + if err != nil { + return nil, nil, err } - if header == nil { // to match Geth return nil, nil, core.ErrBlockNotFound From 082f37bc5f5a166c3f3de6a7218e09effb0bf631 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 13:19:16 -0400 Subject: [PATCH 2/7] fix nil deference on rpc nodes --- Makefile | 2 +- eth/polar/api_backend.go | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index d1fba61df..97784fa4d 100644 --- a/Makefile +++ b/Makefile @@ -125,7 +125,7 @@ generate: @$(MAKE) abigen-install moq-install mockery @for module in $(MODULES); do \ echo "Running go generate in $$module"; \ - (cd $$module && go generate ./...) || exit 1; \ + (cd $$module && go g`enerate ./...) || exit 1; \ done abigen-install: diff --git a/eth/polar/api_backend.go b/eth/polar/api_backend.go index b810b98d7..97ae4a33c 100644 --- a/eth/polar/api_backend.go +++ b/eth/polar/api_backend.go @@ -194,11 +194,11 @@ func (b *backend) HeaderByNumber( switch number { case rpc.PendingBlockNumber: // TODO: handle "miner" stuff, Pending block is only known by the miner - // block := b.eth.miner.PendingBlock() - // TODO: this may be hiding a larger issue with the timing of the NewHead channel stuff. - // Investigate and hopefully remove this GTE. - header := b.polar.blockchain.CurrentHeader() - return header, nil + block := b.polar.miner.PendingBlock() + if block == nil { + return nil, nil //nolint:nilnil // it's ok. + } + return block.Header(), nil case rpc.LatestBlockNumber: return b.polar.blockchain.CurrentHeader(), nil case rpc.FinalizedBlockNumber: @@ -310,6 +310,9 @@ func (b *backend) StateAndHeaderByNumber( // Pending state is only known by the miner if number == rpc.PendingBlockNumber { block, state := b.polar.miner.Pending() + if block == nil { + return nil, nil, nil + } return state, block.Header(), nil } // Otherwise resolve the block number and return its state From 5392e1efc7b971e32a3b0b8b68d2b375e28fa8d1 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 13:31:09 -0400 Subject: [PATCH 3/7] move build folder --- Makefile | 422 +----------------- {scripts => build/scripts}/constants.mk | 0 {scripts => build/scripts}/cosmos.mk | 2 +- build/scripts/main.mk | 422 ++++++++++++++++++ {scripts => build/scripts}/proto_generate.sh | 4 +- .../scripts}/proto_generate_pulsar.sh | 0 {tools => build/tools}/LICENSE | 0 {tools => build/tools}/LICENSE.header | 0 {tools => build/tools}/go.mod | 2 +- {tools => build/tools}/go.sum | 0 {tools => build/tools}/tools.go | 0 go.work | 2 +- 12 files changed, 428 insertions(+), 426 deletions(-) rename {scripts => build/scripts}/constants.mk (100%) rename {scripts => build/scripts}/cosmos.mk (98%) create mode 100644 build/scripts/main.mk rename {scripts => build/scripts}/proto_generate.sh (95%) rename {scripts => build/scripts}/proto_generate_pulsar.sh (100%) rename {tools => build/tools}/LICENSE (100%) rename {tools => build/tools}/LICENSE.header (100%) rename {tools => build/tools}/go.mod (99%) rename {tools => build/tools}/go.sum (100%) rename {tools => build/tools}/tools.go (100%) diff --git a/Makefile b/Makefile index 97784fa4d..6126604eb 100644 --- a/Makefile +++ b/Makefile @@ -1,422 +1,2 @@ #!/usr/bin/make -f -include scripts/cosmos.mk scripts/constants.mk - - -# Specify the default target if none is provided -.DEFAULT_GOAL := build - -############################################################################### -### Build ### -############################################################################### - -BUILD_TARGETS := build install - -build: BUILD_ARGS=-o $(OUT_DIR)/ - -build-linux-amd64: - GOOS=linux GOARCH=amd64 LEDGER_ENABLED=false $(MAKE) build - -build-linux-arm64: - GOOS=linux GOARCH=arm64 LEDGER_ENABLED=false $(MAKE) build - -$(BUILD_TARGETS): forge-build sync $(OUT_DIR)/ - @echo "Building ${TESTAPP_DIR}" - @cd ${CURRENT_DIR}/$(TESTAPP_DIR) && go $@ -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... - -$(OUT_DIR)/: - mkdir -p $(OUT_DIR)/ - -build-clean: - @$(MAKE) clean build - -clean: - @rm -rf .tmp/ - @rm -rf $(OUT_DIR) - @$(MAKE) forge-clean - -################# -# forge # -################# - -forge-build: | - @forge build --extra-output-files bin --extra-output-files abi --root $(CONTRACTS_DIR) - -forge-clean: | - @forge clean --root $(CONTRACTS_DIR) - - -################# -# proto # -################# - -protoImageName := "ghcr.io/cosmos/proto-builder" -protoImageVersion := "0.14.0" - -proto: - @$(MAKE) buf-lint-fix buf-lint proto-build - -proto-build: - @docker run --rm -v ${CURRENT_DIR}:/workspace --workdir /workspace $(protoImageName):$(protoImageVersion) sh ./scripts/proto_generate.sh - -############################################################################### -### Docker ### -############################################################################### - -# Variables -DOCKER_TYPE ?= base -ARCH ?= arm64 -GO_VERSION ?= 1.21.3 -IMAGE_NAME ?= polard -IMAGE_VERSION ?= v0.0.0 -BASE_IMAGE ?= polard/base:$(IMAGE_VERSION) - -# Docker Paths -BASE_DOCKER_PATH = ./e2e/testapp/docker -EXEC_DOCKER_PATH = $(BASE_DOCKER_PATH)/base.Dockerfile -LOCAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/local/Dockerfile -SEED_DOCKER_PATH = $(BASE_DOCKER_PATH)/seed/Dockerfile -VAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/validator/Dockerfile -LOCALNET_CLIENT_PATH = ./e2e/precompile/polard -LOCALNET_DOCKER_PATH = $(LOCALNET_CLIENT_PATH)/Dockerfile - -# Image Build -docker-build: - @echo "Build a release docker image for the Cosmos SDK chain..." - @$(MAKE) docker-build-$(DOCKER_TYPE) - -# Docker Build Types -docker-build-base: - $(call docker-build-helper,$(EXEC_DOCKER_PATH),base) - -docker-build-local: - $(call docker-build-helper,$(LOCAL_DOCKER_PATH),local,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -docker-build-seed: - $(call docker-build-helper,$(SEED_DOCKER_PATH),seed,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -docker-build-validator: - $(call docker-build-helper,$(VAL_DOCKER_PATH),validator,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -docker-build-localnet: - $(call docker-build-helper,$(LOCALNET_DOCKER_PATH),localnet,--build-arg BASE_IMAGE=$(BASE_IMAGE)) - -# Docker Build Function -define docker-build-helper - docker build \ - --build-arg GO_VERSION=$(GO_VERSION) \ - --platform linux/$(ARCH) \ - --build-arg PRECOMPILE_CONTRACTS_DIR=$(CONTRACTS_DIR) \ - --build-arg GOOS=linux \ - --build-arg GOARCH=$(ARCH) \ - -f $(1) \ - -t $(IMAGE_NAME)/$(2):$(IMAGE_VERSION) \ - $(if $(3),$(3)) \ - . - -endef - -.PHONY: docker-build-localnet - -############################################################################### -### CodeGen ### -############################################################################### - -generate: - @$(MAKE) abigen-install moq-install mockery - @for module in $(MODULES); do \ - echo "Running go generate in $$module"; \ - (cd $$module && go g`enerate ./...) || exit 1; \ - done - -abigen-install: - @echo "--> Installing abigen" - @go install github.com/ethereum/go-ethereum/cmd/abigen@latest - -moq-install: - @echo "--> Installing moq" - @go install github.com/matryer/moq@latest - -mockery-install: - @echo "--> Installing mockery" - @go install github.com/vektra/mockery/v2@latest - -mockery: - @$(MAKE) mockery-install - @echo "Running mockery..." - @mockery - - -############################################################################### -### Tests & Simulation ### -############################################################################### - -################# -# polard # -################# - -start: - @./e2e/testapp/entrypoint.sh - -################# -# unit # -################# - -install-ginkgo: - @echo "Installing ginkgo..." - @go install github.com/onsi/ginkgo/v2/ginkgo@latest - -test-unit: - @$(MAKE) install-ginkgo forge-test - @echo "Running unit tests..." - @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... - -test-unit-race: - @$(MAKE) install-ginkgo forge-test - @echo "Running unit tests with race detection..." - @ginkgo --race -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... - -test-unit-cover: - @$(MAKE) install-ginkgo forge-test - @echo "Running unit tests with coverage..." - @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* \ - --junit-report out.xml --cover --coverprofile "coverage-test-unit-cover.txt" --covermode atomic \ - ./... - -################# -# forge # -################# - -forge-test: - @echo "Running forge test..." - @forge test --root $(CONTRACTS_DIR) - -################# -# e2e # -################# - -test-e2e: - @$(MAKE) test-e2e-no-build - -test-e2e-no-build: - @$(MAKE) install-ginkgo - @echo "Running e2e tests..." - @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/precompile/... - - -################# -# hive # -################# - -ifndef $(GOPATH) - GOPATH=$(shell go env GOPATH) - export GOPATH -endif - -HIVE_CLONE := $(GOPATH)/src -CLONE_PATH := $(HIVE_CLONE)/.hive-e2e -SIMULATORS_ROOT := $(CLONE_PATH)/simulators -SIMULATORS_PATH := $(SIMULATORS_ROOT)/polaris/ -BASE_HIVE_DOCKER_PATH := ./e2e/hive -CLIENTS_PATH := $(CLONE_PATH)/clients/polard/ -SIMULATIONS := \ - rpc:init/genesis.json:ethclient.hive \ - rpc-compat:Dockerfile:tests \ - -# .PHONY: setup test testv view - -hive-setup: - @echo $(HIVE_CLONE) - @echo "--> Setting up Hive testing environment..." - @test ! -d $(HIVE_CLONE) && mkdir $(HIVE_CLONE) || true - @rm -rf $(CLONE_PATH) - @git clone https://github.com/ethereum/hive $(CLONE_PATH) --depth=1 - @mkdir $(SIMULATORS_PATH) - @cp -rf $(BASE_HIVE_DOCKER_PATH)/clients/polard $(CLIENTS_PATH) - @echo "Copying files..."; - @$(foreach sim,$(SIMULATIONS), \ - $(eval SIM_NAME = $(word 1, $(subst :, ,$(sim)))) \ - $(eval FILES = $(wordlist 2, $(words $(subst :, ,$(sim))), $(subst :, ,$(sim)))) \ - cp -rf $(SIMULATORS_ROOT)/ethereum/$(SIM_NAME) $(SIMULATORS_PATH); \ - $(foreach file,$(FILES), \ - cp -rf $(BASE_HIVE_DOCKER_PATH)/simulators/$(SIM_NAME)/$(file) \ - $(SIMULATORS_PATH)/$(SIM_NAME)/$(file); \ - if [ "$(file)" = "ethclient.hive" ]; then \ - cp -rf $(SIMULATORS_PATH)/$(SIM_NAME)/$(file) $(SIMULATORS_PATH)/$(SIM_NAME)/ethclient.go; \ - fi; \ - ) \ - ) - @cd $(CLONE_PATH) && go install ./... - -hive-view: - @cd $(CLONE_PATH) && \ - go build ./cmd/hiveview && \ - hiveview --serve - -# SHELL := /bin/zsh # Explicitly set to zsh as that is what you are using - -test-hive: - @cd $(CLONE_PATH) && \ - hive --sim polaris/rpc -client polard - -test-hive-v: - @cd $(CLONE_PATH) && \ - hive --sim polaris/rpc -client polard --docker.output - - - -################# -# localnet # -################# - -test-localnet: - @$(MAKE) test-localnet-no-build - -test-localnet-no-build: - @$(MAKE) install-ginkgo - @echo "Running localnet tests..." - @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/localnet/... - - -############################################################################### -### Formatting ### -############################################################################### - -############################################################################### -### Linting ### -############################################################################### - -format: - @$(MAKE) license-fix buf-lint-fix forge-lint-fix golangci-fix - -lint: - @$(MAKE) license buf-lint forge-lint golangci gosec - - -################# -# forge # -################# - -forge-lint-fix: - @echo "--> Running forge fmt" - @cd $(CONTRACTS_DIR) && forge fmt - -forge-lint: - @echo "--> Running forge lint" - @cd $(CONTRACTS_DIR) && forge fmt --check - -################# -# golangci-lint # -################# - -golangci_version=v1.54.2 - -golangci-install: - @echo "--> Installing golangci-lint $(golangci_version)" - @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(golangci_version) - -golangci: - @$(MAKE) golangci-install - @echo "--> Running linter" - @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --concurrency 8 -v - -golangci-fix: - @$(MAKE) golangci-install - @echo "--> Running linter" - @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --fix --concurrency 8 -v - - -################# -# license # -################# - -license-install: - @echo "--> Installing google/addlicense" - @go install github.com/google/addlicense - -license: - @$(MAKE) license-install - @echo "--> Running addlicense with -check" - @for module in $(MODULES); do \ - (cd $$module && addlicense -check -v -f ./LICENSE.header ./.) || exit 1; \ - done - -license-fix: - @$(MAKE) license-install - @echo "--> Running addlicense" - @for module in $(MODULES); do \ - (cd $$module && addlicense -v -f ./LICENSE.header ./.) || exit 1; \ - done - - -################# -# gosec # -################# - -gosec-install: - @echo "--> Installing gosec" - @go install github.com/securego/gosec/v2/cmd/gosec - -gosec: - @$(MAKE) gosec-install - @echo "--> Running gosec" - @gosec -exclude-generated ./... - - -################# -# proto # -################# - -protoDir := "proto" - -buf-install: - @echo "--> Installing buf" - @go install github.com/bufbuild/buf/cmd/buf - -buf-lint-fix: - @$(MAKE) buf-install - @echo "--> Running buf format" - @buf format -w --error-format=json $(protoDir) - -buf-lint: - @$(MAKE) buf-install - @echo "--> Running buf lint" - @buf lint --error-format=json $(protoDir) - - -############################################################################### -### Dependencies ### -############################################################################### - -sync: | - @for module in $(MODULES); do \ - echo "Running go mod download in $$module"; \ - (cd $$module && go mod download) || exit 1; \ - done - @echo "Running go mod sync" - @go work sync - -tidy: | - @for module in $(MODULES); do \ - echo "Running go mod tidy in $$module"; \ - (cd $$module && go mod tidy) || exit 1; \ - done - -repo-rinse: | - git clean -xfd - git submodule foreach --recursive git clean -xfd - git submodule foreach --recursive git reset --hard - git submodule update --init --recursive - - -.PHONY: build build-linux-amd64 build-linux-arm64 \ - $(BUILD_TARGETS) $(OUT_DIR)/ build-clean clean \ - forge-build forge-clean proto proto-build docker-build \ - docker-build-base docker-build-local docker-build-seed \ - docker-build-validator docker-build-localnet generate \ - abigen-install moq-install mockery-install mockery \ - start test-unit test-unit-race test-unit-cover forge-test \ - test-e2e test-e2e-no-build hive-setup hive-view test-hive \ - test-hive-v test-localnet test-localnet-no-build format lint \ - forge-lint-fix forge-lint golangci-install golangci golangci-fix \ - license-install license license-fix \ - gosec-install gosec buf-install buf-lint-fix buf-lint sync tidy repo-rinse +include build/scripts/main.mk diff --git a/scripts/constants.mk b/build/scripts/constants.mk similarity index 100% rename from scripts/constants.mk rename to build/scripts/constants.mk diff --git a/scripts/cosmos.mk b/build/scripts/cosmos.mk similarity index 98% rename from scripts/cosmos.mk rename to build/scripts/cosmos.mk index cdb2e41d6..1e12fa75a 100644 --- a/scripts/cosmos.mk +++ b/build/scripts/cosmos.mk @@ -8,7 +8,7 @@ export VERSION := $(shell echo $(shell git describe --tags --always --match "v*") | sed 's/^v//') export COMMIT := $(shell git log -1 --format='%H') CURRENT_DIR = $(shell pwd) -OUT_DIR ?= $(CURDIR)/bin +OUT_DIR ?= $(CURDIR)/build/bin BINDIR ?= $(GOPATH)/bin TESTAPP_DIR = ./e2e/testapp PROJECT_NAME = $(shell git remote get-url origin | xargs basename -s .git) diff --git a/build/scripts/main.mk b/build/scripts/main.mk new file mode 100644 index 000000000..640e8d73d --- /dev/null +++ b/build/scripts/main.mk @@ -0,0 +1,422 @@ +#!/usr/bin/make -f +include build/scripts/cosmos.mk build/scripts/constants.mk + + +# Specify the default target if none is provided +.DEFAULT_GOAL := build + +############################################################################### +### Build ### +############################################################################### + +BUILD_TARGETS := build install + +build: BUILD_ARGS=-o $(OUT_DIR)/ + +build-linux-amd64: + GOOS=linux GOARCH=amd64 LEDGER_ENABLED=false $(MAKE) build + +build-linux-arm64: + GOOS=linux GOARCH=arm64 LEDGER_ENABLED=false $(MAKE) build + +$(BUILD_TARGETS): forge-build sync $(OUT_DIR)/ + @echo "Building ${TESTAPP_DIR}" + @cd ${CURRENT_DIR}/$(TESTAPP_DIR) && go $@ -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... + +$(OUT_DIR)/: + mkdir -p $(OUT_DIR)/ + +build-clean: + @$(MAKE) clean build + +clean: + @rm -rf .tmp/ + @rm -rf $(OUT_DIR) + @$(MAKE) forge-clean + +################# +# forge # +################# + +forge-build: | + @forge build --extra-output-files bin --extra-output-files abi --root $(CONTRACTS_DIR) + +forge-clean: | + @forge clean --root $(CONTRACTS_DIR) + + +################# +# proto # +################# + +protoImageName := "ghcr.io/cosmos/proto-builder" +protoImageVersion := "0.14.0" + +proto: + @$(MAKE) buf-lint-fix buf-lint proto-build + +proto-build: + @docker run --rm -v ${CURRENT_DIR}:/workspace --workdir /workspace $(protoImageName):$(protoImageVersion) sh ./build/scripts/proto_generate.sh + +############################################################################### +### Docker ### +############################################################################### + +# Variables +DOCKER_TYPE ?= base +ARCH ?= arm64 +GO_VERSION ?= 1.21.3 +IMAGE_NAME ?= polard +IMAGE_VERSION ?= v0.0.0 +BASE_IMAGE ?= polard/base:$(IMAGE_VERSION) + +# Docker Paths +BASE_DOCKER_PATH = ./e2e/testapp/docker +EXEC_DOCKER_PATH = $(BASE_DOCKER_PATH)/base.Dockerfile +LOCAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/local/Dockerfile +SEED_DOCKER_PATH = $(BASE_DOCKER_PATH)/seed/Dockerfile +VAL_DOCKER_PATH = $(BASE_DOCKER_PATH)/validator/Dockerfile +LOCALNET_CLIENT_PATH = ./e2e/precompile/polard +LOCALNET_DOCKER_PATH = $(LOCALNET_CLIENT_PATH)/Dockerfile + +# Image Build +docker-build: + @echo "Build a release docker image for the Cosmos SDK chain..." + @$(MAKE) docker-build-$(DOCKER_TYPE) + +# Docker Build Types +docker-build-base: + $(call docker-build-helper,$(EXEC_DOCKER_PATH),base) + +docker-build-local: + $(call docker-build-helper,$(LOCAL_DOCKER_PATH),local,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-seed: + $(call docker-build-helper,$(SEED_DOCKER_PATH),seed,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-validator: + $(call docker-build-helper,$(VAL_DOCKER_PATH),validator,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +docker-build-localnet: + $(call docker-build-helper,$(LOCALNET_DOCKER_PATH),localnet,--build-arg BASE_IMAGE=$(BASE_IMAGE)) + +# Docker Build Function +define docker-build-helper + docker build \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --platform linux/$(ARCH) \ + --build-arg PRECOMPILE_CONTRACTS_DIR=$(CONTRACTS_DIR) \ + --build-arg GOOS=linux \ + --build-arg GOARCH=$(ARCH) \ + -f $(1) \ + -t $(IMAGE_NAME)/$(2):$(IMAGE_VERSION) \ + $(if $(3),$(3)) \ + . + +endef + +.PHONY: docker-build-localnet + +############################################################################### +### CodeGen ### +############################################################################### + +generate: + @$(MAKE) abigen-install moq-install mockery + @for module in $(MODULES); do \ + echo "Running go generate in $$module"; \ + (cd $$module && go g`enerate ./...) || exit 1; \ + done + +abigen-install: + @echo "--> Installing abigen" + @go install github.com/ethereum/go-ethereum/cmd/abigen@latest + +moq-install: + @echo "--> Installing moq" + @go install github.com/matryer/moq@latest + +mockery-install: + @echo "--> Installing mockery" + @go install github.com/vektra/mockery/v2@latest + +mockery: + @$(MAKE) mockery-install + @echo "Running mockery..." + @mockery + + +############################################################################### +### Tests & Simulation ### +############################################################################### + +################# +# polard # +################# + +start: + @./e2e/testapp/entrypoint.sh + +################# +# unit # +################# + +install-ginkgo: + @echo "Installing ginkgo..." + @go install github.com/onsi/ginkgo/v2/ginkgo@latest + +test-unit: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... + +test-unit-race: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests with race detection..." + @ginkgo --race -r --randomize-all --fail-on-pending -trace --skip .*e2e* ./... + +test-unit-cover: + @$(MAKE) install-ginkgo forge-test + @echo "Running unit tests with coverage..." + @ginkgo -r --randomize-all --fail-on-pending -trace --skip .*e2e* \ + --junit-report out.xml --cover --coverprofile "coverage-test-unit-cover.txt" --covermode atomic \ + ./... + +################# +# forge # +################# + +forge-test: + @echo "Running forge test..." + @forge test --root $(CONTRACTS_DIR) + +################# +# e2e # +################# + +test-e2e: + @$(MAKE) test-e2e-no-build + +test-e2e-no-build: + @$(MAKE) install-ginkgo + @echo "Running e2e tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/precompile/... + + +################# +# hive # +################# + +ifndef $(GOPATH) + GOPATH=$(shell go env GOPATH) + export GOPATH +endif + +HIVE_CLONE := $(GOPATH)/src +CLONE_PATH := $(HIVE_CLONE)/.hive-e2e +SIMULATORS_ROOT := $(CLONE_PATH)/simulators +SIMULATORS_PATH := $(SIMULATORS_ROOT)/polaris/ +BASE_HIVE_DOCKER_PATH := ./e2e/hive +CLIENTS_PATH := $(CLONE_PATH)/clients/polard/ +SIMULATIONS := \ + rpc:init/genesis.json:ethclient.hive \ + rpc-compat:Dockerfile:tests \ + +# .PHONY: setup test testv view + +hive-setup: + @echo $(HIVE_CLONE) + @echo "--> Setting up Hive testing environment..." + @test ! -d $(HIVE_CLONE) && mkdir $(HIVE_CLONE) || true + @rm -rf $(CLONE_PATH) + @git clone https://github.com/ethereum/hive $(CLONE_PATH) --depth=1 + @mkdir $(SIMULATORS_PATH) + @cp -rf $(BASE_HIVE_DOCKER_PATH)/clients/polard $(CLIENTS_PATH) + @echo "Copying files..."; + @$(foreach sim,$(SIMULATIONS), \ + $(eval SIM_NAME = $(word 1, $(subst :, ,$(sim)))) \ + $(eval FILES = $(wordlist 2, $(words $(subst :, ,$(sim))), $(subst :, ,$(sim)))) \ + cp -rf $(SIMULATORS_ROOT)/ethereum/$(SIM_NAME) $(SIMULATORS_PATH); \ + $(foreach file,$(FILES), \ + cp -rf $(BASE_HIVE_DOCKER_PATH)/simulators/$(SIM_NAME)/$(file) \ + $(SIMULATORS_PATH)/$(SIM_NAME)/$(file); \ + if [ "$(file)" = "ethclient.hive" ]; then \ + cp -rf $(SIMULATORS_PATH)/$(SIM_NAME)/$(file) $(SIMULATORS_PATH)/$(SIM_NAME)/ethclient.go; \ + fi; \ + ) \ + ) + @cd $(CLONE_PATH) && go install ./... + +hive-view: + @cd $(CLONE_PATH) && \ + go build ./cmd/hiveview && \ + hiveview --serve + +# SHELL := /bin/zsh # Explicitly set to zsh as that is what you are using + +test-hive: + @cd $(CLONE_PATH) && \ + hive --sim polaris/rpc -client polard + +test-hive-v: + @cd $(CLONE_PATH) && \ + hive --sim polaris/rpc -client polard --docker.output + + + +################# +# localnet # +################# + +test-localnet: + @$(MAKE) test-localnet-no-build + +test-localnet-no-build: + @$(MAKE) install-ginkgo + @echo "Running localnet tests..." + @ginkgo -r --randomize-all --fail-on-pending -trace -timeout 30m ./e2e/localnet/... + + +############################################################################### +### Formatting ### +############################################################################### + +############################################################################### +### Linting ### +############################################################################### + +format: + @$(MAKE) license-fix buf-lint-fix forge-lint-fix golangci-fix + +lint: + @$(MAKE) license buf-lint forge-lint golangci gosec + + +################# +# forge # +################# + +forge-lint-fix: + @echo "--> Running forge fmt" + @cd $(CONTRACTS_DIR) && forge fmt + +forge-lint: + @echo "--> Running forge lint" + @cd $(CONTRACTS_DIR) && forge fmt --check + +################# +# golangci-lint # +################# + +golangci_version=v1.54.2 + +golangci-install: + @echo "--> Installing golangci-lint $(golangci_version)" + @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(golangci_version) + +golangci: + @$(MAKE) golangci-install + @echo "--> Running linter" + @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --concurrency 8 -v + +golangci-fix: + @$(MAKE) golangci-install + @echo "--> Running linter" + @go list -f '{{.Dir}}/...' -m | xargs golangci-lint run --timeout=10m --fix --concurrency 8 -v + + +################# +# license # +################# + +license-install: + @echo "--> Installing google/addlicense" + @go install github.com/google/addlicense + +license: + @$(MAKE) license-install + @echo "--> Running addlicense with -check" + @for module in $(MODULES); do \ + (cd $$module && addlicense -check -v -f ./LICENSE.header ./.) || exit 1; \ + done + +license-fix: + @$(MAKE) license-install + @echo "--> Running addlicense" + @for module in $(MODULES); do \ + (cd $$module && addlicense -v -f ./LICENSE.header ./.) || exit 1; \ + done + + +################# +# gosec # +################# + +gosec-install: + @echo "--> Installing gosec" + @go install github.com/securego/gosec/v2/cmd/gosec + +gosec: + @$(MAKE) gosec-install + @echo "--> Running gosec" + @gosec -exclude-generated ./... + + +################# +# proto # +################# + +protoDir := "proto" + +buf-install: + @echo "--> Installing buf" + @go install github.com/bufbuild/buf/cmd/buf + +buf-lint-fix: + @$(MAKE) buf-install + @echo "--> Running buf format" + @buf format -w --error-format=json $(protoDir) + +buf-lint: + @$(MAKE) buf-install + @echo "--> Running buf lint" + @buf lint --error-format=json $(protoDir) + + +############################################################################### +### Dependencies ### +############################################################################### + +sync: | + @for module in $(MODULES); do \ + echo "Running go mod download in $$module"; \ + (cd $$module && go mod download) || exit 1; \ + done + @echo "Running go mod sync" + @go work sync + +tidy: | + @for module in $(MODULES); do \ + echo "Running go mod tidy in $$module"; \ + (cd $$module && go mod tidy) || exit 1; \ + done + +repo-rinse: | + git clean -xfd + git submodule foreach --recursive git clean -xfd + git submodule foreach --recursive git reset --hard + git submodule update --init --recursive + + +.PHONY: build build-linux-amd64 build-linux-arm64 \ + $(BUILD_TARGETS) $(OUT_DIR)/ build-clean clean \ + forge-build forge-clean proto proto-build docker-build \ + docker-build-base docker-build-local docker-build-seed \ + docker-build-validator docker-build-localnet generate \ + abigen-install moq-install mockery-install mockery \ + start test-unit test-unit-race test-unit-cover forge-test \ + test-e2e test-e2e-no-build hive-setup hive-view test-hive \ + test-hive-v test-localnet test-localnet-no-build format lint \ + forge-lint-fix forge-lint golangci-install golangci golangci-fix \ + license-install license license-fix \ + gosec-install gosec buf-install buf-lint-fix buf-lint sync tidy repo-rinse diff --git a/scripts/proto_generate.sh b/build/scripts/proto_generate.sh similarity index 95% rename from scripts/proto_generate.sh rename to build/scripts/proto_generate.sh index 3a91413c5..e6bedc295 100755 --- a/scripts/proto_generate.sh +++ b/build/scripts/proto_generate.sh @@ -24,7 +24,7 @@ # How to run manually: # docker build --pull --rm -f "contrib/devtools/Dockerfile" -t cosmossdk-proto:latest "contrib/devtools" -# docker run --rm -v $(pwd):/workspace --workdir /workspace cosmossdk-proto sh ./scripts/protocgen.sh +# docker run --rm -v $(pwd):/workspace --workdir /workspace cosmossdk-proto sh ./build/scripts/protocgen.sh set -e @@ -49,4 +49,4 @@ rm -rf pkg.berachain.dev cd ../ -./scripts/proto_generate_pulsar.sh \ No newline at end of file +./build/scripts/proto_generate_pulsar.sh \ No newline at end of file diff --git a/scripts/proto_generate_pulsar.sh b/build/scripts/proto_generate_pulsar.sh similarity index 100% rename from scripts/proto_generate_pulsar.sh rename to build/scripts/proto_generate_pulsar.sh diff --git a/tools/LICENSE b/build/tools/LICENSE similarity index 100% rename from tools/LICENSE rename to build/tools/LICENSE diff --git a/tools/LICENSE.header b/build/tools/LICENSE.header similarity index 100% rename from tools/LICENSE.header rename to build/tools/LICENSE.header diff --git a/tools/go.mod b/build/tools/go.mod similarity index 99% rename from tools/go.mod rename to build/tools/go.mod index 4bb3abd29..ec12e9ebe 100644 --- a/tools/go.mod +++ b/build/tools/go.mod @@ -1,4 +1,4 @@ -module pkg.berachain.dev/polaris/tools +module pkg.berachain.dev/polaris/build/tools go 1.21 diff --git a/tools/go.sum b/build/tools/go.sum similarity index 100% rename from tools/go.sum rename to build/tools/go.sum diff --git a/tools/tools.go b/build/tools/tools.go similarity index 100% rename from tools/tools.go rename to build/tools/tools.go diff --git a/go.work b/go.work index c84f98fae..a1ad444e0 100644 --- a/go.work +++ b/go.work @@ -1,6 +1,7 @@ go 1.21 use ( + ./build/tools ./contracts ./cosmos ./e2e/localnet @@ -8,5 +9,4 @@ use ( ./e2e/testapp ./eth ./lib - ./tools ) From 315f05d30fd37aaba875c5620c97841ebed8c4b5 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 13:31:46 -0400 Subject: [PATCH 4/7] update path --- e2e/precompile/polard/start-node.sh | 10 ++++----- e2e/testapp/docker/local/docker-init.sh | 10 ++++----- e2e/testapp/entrypoint.sh | 30 ++++++++++++------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/e2e/precompile/polard/start-node.sh b/e2e/precompile/polard/start-node.sh index 2bb37aa1e..3ece948c6 100755 --- a/e2e/precompile/polard/start-node.sh +++ b/e2e/precompile/polard/start-node.sh @@ -30,7 +30,7 @@ MONIKER="localtestnet" KEYRING="test" KEYALGO="secp256k1" LOGLEVEL="info" -# Set dedicated home directory for the ./bin/polard instance +# Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="/" # to trace evm #TRACE="--trace" @@ -99,11 +99,11 @@ jq '.app_state["evm"]["alloc"]["acc1319Fe722A198F395F0164066ED4E309439Bf"]["bala # Sign genesis transaction polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" ## In case you want to create multiple validators at genesis -## 1. Back to `./bin/polard keys add` step, init more keys -## 2. Back to `./bin/polard add-genesis-account` step, add balance for those -## 3. Clone this ~/../bin/polard home directory into some others, let's say `~/.cloned./bin/polard` +## 1. Back to `./build/bin/polard keys add` step, init more keys +## 2. Back to `./build/bin/polard add-genesis-account` step, add balance for those +## 3. Clone this ~/../build/bin/polard home directory into some others, let's say `~/.cloned./build/bin/polard` ## 4. Run `gentx` in each of those folders -## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` +## 5. Copy the `gentx-*` folders under `~/.cloned./build/bin/polard/config/gentx/` folders into the original `~/../build/bin/polard/config/gentx` # Collect genesis tx polard genesis collect-gentxs --home "$HOMEDIR" diff --git a/e2e/testapp/docker/local/docker-init.sh b/e2e/testapp/docker/local/docker-init.sh index e79ee85d8..f0e43f975 100644 --- a/e2e/testapp/docker/local/docker-init.sh +++ b/e2e/testapp/docker/local/docker-init.sh @@ -31,7 +31,7 @@ MONIKER="localtestnet" KEYRING="test" KEYALGO="secp256k1" LOGLEVEL="info" -# Set dedicated home directory for the ./bin/polard instance +# Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="/" # to trace evm #TRACE="--trace" @@ -82,11 +82,11 @@ polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl # Sign genesis transaction polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" ## In case you want to create multiple validators at genesis -## 1. Back to `./bin/polard keys add` step, init more keys -## 2. Back to `./bin/polard add-genesis-account` step, add balance for those -## 3. Clone this ~/../bin/polard home directory into some others, let's say `~/.cloned./bin/polard` +## 1. Back to `./build/bin/polard keys add` step, init more keys +## 2. Back to `./build/bin/polard add-genesis-account` step, add balance for those +## 3. Clone this ~/../build/bin/polard home directory into some others, let's say `~/.cloned./build/bin/polard` ## 4. Run `gentx` in each of those folders -## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` +## 5. Copy the `gentx-*` folders under `~/.cloned./build/bin/polard/config/gentx/` folders into the original `~/../build/bin/polard/config/gentx` # Collect genesis tx polard genesis collect-gentxs --home "$HOMEDIR" diff --git a/e2e/testapp/entrypoint.sh b/e2e/testapp/entrypoint.sh index f447a7eba..a5a4eea0a 100755 --- a/e2e/testapp/entrypoint.sh +++ b/e2e/testapp/entrypoint.sh @@ -30,7 +30,7 @@ MONIKER="localtestnet" KEYRING="test" KEYALGO="secp256k1" LOGLEVEL="info" -# Set dedicated home directory for the ./bin/polard instance +# Set dedicated home directory for the ./build/bin/polard instance HOMEDIR="./.tmp/polard" # to trace evm #TRACE="--trace" @@ -64,15 +64,15 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then rm -rf "$HOMEDIR" # # Set moniker and chain-id (Moniker can be anything, chain-id must be an integer) - ./bin/polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" + ./build/bin/polard init $MONIKER -o --chain-id $CHAINID --home "$HOMEDIR" # Set client config - ./bin/polard config set client keyring-backend $KEYRING --home "$HOMEDIR" - ./bin/polard config set client chain-id "$CHAINID" --home "$HOMEDIR" + ./build/bin/polard config set client keyring-backend $KEYRING --home "$HOMEDIR" + ./build/bin/polard config set client chain-id "$CHAINID" --home "$HOMEDIR" # If keys exist they should be deleted for KEY in "${KEYS[@]}"; do - ./bin/polard keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" + ./build/bin/polard keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO --home "$HOMEDIR" done # Change parameter token denominations to abera @@ -84,28 +84,28 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then # Allocate genesis accounts (cosmos formatted addresses) for KEY in "${KEYS[@]}"; do - ./bin/polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + ./build/bin/polard genesis add-genesis-account $KEY 100000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" done # Test Account # absurd surge gather author blanket acquire proof struggle runway attract cereal quiz tattoo shed almost sudden survey boring film memory picnic favorite verb tank # 0xfffdbb37105441e14b0ee6330d855d8504ff39e705c3afa8f859ac9865f99306 - ./bin/polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" + ./build/bin/polard genesis add-genesis-account cosmos1yrene6g2zwjttemf0c65fscg8w8c55w58yh8rl 69000000000000000000000000abera --keyring-backend $KEYRING --home "$HOMEDIR" # Sign genesis transaction - ./bin/polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" + ./build/bin/polard genesis gentx ${KEYS[0]} 1000000000000000000000abera --keyring-backend $KEYRING --chain-id $CHAINID --home "$HOMEDIR" ## In case you want to create multiple validators at genesis - ## 1. Back to `./bin/polard keys add` step, init more keys - ## 2. Back to `./bin/polard add-genesis-account` step, add balance for those - ## 3. Clone this ~/../bin/polard home directory into some others, let's say `~/.cloned./bin/polard` + ## 1. Back to `./build/bin/polard keys add` step, init more keys + ## 2. Back to `./build/bin/polard add-genesis-account` step, add balance for those + ## 3. Clone this ~/../build/bin/polard home directory into some others, let's say `~/.cloned./build/bin/polard` ## 4. Run `gentx` in each of those folders - ## 5. Copy the `gentx-*` folders under `~/.cloned./bin/polard/config/gentx/` folders into the original `~/../bin/polard/config/gentx` + ## 5. Copy the `gentx-*` folders under `~/.cloned./build/bin/polard/config/gentx/` folders into the original `~/../build/bin/polard/config/gentx` # Collect genesis tx - ./bin/polard genesis collect-gentxs --home "$HOMEDIR" + ./build/bin/polard genesis collect-gentxs --home "$HOMEDIR" # Run this to ensure everything worked and that the genesis file is setup correctly - ./bin/polard genesis validate-genesis --home "$HOMEDIR" + ./build/bin/polard genesis validate-genesis --home "$HOMEDIR" if [[ $1 == "pending" ]]; then echo "pending mode is on, please wait for the first block committed." @@ -113,4 +113,4 @@ if [[ $overwrite == "y" || $overwrite == "Y" ]]; then fi # Start the node (remove the --pruning=nothing flag if historical queries are not needed)m -./bin/polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" +./build/bin/polard start --pruning=nothing "$TRACE" --log_level $LOGLEVEL --api.enabled-unsafe-cors --api.enable --api.swagger --minimum-gas-prices=0.0001abera --home "$HOMEDIR" From a98b0c20becd7782193bffa10c56cb5ae6045384 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 13:33:21 -0400 Subject: [PATCH 5/7] tidy sync; --- build/tools/go.mod | 2 +- build/tools/go.sum | 3 +-- cosmos/go.mod | 1 + cosmos/go.sum | 3 +-- e2e/testapp/go.mod | 1 + e2e/testapp/go.sum | 3 +-- eth/go.mod | 1 + eth/go.sum | 3 +-- 8 files changed, 8 insertions(+), 9 deletions(-) diff --git a/build/tools/go.mod b/build/tools/go.mod index ec12e9ebe..5a3ea3598 100644 --- a/build/tools/go.mod +++ b/build/tools/go.mod @@ -77,7 +77,7 @@ require ( github.com/denis-tingaikin/go-header v0.4.3 // indirect github.com/docker/cli v24.0.4+incompatible // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.5+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect diff --git a/build/tools/go.sum b/build/tools/go.sum index cb210caf6..ea7777cae 100644 --- a/build/tools/go.sum +++ b/build/tools/go.sum @@ -206,8 +206,7 @@ github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAA github.com/docker/cli v24.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= diff --git a/cosmos/go.mod b/cosmos/go.mod index a1a613ee9..1bf630da1 100644 --- a/cosmos/go.mod +++ b/cosmos/go.mod @@ -83,6 +83,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect diff --git a/cosmos/go.sum b/cosmos/go.sum index 1f6df1825..69148a48e 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -259,8 +259,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= diff --git a/e2e/testapp/go.mod b/e2e/testapp/go.mod index 8b215a9f9..aa34d4249 100644 --- a/e2e/testapp/go.mod +++ b/e2e/testapp/go.mod @@ -89,6 +89,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/emicklei/dot v1.6.0 // indirect diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index fe92b27de..c9f92066a 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -425,8 +425,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= diff --git a/eth/go.mod b/eth/go.mod index 61bf0bf3d..575ba6964 100644 --- a/eth/go.mod +++ b/eth/go.mod @@ -41,6 +41,7 @@ require ( github.com/deckarep/golang-set/v2 v2.3.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/deepmap/oapi-codegen v1.13.4 // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect diff --git a/eth/go.sum b/eth/go.sum index f06c23952..c80f4be75 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -68,8 +68,7 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etly github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= -github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= -github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= From 4715a34d59f5e56367c7901afa81b78d47d428ef Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 13:54:54 -0400 Subject: [PATCH 6/7] based ante handler --- build/scripts/main.mk | 2 +- build/tools/go.sum | 1 + .../cosmos/lib/cosmos_types.abigen.go | 2 +- .../bindings/testing/consume_gas.abigen.go | 2 +- .../distribution_testing_helper.abigen.go | 2 +- .../governance/governance_wrapper.abigen.go | 2 +- .../bindings/testing/liquid_staking.abigen.go | 2 +- .../testing/precompile_constructor.abigen.go | 2 +- .../bindings/testing/solmate_erc20.abigen.go | 2 +- contracts/foundry.toml | 2 +- contracts/hardhat.config.js | 2 +- contracts/src/cosmos/CosmosTypes.sol | 5 +- contracts/src/cosmos/precompile/Bank.sol | 2 +- .../src/cosmos/precompile/Distribution.sol | 2 +- .../src/cosmos/precompile/Governance.sol | 2 +- contracts/src/cosmos/precompile/Staking.sol | 2 +- .../cosmos/precompile/examples/Deploy.s.sol | 2 +- .../precompile/examples/LiquidStaking.sol | 2 +- contracts/src/testing/ConsumeGas.sol | 2 +- contracts/src/testing/SolmateERC20.sol | 2 +- cosmos/config/mocks/app_options.go | 2 +- cosmos/go.sum | 1 + .../ante/eject.go => runtime/ante/ante.go} | 39 +------- cosmos/runtime/runtime.go | 5 +- cosmos/txpool/ante.go | 61 +++++++++++++ cosmos/txpool/mempool.go | 5 ++ cosmos/txpool/mocks/geth_tx_pool.go | 90 ++++++++++++++++++- cosmos/txpool/mocks/lifecycle.go | 2 +- cosmos/txpool/mocks/sdk_tx.go | 2 +- cosmos/txpool/mocks/subscription.go | 2 +- cosmos/txpool/mocks/tx_broadcaster.go | 2 +- cosmos/txpool/mocks/tx_serializer.go | 2 +- cosmos/txpool/mocks/tx_sub_provider.go | 2 +- e2e/testapp/go.sum | 1 + eth/core/state/journal/mocks/accesslist.go | 2 +- eth/core/state/journal/mocks/log.go | 2 +- eth/core/state/journal/mocks/refund.go | 2 +- .../mocks/self_destruct_state_plugin.go | 2 +- .../state/journal/mocks/self_destructs.go | 2 +- .../state/journal/mocks/transient_storage.go | 2 +- eth/core/state/mocks/plugin.go | 2 +- eth/core/state/mocks/polar_state_db.go | 2 +- eth/core/state/mocks/precompile_plugin.go | 2 +- eth/eth.go | 3 + eth/go.sum | 1 + 45 files changed, 205 insertions(+), 75 deletions(-) rename cosmos/{lib/ante/eject.go => runtime/ante/ante.go} (53%) create mode 100644 cosmos/txpool/ante.go diff --git a/build/scripts/main.mk b/build/scripts/main.mk index 640e8d73d..3e531d455 100644 --- a/build/scripts/main.mk +++ b/build/scripts/main.mk @@ -125,7 +125,7 @@ generate: @$(MAKE) abigen-install moq-install mockery @for module in $(MODULES); do \ echo "Running go generate in $$module"; \ - (cd $$module && go g`enerate ./...) || exit 1; \ + (cd $$module && go generate ./...) || exit 1; \ done abigen-install: diff --git a/build/tools/go.sum b/build/tools/go.sum index ea7777cae..ff3fd2ad3 100644 --- a/build/tools/go.sum +++ b/build/tools/go.sum @@ -207,6 +207,7 @@ github.com/docker/cli v24.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvM github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= diff --git a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go index 5bcb39485..5d2b38f62 100644 --- a/contracts/bindings/cosmos/lib/cosmos_types.abigen.go +++ b/contracts/bindings/cosmos/lib/cosmos_types.abigen.go @@ -59,7 +59,7 @@ type CosmosPageResponse struct { // CosmosTypesMetaData contains all meta data concerning the CosmosTypes contract. var CosmosTypesMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"codecAny\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"coin\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"offset\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"limit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"countTotal\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"reverse\",\"type\":\"bool\"}],\"internalType\":\"structCosmos.PageRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageRequest\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"nextKey\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"total\",\"type\":\"uint64\"}],\"internalType\":\"structCosmos.PageResponse\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"pageResponse\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80631713cb131461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea26469706673582212204851c65929628c6917f205d63c2ed1fe53414a6ef5256c40efcb934edb9babd164736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506102a08061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80631713cb131461004e5780631acc976f1461006a5780632ff6e5df14610086578063426ce1a9146100a2575b5f80fd5b610068600480360381019061006391906100f4565b6100be565b005b610084600480360381019061007f9190610159565b6100c1565b005b6100a0600480360381019061009b91906101be565b6100c4565b005b6100bc60048036038101906100b79190610223565b6100c7565b005b50565b50565b50565b50565b5f80fd5b5f80fd5b5f80fd5b5f604082840312156100eb576100ea6100d2565b5b81905092915050565b5f60208284031215610109576101086100ca565b5b5f82013567ffffffffffffffff811115610126576101256100ce565b5b610132848285016100d6565b91505092915050565b5f60a082840312156101505761014f6100d2565b5b81905092915050565b5f6020828403121561016e5761016d6100ca565b5b5f82013567ffffffffffffffff81111561018b5761018a6100ce565b5b6101978482850161013b565b91505092915050565b5f604082840312156101b5576101b46100d2565b5b81905092915050565b5f602082840312156101d3576101d26100ca565b5b5f82013567ffffffffffffffff8111156101f0576101ef6100ce565b5b6101fc848285016101a0565b91505092915050565b5f6040828403121561021a576102196100d2565b5b81905092915050565b5f60208284031215610238576102376100ca565b5b5f82013567ffffffffffffffff811115610255576102546100ce565b5b61026184828501610205565b9150509291505056fea264697066735822122036ff336a24a8816f73b0a48f1a4c677706bb73e1a2f03943beba1f2f2136722b64736f6c63430008160033", } // CosmosTypesABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/consume_gas.abigen.go b/contracts/bindings/testing/consume_gas.abigen.go index 7f38d198c..db1093883 100644 --- a/contracts/bindings/testing/consume_gas.abigen.go +++ b/contracts/bindings/testing/consume_gas.abigen.go @@ -32,7 +32,7 @@ var ( // ConsumeGasMetaData contains all meta data concerning the ConsumeGas contract. var ConsumeGasMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"name\":\"GasConsumed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"targetGas\",\"type\":\"uint256\"}],\"name\":\"consumeGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220115db31d6671601a577bae4be2d7cb75bdc4dbfd5e7b3b99a7e00c4560d03a2d64736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b506101cb8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063a329e8de1461002d575b5f80fd5b610047600480360381019061004291906100e2565b610049565b005b5f5a90505b818161005a919061013a565b5a1161004e575f5a8261006d919061013a565b90507f1a2dc18f5a2dabdf3809a83ec652290b81d97d915bf5561908090bad91deffc48160405161009e919061017c565b60405180910390a1505050565b5f80fd5b5f819050919050565b6100c1816100af565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100ab565b5b5f610104848285016100ce565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610144826100af565b915061014f836100af565b92508282039050818111156101675761016661010d565b5b92915050565b610176816100af565b82525050565b5f60208201905061018f5f83018461016d565b9291505056fea2646970667358221220369599000ac20c2dd34275978159c17a582d97c37ca7e592840b87f6f018478864736f6c63430008160033", } // ConsumeGasABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/distribution_testing_helper.abigen.go b/contracts/bindings/testing/distribution_testing_helper.abigen.go index 1534feef9..1a632423e 100644 --- a/contracts/bindings/testing/distribution_testing_helper.abigen.go +++ b/contracts/bindings/testing/distribution_testing_helper.abigen.go @@ -32,7 +32,7 @@ var ( // DistributionWrapperMetaData contains all meta data concerning the DistributionWrapper contract. var DistributionWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_distributionprecompile\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingprecompile\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribution\",\"outputs\":[{\"internalType\":\"contractIDistributionModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_withdrawAddress\",\"type\":\"address\"}],\"name\":\"setWithdrawAddress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_validatorAddress\",\"type\":\"address\"}],\"name\":\"withdrawRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea264697066735822122043654432997c95922bfcf12c9cded90160bd69b0223f1939299c88cc6eb9f4c664736f6c63430008150033", + Bin: "0x608060405234801561000f575f80fd5b50604051610bf8380380610bf8833981810160405281019061003191906101b2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561009757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156100ce576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506101f0565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61018182610158565b9050919050565b61019181610177565b811461019b575f80fd5b50565b5f815190506101ac81610188565b92915050565b5f80604083850312156101c8576101c7610154565b5b5f6101d58582860161019e565b92505060206101e68582860161019e565b9150509250929050565b6109fb806101fd5f395ff3fe608060405260043610610054575f3560e01c806339cc4c86146100585780633ab1a494146100825780634cf088d9146100be5780635c19a95c146100e85780635ee58efc14610104578063e20981ca1461012e575b5f80fd5b348015610063575f80fd5b5061006c610156565b604051610079919061042e565b60405180910390f35b34801561008d575f80fd5b506100a860048036038101906100a391906104b2565b6101e9565b6040516100b5919061042e565b60405180910390f35b3480156100c9575f80fd5b506100d261028a565b6040516100df9190610538565b60405180910390f35b61010260048036038101906100fd91906104b2565b6102af565b005b34801561010f575f80fd5b5061011861034f565b6040516101259190610571565b60405180910390f35b348015610139575f80fd5b50610154600480360381019061014f919061058a565b610372565b005b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339cc4c866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105f2565b905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab1a494836040518263ffffffff1660e01b8152600401610243919061062c565b6020604051808303815f875af115801561025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028391906105f2565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663026e402b82346040518363ffffffff1660e01b815260040161030b92919061065d565b6020604051808303815f875af1158015610327573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034b91906105f2565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663562c67a483836040518363ffffffff1660e01b81526004016103cc929190610684565b5f604051808303815f875af11580156103e7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061040f919061097e565b505050565b5f8115159050919050565b61042881610414565b82525050565b5f6020820190506104415f83018461041f565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61048182610458565b9050919050565b61049181610477565b811461049b575f80fd5b50565b5f813590506104ac81610488565b92915050565b5f602082840312156104c7576104c6610450565b5b5f6104d48482850161049e565b91505092915050565b5f819050919050565b5f6105006104fb6104f684610458565b6104dd565b610458565b9050919050565b5f610511826104e6565b9050919050565b5f61052282610507565b9050919050565b61053281610518565b82525050565b5f60208201905061054b5f830184610529565b92915050565b5f61055b82610507565b9050919050565b61056b81610551565b82525050565b5f6020820190506105845f830184610562565b92915050565b5f80604083850312156105a05761059f610450565b5b5f6105ad8582860161049e565b92505060206105be8582860161049e565b9150509250929050565b6105d181610414565b81146105db575f80fd5b50565b5f815190506105ec816105c8565b92915050565b5f6020828403121561060757610606610450565b5b5f610614848285016105de565b91505092915050565b61062681610477565b82525050565b5f60208201905061063f5f83018461061d565b92915050565b5f819050919050565b61065781610645565b82525050565b5f6040820190506106705f83018561061d565b61067d602083018461064e565b9392505050565b5f6040820190506106975f83018561061d565b6106a4602083018461061d565b9392505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6106f5826106af565b810181811067ffffffffffffffff82111715610714576107136106bf565b5b80604052505050565b5f610726610447565b905061073282826106ec565b919050565b5f67ffffffffffffffff821115610751576107506106bf565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b61077781610645565b8114610781575f80fd5b50565b5f815190506107928161076e565b92915050565b5f80fd5b5f67ffffffffffffffff8211156107b6576107b56106bf565b5b6107bf826106af565b9050602081019050919050565b5f5b838110156107e95780820151818401526020810190506107ce565b5f8484015250505050565b5f6108066108018461079c565b61071d565b90508281526020810184848401111561082257610821610798565b5b61082d8482856107cc565b509392505050565b5f82601f830112610849576108486106ab565b5b81516108598482602086016107f4565b91505092915050565b5f6040828403121561087757610876610766565b5b610881604061071d565b90505f61089084828501610784565b5f83015250602082015167ffffffffffffffff8111156108b3576108b261076a565b5b6108bf84828501610835565b60208301525092915050565b5f6108dd6108d884610737565b61071d565b90508083825260208201905060208402830185811115610900576108ff610762565b5b835b8181101561094757805167ffffffffffffffff811115610925576109246106ab565b5b8086016109328982610862565b85526020850194505050602081019050610902565b5050509392505050565b5f82601f830112610965576109646106ab565b5b81516109758482602086016108cb565b91505092915050565b5f6020828403121561099357610992610450565b5b5f82015167ffffffffffffffff8111156109b0576109af610454565b5b6109bc84828501610951565b9150509291505056fea26469706673582212205cc17fb7a79262b76c789b44c67146ad8043809a0aa57a12a63e0eacb3a87ef364736f6c63430008160033", } // DistributionWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/governance/governance_wrapper.abigen.go b/contracts/bindings/testing/governance/governance_wrapper.abigen.go index c571e4332..b2e4b68be 100644 --- a/contracts/bindings/testing/governance/governance_wrapper.abigen.go +++ b/contracts/bindings/testing/governance/governance_wrapper.abigen.go @@ -80,7 +80,7 @@ type IGovernanceModuleTallyResult struct { // GovernanceWrapperMetaData contains all meta data concerning the GovernanceWrapper contract. var GovernanceWrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceModule\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"bank\",\"outputs\":[{\"internalType\":\"contractIBankModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"cancelProposal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int32\",\"name\":\"proposalStatus\",\"type\":\"int32\"}],\"name\":\"getProposals\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"id\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"int32\",\"name\":\"status\",\"type\":\"int32\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"yesCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"abstainCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noCount\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"noWithVetoCount\",\"type\":\"string\"}],\"internalType\":\"structIGovernanceModule.TallyResult\",\"name\":\"finalTallyResult\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"submitTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"depositEndTime\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"totalDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"uint64\",\"name\":\"votingStartTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"votingEndTime\",\"type\":\"uint64\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"}],\"internalType\":\"structIGovernanceModule.Proposal[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governanceModule\",\"outputs\":[{\"internalType\":\"contractIGovernanceModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"typeURL\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"structCosmos.CodecAny[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"internalType\":\"structCosmos.Coin[]\",\"name\":\"initialDeposit\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"summary\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"expedited\",\"type\":\"bool\"}],\"internalType\":\"structIGovernanceModule.MsgSubmitProposal\",\"name\":\"proposal\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"submit\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"proposalId\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"option\",\"type\":\"int32\"},{\"internalType\":\"string\",\"name\":\"metadata\",\"type\":\"string\"}],\"name\":\"vote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b506040516200264b3803806200264b83398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051612474620001d75f395f6104e501526124745ff3fe608060405260043610610072575f3560e01c806337a9a59e1161004d57806337a9a59e1461011357806376cdb03b14610150578063b5828df21461017a578063f1610a28146101b657610079565b8062e66c9a1461007d57806319f7a0fb146100ad5780632b0a7032146100e957610079565b3661007957005b5f80fd5b61009760048036038101906100929190610862565b6101f2565b6040516100a49190610911565b60405180910390f35b3480156100b8575f80fd5b506100d360048036038101906100ce9190610ac2565b610377565b6040516100e09190610b48565b60405180910390f35b3480156100f4575f80fd5b506100fd61041e565b60405161010a9190610bdb565b60405180910390f35b34801561011e575f80fd5b5061013960048036038101906101349190610bf4565b610441565b604051610147929190610c1f565b60405180910390f35b34801561015b575f80fd5b506101646104e3565b6040516101719190610c66565b60405180910390f35b348015610185575f80fd5b506101a0600480360381019061019b9190610c7f565b610507565b6040516101ad919061121d565b60405180910390f35b3480156101c1575f80fd5b506101dc60048036038101906101d79190610bf4565b6105bc565b6040516101e99190611376565b60405180910390f35b5f80600167ffffffffffffffff81111561020f5761020e61099e565b5b60405190808252806020026020018201604052801561024857816020015b610235610665565b81526020019060019003908161022d5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106102a2576102a1611396565b5b60200260200101516020018190525082815f815181106102c5576102c4611396565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ed6982d876040518263ffffffff1660e01b815260040161032c919061196e565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c91906119a2565b915050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016103d593929190611a24565b6020604051808303815f875af11580156103f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104159190611a74565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b815260040161049b9190610911565b60408051808303815f875af11580156104b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104da9190611a9f565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061051161067e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056d929190611b50565b5f60405180830381865afa158015610587573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105af9190612381565b5090508092505050919050565b6105c46106c1565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061c9190610911565b5f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065e91906123f7565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f5610773565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156107c5576107c46107ac565b5b81905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107ef576107ee6107ce565b5b8235905067ffffffffffffffff81111561080c5761080b6107d2565b5b602083019150836001820283011115610828576108276107d6565b5b9250929050565b5f819050919050565b6108418161082f565b811461084b575f80fd5b50565b5f8135905061085c81610838565b92915050565b5f805f806060858703121561087a576108796107a4565b5b5f85013567ffffffffffffffff811115610897576108966107a8565b5b6108a3878288016107b0565b945050602085013567ffffffffffffffff8111156108c4576108c36107a8565b5b6108d0878288016107da565b935093505060406108e38782880161084e565b91505092959194509250565b5f67ffffffffffffffff82169050919050565b61090b816108ef565b82525050565b5f6020820190506109245f830184610902565b92915050565b610933816108ef565b811461093d575f80fd5b50565b5f8135905061094e8161092a565b92915050565b5f8160030b9050919050565b61096981610954565b8114610973575f80fd5b50565b5f8135905061098481610960565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6109d48261098e565b810181811067ffffffffffffffff821117156109f3576109f261099e565b5b80604052505050565b5f610a0561079b565b9050610a1182826109cb565b919050565b5f67ffffffffffffffff821115610a3057610a2f61099e565b5b610a398261098e565b9050602081019050919050565b828183375f83830152505050565b5f610a66610a6184610a16565b6109fc565b905082815260208101848484011115610a8257610a8161098a565b5b610a8d848285610a46565b509392505050565b5f82601f830112610aa957610aa86107ce565b5b8135610ab9848260208601610a54565b91505092915050565b5f805f60608486031215610ad957610ad86107a4565b5b5f610ae686828701610940565b9350506020610af786828701610976565b925050604084013567ffffffffffffffff811115610b1857610b176107a8565b5b610b2486828701610a95565b9150509250925092565b5f8115159050919050565b610b4281610b2e565b82525050565b5f602082019050610b5b5f830184610b39565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610ba3610b9e610b9984610b61565b610b80565b610b61565b9050919050565b5f610bb482610b89565b9050919050565b5f610bc582610baa565b9050919050565b610bd581610bbb565b82525050565b5f602082019050610bee5f830184610bcc565b92915050565b5f60208284031215610c0957610c086107a4565b5b5f610c1684828501610940565b91505092915050565b5f604082019050610c325f830185610902565b610c3f6020830184610902565b9392505050565b5f610c5082610baa565b9050919050565b610c6081610c46565b82525050565b5f602082019050610c795f830184610c57565b92915050565b5f60208284031215610c9457610c936107a4565b5b5f610ca184828501610976565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdc816108ef565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d42578082015181840152602081019050610d27565b5f8484015250505050565b5f610d5782610d0b565b610d618185610d15565b9350610d71818560208601610d25565b610d7a8161098e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610da982610d85565b610db38185610d8f565b9350610dc3818560208601610d25565b610dcc8161098e565b840191505092915050565b5f604083015f8301518482035f860152610df18282610d4d565b91505060208301518482036020860152610e0b8282610d9f565b9150508091505092915050565b5f610e238383610dd7565b905092915050565b5f602082019050919050565b5f610e4182610ce2565b610e4b8185610cec565b935083602082028501610e5d85610cfc565b805f5b85811015610e985784840389528151610e798582610e18565b9450610e8483610e2b565b925060208a01995050600181019050610e60565b50829750879550505050505092915050565b610eb381610954565b82525050565b5f608083015f8301518482035f860152610ed38282610d4d565b91505060208301518482036020860152610eed8282610d4d565b91505060408301518482036040860152610f078282610d4d565b91505060608301518482036060860152610f218282610d4d565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610f608161082f565b82525050565b5f604083015f830151610f7b5f860182610f57565b5060208301518482036020860152610f938282610d4d565b9150508091505092915050565b5f610fab8383610f66565b905092915050565b5f602082019050919050565b5f610fc982610f2e565b610fd38185610f38565b935083602082028501610fe585610f48565b805f5b8581101561102057848403895281516110018582610fa0565b945061100c83610fb3565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b5f61103c82610b61565b9050919050565b61104c81611032565b82525050565b5f6101a083015f8301516110685f860182610cd3565b50602083015184820360208601526110808282610e37565b91505060408301516110956040860182610eaa565b50606083015184820360608601526110ad8282610eb9565b91505060808301516110c26080860182610cd3565b5060a08301516110d560a0860182610cd3565b5060c083015184820360c08601526110ed8282610fbf565b91505060e083015161110260e0860182610cd3565b50610100830151611117610100860182610cd3565b506101208301518482036101208601526111318282610d4d565b91505061014083015184820361014086015261114d8282610d4d565b9150506101608301518482036101608601526111698282610d4d565b915050610180830151611180610180860182611043565b508091505092915050565b5f6111968383611052565b905092915050565b5f602082019050919050565b5f6111b482610caa565b6111be8185610cb4565b9350836020820285016111d085610cc4565b805f5b8581101561120b57848403895281516111ec858261118b565b94506111f78361119e565b925060208a019950506001810190506111d3565b50829750879550505050505092915050565b5f6020820190508181035f83015261123581846111aa565b905092915050565b5f6101a083015f8301516112535f860182610cd3565b506020830151848203602086015261126b8282610e37565b91505060408301516112806040860182610eaa565b50606083015184820360608601526112988282610eb9565b91505060808301516112ad6080860182610cd3565b5060a08301516112c060a0860182610cd3565b5060c083015184820360c08601526112d88282610fbf565b91505060e08301516112ed60e0860182610cd3565b50610100830151611302610100860182610cd3565b5061012083015184820361012086015261131c8282610d4d565b9150506101408301518482036101408601526113388282610d4d565b9150506101608301518482036101608601526113548282610d4d565b91505061018083015161136b610180860182611043565b508091505092915050565b5f6020820190508181035f83015261138e818461123d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126113eb576113ea6113cb565b5b83810192508235915060208301925067ffffffffffffffff821115611413576114126113c3565b5b602082023603831315611429576114286113c7565b5b509250929050565b5f819050919050565b5f8083356001602003843603038112611456576114556113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561147e5761147d6113c3565b5b600182023603831315611494576114936113c7565b5b509250929050565b5f6114a78385610d15565b93506114b4838584610a46565b6114bd8361098e565b840190509392505050565b5f80833560016020038436030381126114e4576114e36113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561150c5761150b6113c3565b5b600182023603831315611522576115216113c7565b5b509250929050565b5f6115358385610d8f565b9350611542838584610a46565b61154b8361098e565b840190509392505050565b5f604083016115675f84018461143a565b8583035f87015261157983828461149c565b9250505061158a60208401846114c8565b858303602087015261159d83828461152a565b925050508091505092915050565b5f6115b68383611556565b905092915050565b5f823560016040038336030381126115d9576115d86113cb565b5b82810191505092915050565b5f602082019050919050565b5f6115fc8385610cec565b93508360208402850161160e84611431565b805f5b8781101561165157848403895261162882846115be565b61163285826115ab565b945061163d836115e5565b925060208a01995050600181019050611611565b50829750879450505050509392505050565b5f808335600160200384360303811261167f5761167e6113cb565b5b83810192508235915060208301925067ffffffffffffffff8211156116a7576116a66113c3565b5b6020820236038313156116bd576116bc6113c7565b5b509250929050565b5f819050919050565b5f6116dc602084018461084e565b905092915050565b5f604083016116f55f8401846116ce565b6117015f860182610f57565b5061170f602084018461143a565b858303602087015261172283828461149c565b925050508091505092915050565b5f61173b83836116e4565b905092915050565b5f8235600160400383360303811261175e5761175d6113cb565b5b82810191505092915050565b5f602082019050919050565b5f6117818385610f38565b935083602084028501611793846116c5565b805f5b878110156117d65784840389526117ad8284611743565b6117b78582611730565b94506117c28361176a565b925060208a01995050600181019050611796565b50829750879450505050509392505050565b6117f181611032565b81146117fb575f80fd5b50565b5f8135905061180c816117e8565b92915050565b5f61182060208401846117fe565b905092915050565b61183181610b2e565b811461183b575f80fd5b50565b5f8135905061184c81611828565b92915050565b5f611860602084018461183e565b905092915050565b61187181610b2e565b82525050565b5f60e083016118885f8401846113cf565b8583035f87015261189a8382846115f1565b925050506118ab6020840184611663565b85830360208701526118be838284611776565b925050506118cf6040840184611812565b6118dc6040860182611043565b506118ea606084018461143a565b85830360608701526118fd83828461149c565b9250505061190e608084018461143a565b858303608087015261192183828461149c565b9250505061193260a084018461143a565b85830360a087015261194583828461149c565b9250505061195660c0840184611852565b61196360c0860182611868565b508091505092915050565b5f6020820190508181035f8301526119868184611877565b905092915050565b5f8151905061199c8161092a565b92915050565b5f602082840312156119b7576119b66107a4565b5b5f6119c48482850161198e565b91505092915050565b6119d681610954565b82525050565b5f82825260208201905092915050565b5f6119f682610d0b565b611a0081856119dc565b9350611a10818560208601610d25565b611a198161098e565b840191505092915050565b5f606082019050611a375f830186610902565b611a4460208301856119cd565b8181036040830152611a5681846119ec565b9050949350505050565b5f81519050611a6e81611828565b92915050565b5f60208284031215611a8957611a886107a4565b5b5f611a9684828501611a60565b91505092915050565b5f8060408385031215611ab557611ab46107a4565b5b5f611ac28582860161198e565b9250506020611ad38582860161198e565b9150509250929050565b5f60a083015f8301518482035f860152611af78282610d4d565b9150506020830151611b0c6020860182610cd3565b506040830151611b1f6040860182610cd3565b506060830151611b326060860182611868565b506080830151611b456080860182611868565b508091505092915050565b5f604082019050611b635f8301856119cd565b8181036020830152611b758184611add565b90509392505050565b5f67ffffffffffffffff821115611b9857611b9761099e565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611bcb57611bca61099e565b5b602082029050602081019050919050565b5f611bee611be984610a16565b6109fc565b905082815260208101848484011115611c0a57611c0961098a565b5b611c15848285610d25565b509392505050565b5f82601f830112611c3157611c306107ce565b5b8151611c41848260208601611bdc565b91505092915050565b5f67ffffffffffffffff821115611c6457611c6361099e565b5b611c6d8261098e565b9050602081019050919050565b5f611c8c611c8784611c4a565b6109fc565b905082815260208101848484011115611ca857611ca761098a565b5b611cb3848285610d25565b509392505050565b5f82601f830112611ccf57611cce6107ce565b5b8151611cdf848260208601611c7a565b91505092915050565b5f60408284031215611cfd57611cfc611ba9565b5b611d0760406109fc565b90505f82015167ffffffffffffffff811115611d2657611d25611bad565b5b611d3284828501611c1d565b5f83015250602082015167ffffffffffffffff811115611d5557611d54611bad565b5b611d6184828501611cbb565b60208301525092915050565b5f611d7f611d7a84611bb1565b6109fc565b90508083825260208201905060208402830185811115611da257611da16107d6565b5b835b81811015611de957805167ffffffffffffffff811115611dc757611dc66107ce565b5b808601611dd48982611ce8565b85526020850194505050602081019050611da4565b5050509392505050565b5f82601f830112611e0757611e066107ce565b5b8151611e17848260208601611d6d565b91505092915050565b5f81519050611e2e81610960565b92915050565b5f60808284031215611e4957611e48611ba9565b5b611e5360806109fc565b90505f82015167ffffffffffffffff811115611e7257611e71611bad565b5b611e7e84828501611c1d565b5f83015250602082015167ffffffffffffffff811115611ea157611ea0611bad565b5b611ead84828501611c1d565b602083015250604082015167ffffffffffffffff811115611ed157611ed0611bad565b5b611edd84828501611c1d565b604083015250606082015167ffffffffffffffff811115611f0157611f00611bad565b5b611f0d84828501611c1d565b60608301525092915050565b5f67ffffffffffffffff821115611f3357611f3261099e565b5b602082029050602081019050919050565b5f81519050611f5281610838565b92915050565b5f60408284031215611f6d57611f6c611ba9565b5b611f7760406109fc565b90505f611f8684828501611f44565b5f83015250602082015167ffffffffffffffff811115611fa957611fa8611bad565b5b611fb584828501611c1d565b60208301525092915050565b5f611fd3611fce84611f19565b6109fc565b90508083825260208201905060208402830185811115611ff657611ff56107d6565b5b835b8181101561203d57805167ffffffffffffffff81111561201b5761201a6107ce565b5b8086016120288982611f58565b85526020850194505050602081019050611ff8565b5050509392505050565b5f82601f83011261205b5761205a6107ce565b5b815161206b848260208601611fc1565b91505092915050565b5f81519050612082816117e8565b92915050565b5f6101a0828403121561209e5761209d611ba9565b5b6120a96101a06109fc565b90505f6120b88482850161198e565b5f83015250602082015167ffffffffffffffff8111156120db576120da611bad565b5b6120e784828501611df3565b60208301525060406120fb84828501611e20565b604083015250606082015167ffffffffffffffff81111561211f5761211e611bad565b5b61212b84828501611e34565b606083015250608061213f8482850161198e565b60808301525060a06121538482850161198e565b60a08301525060c082015167ffffffffffffffff81111561217757612176611bad565b5b61218384828501612047565b60c08301525060e06121978482850161198e565b60e0830152506101006121ac8482850161198e565b6101008301525061012082015167ffffffffffffffff8111156121d2576121d1611bad565b5b6121de84828501611c1d565b6101208301525061014082015167ffffffffffffffff81111561220457612203611bad565b5b61221084828501611c1d565b6101408301525061016082015167ffffffffffffffff81111561223657612235611bad565b5b61224284828501611c1d565b6101608301525061018061225884828501612074565b6101808301525092915050565b5f61227761227284611b7e565b6109fc565b9050808382526020820190506020840283018581111561229a576122996107d6565b5b835b818110156122e157805167ffffffffffffffff8111156122bf576122be6107ce565b5b8086016122cc8982612088565b8552602085019450505060208101905061229c565b5050509392505050565b5f82601f8301126122ff576122fe6107ce565b5b815161230f848260208601612265565b91505092915050565b5f6040828403121561232d5761232c611ba9565b5b61233760406109fc565b90505f82015167ffffffffffffffff81111561235657612355611bad565b5b61236284828501611c1d565b5f8301525060206123758482850161198e565b60208301525092915050565b5f8060408385031215612397576123966107a4565b5b5f83015167ffffffffffffffff8111156123b4576123b36107a8565b5b6123c0858286016122eb565b925050602083015167ffffffffffffffff8111156123e1576123e06107a8565b5b6123ed85828601612318565b9150509250929050565b5f6020828403121561240c5761240b6107a4565b5b5f82015167ffffffffffffffff811115612429576124286107a8565b5b61243584828501612088565b9150509291505056fea26469706673582212203a7ddd435312b1bb86536949e71389633ba2796df3994b5da3a8ce07417a5b4264736f6c63430008150033", + Bin: "0x60a0604052734381dc2ab14285160c808659aee005d51255add773ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525034801562000057575f80fd5b506040516200264b3803806200264b83398181016040528101906200007d91906200018e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000e3576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001be565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000158826200012d565b9050919050565b6200016a816200014c565b811462000175575f80fd5b50565b5f8151905062000188816200015f565b92915050565b5f60208284031215620001a657620001a562000129565b5b5f620001b58482850162000178565b91505092915050565b608051612474620001d75f395f6104e501526124745ff3fe608060405260043610610072575f3560e01c806337a9a59e1161004d57806337a9a59e1461011357806376cdb03b14610150578063b5828df21461017a578063f1610a28146101b657610079565b8062e66c9a1461007d57806319f7a0fb146100ad5780632b0a7032146100e957610079565b3661007957005b5f80fd5b61009760048036038101906100929190610862565b6101f2565b6040516100a49190610911565b60405180910390f35b3480156100b8575f80fd5b506100d360048036038101906100ce9190610ac2565b610377565b6040516100e09190610b48565b60405180910390f35b3480156100f4575f80fd5b506100fd61041e565b60405161010a9190610bdb565b60405180910390f35b34801561011e575f80fd5b5061013960048036038101906101349190610bf4565b610441565b604051610147929190610c1f565b60405180910390f35b34801561015b575f80fd5b506101646104e3565b6040516101719190610c66565b60405180910390f35b348015610185575f80fd5b506101a0600480360381019061019b9190610c7f565b610507565b6040516101ad919061121d565b60405180910390f35b3480156101c1575f80fd5b506101dc60048036038101906101d79190610bf4565b6105bc565b6040516101e99190611376565b60405180910390f35b5f80600167ffffffffffffffff81111561020f5761020e61099e565b5b60405190808252806020026020018201604052801561024857816020015b610235610665565b81526020019060019003908161022d5790505b50905084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050815f815181106102a2576102a1611396565b5b60200260200101516020018190525082815f815181106102c5576102c4611396565b5b60200260200101515f0181815250505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ed6982d876040518263ffffffff1660e01b815260040161032c919061196e565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c91906119a2565b915050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166319f7a0fb8585856040518463ffffffff1660e01b81526004016103d593929190611a24565b6020604051808303815f875af11580156103f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104159190611a74565b90509392505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337a9a59e846040518263ffffffff1660e01b815260040161049b9190610911565b60408051808303815f875af11580156104b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104da9190611a9f565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061051161067e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663917c9d9285846040518363ffffffff1660e01b815260040161056d929190611b50565b5f60405180830381865afa158015610587573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105af9190612381565b5090508092505050919050565b6105c46106c1565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f1610a28836040518263ffffffff1660e01b815260040161061c9190610911565b5f60405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061065e91906123f7565b9050919050565b60405180604001604052805f8152602001606081525090565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b604051806101a001604052805f67ffffffffffffffff168152602001606081526020015f60030b81526020016106f5610773565b81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff168152602001606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020016060815260200160608152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff1681525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f60e082840312156107c5576107c46107ac565b5b81905092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126107ef576107ee6107ce565b5b8235905067ffffffffffffffff81111561080c5761080b6107d2565b5b602083019150836001820283011115610828576108276107d6565b5b9250929050565b5f819050919050565b6108418161082f565b811461084b575f80fd5b50565b5f8135905061085c81610838565b92915050565b5f805f806060858703121561087a576108796107a4565b5b5f85013567ffffffffffffffff811115610897576108966107a8565b5b6108a3878288016107b0565b945050602085013567ffffffffffffffff8111156108c4576108c36107a8565b5b6108d0878288016107da565b935093505060406108e38782880161084e565b91505092959194509250565b5f67ffffffffffffffff82169050919050565b61090b816108ef565b82525050565b5f6020820190506109245f830184610902565b92915050565b610933816108ef565b811461093d575f80fd5b50565b5f8135905061094e8161092a565b92915050565b5f8160030b9050919050565b61096981610954565b8114610973575f80fd5b50565b5f8135905061098481610960565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6109d48261098e565b810181811067ffffffffffffffff821117156109f3576109f261099e565b5b80604052505050565b5f610a0561079b565b9050610a1182826109cb565b919050565b5f67ffffffffffffffff821115610a3057610a2f61099e565b5b610a398261098e565b9050602081019050919050565b828183375f83830152505050565b5f610a66610a6184610a16565b6109fc565b905082815260208101848484011115610a8257610a8161098a565b5b610a8d848285610a46565b509392505050565b5f82601f830112610aa957610aa86107ce565b5b8135610ab9848260208601610a54565b91505092915050565b5f805f60608486031215610ad957610ad86107a4565b5b5f610ae686828701610940565b9350506020610af786828701610976565b925050604084013567ffffffffffffffff811115610b1857610b176107a8565b5b610b2486828701610a95565b9150509250925092565b5f8115159050919050565b610b4281610b2e565b82525050565b5f602082019050610b5b5f830184610b39565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f610ba3610b9e610b9984610b61565b610b80565b610b61565b9050919050565b5f610bb482610b89565b9050919050565b5f610bc582610baa565b9050919050565b610bd581610bbb565b82525050565b5f602082019050610bee5f830184610bcc565b92915050565b5f60208284031215610c0957610c086107a4565b5b5f610c1684828501610940565b91505092915050565b5f604082019050610c325f830185610902565b610c3f6020830184610902565b9392505050565b5f610c5082610baa565b9050919050565b610c6081610c46565b82525050565b5f602082019050610c795f830184610c57565b92915050565b5f60208284031215610c9457610c936107a4565b5b5f610ca184828501610976565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610cdc816108ef565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610d42578082015181840152602081019050610d27565b5f8484015250505050565b5f610d5782610d0b565b610d618185610d15565b9350610d71818560208601610d25565b610d7a8161098e565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610da982610d85565b610db38185610d8f565b9350610dc3818560208601610d25565b610dcc8161098e565b840191505092915050565b5f604083015f8301518482035f860152610df18282610d4d565b91505060208301518482036020860152610e0b8282610d9f565b9150508091505092915050565b5f610e238383610dd7565b905092915050565b5f602082019050919050565b5f610e4182610ce2565b610e4b8185610cec565b935083602082028501610e5d85610cfc565b805f5b85811015610e985784840389528151610e798582610e18565b9450610e8483610e2b565b925060208a01995050600181019050610e60565b50829750879550505050505092915050565b610eb381610954565b82525050565b5f608083015f8301518482035f860152610ed38282610d4d565b91505060208301518482036020860152610eed8282610d4d565b91505060408301518482036040860152610f078282610d4d565b91505060608301518482036060860152610f218282610d4d565b9150508091505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610f608161082f565b82525050565b5f604083015f830151610f7b5f860182610f57565b5060208301518482036020860152610f938282610d4d565b9150508091505092915050565b5f610fab8383610f66565b905092915050565b5f602082019050919050565b5f610fc982610f2e565b610fd38185610f38565b935083602082028501610fe585610f48565b805f5b8581101561102057848403895281516110018582610fa0565b945061100c83610fb3565b925060208a01995050600181019050610fe8565b50829750879550505050505092915050565b5f61103c82610b61565b9050919050565b61104c81611032565b82525050565b5f6101a083015f8301516110685f860182610cd3565b50602083015184820360208601526110808282610e37565b91505060408301516110956040860182610eaa565b50606083015184820360608601526110ad8282610eb9565b91505060808301516110c26080860182610cd3565b5060a08301516110d560a0860182610cd3565b5060c083015184820360c08601526110ed8282610fbf565b91505060e083015161110260e0860182610cd3565b50610100830151611117610100860182610cd3565b506101208301518482036101208601526111318282610d4d565b91505061014083015184820361014086015261114d8282610d4d565b9150506101608301518482036101608601526111698282610d4d565b915050610180830151611180610180860182611043565b508091505092915050565b5f6111968383611052565b905092915050565b5f602082019050919050565b5f6111b482610caa565b6111be8185610cb4565b9350836020820285016111d085610cc4565b805f5b8581101561120b57848403895281516111ec858261118b565b94506111f78361119e565b925060208a019950506001810190506111d3565b50829750879550505050505092915050565b5f6020820190508181035f83015261123581846111aa565b905092915050565b5f6101a083015f8301516112535f860182610cd3565b506020830151848203602086015261126b8282610e37565b91505060408301516112806040860182610eaa565b50606083015184820360608601526112988282610eb9565b91505060808301516112ad6080860182610cd3565b5060a08301516112c060a0860182610cd3565b5060c083015184820360c08601526112d88282610fbf565b91505060e08301516112ed60e0860182610cd3565b50610100830151611302610100860182610cd3565b5061012083015184820361012086015261131c8282610d4d565b9150506101408301518482036101408601526113388282610d4d565b9150506101608301518482036101608601526113548282610d4d565b91505061018083015161136b610180860182611043565b508091505092915050565b5f6020820190508181035f83015261138e818461123d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126113eb576113ea6113cb565b5b83810192508235915060208301925067ffffffffffffffff821115611413576114126113c3565b5b602082023603831315611429576114286113c7565b5b509250929050565b5f819050919050565b5f8083356001602003843603038112611456576114556113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561147e5761147d6113c3565b5b600182023603831315611494576114936113c7565b5b509250929050565b5f6114a78385610d15565b93506114b4838584610a46565b6114bd8361098e565b840190509392505050565b5f80833560016020038436030381126114e4576114e36113cb565b5b83810192508235915060208301925067ffffffffffffffff82111561150c5761150b6113c3565b5b600182023603831315611522576115216113c7565b5b509250929050565b5f6115358385610d8f565b9350611542838584610a46565b61154b8361098e565b840190509392505050565b5f604083016115675f84018461143a565b8583035f87015261157983828461149c565b9250505061158a60208401846114c8565b858303602087015261159d83828461152a565b925050508091505092915050565b5f6115b68383611556565b905092915050565b5f823560016040038336030381126115d9576115d86113cb565b5b82810191505092915050565b5f602082019050919050565b5f6115fc8385610cec565b93508360208402850161160e84611431565b805f5b8781101561165157848403895261162882846115be565b61163285826115ab565b945061163d836115e5565b925060208a01995050600181019050611611565b50829750879450505050509392505050565b5f808335600160200384360303811261167f5761167e6113cb565b5b83810192508235915060208301925067ffffffffffffffff8211156116a7576116a66113c3565b5b6020820236038313156116bd576116bc6113c7565b5b509250929050565b5f819050919050565b5f6116dc602084018461084e565b905092915050565b5f604083016116f55f8401846116ce565b6117015f860182610f57565b5061170f602084018461143a565b858303602087015261172283828461149c565b925050508091505092915050565b5f61173b83836116e4565b905092915050565b5f8235600160400383360303811261175e5761175d6113cb565b5b82810191505092915050565b5f602082019050919050565b5f6117818385610f38565b935083602084028501611793846116c5565b805f5b878110156117d65784840389526117ad8284611743565b6117b78582611730565b94506117c28361176a565b925060208a01995050600181019050611796565b50829750879450505050509392505050565b6117f181611032565b81146117fb575f80fd5b50565b5f8135905061180c816117e8565b92915050565b5f61182060208401846117fe565b905092915050565b61183181610b2e565b811461183b575f80fd5b50565b5f8135905061184c81611828565b92915050565b5f611860602084018461183e565b905092915050565b61187181610b2e565b82525050565b5f60e083016118885f8401846113cf565b8583035f87015261189a8382846115f1565b925050506118ab6020840184611663565b85830360208701526118be838284611776565b925050506118cf6040840184611812565b6118dc6040860182611043565b506118ea606084018461143a565b85830360608701526118fd83828461149c565b9250505061190e608084018461143a565b858303608087015261192183828461149c565b9250505061193260a084018461143a565b85830360a087015261194583828461149c565b9250505061195660c0840184611852565b61196360c0860182611868565b508091505092915050565b5f6020820190508181035f8301526119868184611877565b905092915050565b5f8151905061199c8161092a565b92915050565b5f602082840312156119b7576119b66107a4565b5b5f6119c48482850161198e565b91505092915050565b6119d681610954565b82525050565b5f82825260208201905092915050565b5f6119f682610d0b565b611a0081856119dc565b9350611a10818560208601610d25565b611a198161098e565b840191505092915050565b5f606082019050611a375f830186610902565b611a4460208301856119cd565b8181036040830152611a5681846119ec565b9050949350505050565b5f81519050611a6e81611828565b92915050565b5f60208284031215611a8957611a886107a4565b5b5f611a9684828501611a60565b91505092915050565b5f8060408385031215611ab557611ab46107a4565b5b5f611ac28582860161198e565b9250506020611ad38582860161198e565b9150509250929050565b5f60a083015f8301518482035f860152611af78282610d4d565b9150506020830151611b0c6020860182610cd3565b506040830151611b1f6040860182610cd3565b506060830151611b326060860182611868565b506080830151611b456080860182611868565b508091505092915050565b5f604082019050611b635f8301856119cd565b8181036020830152611b758184611add565b90509392505050565b5f67ffffffffffffffff821115611b9857611b9761099e565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115611bcb57611bca61099e565b5b602082029050602081019050919050565b5f611bee611be984610a16565b6109fc565b905082815260208101848484011115611c0a57611c0961098a565b5b611c15848285610d25565b509392505050565b5f82601f830112611c3157611c306107ce565b5b8151611c41848260208601611bdc565b91505092915050565b5f67ffffffffffffffff821115611c6457611c6361099e565b5b611c6d8261098e565b9050602081019050919050565b5f611c8c611c8784611c4a565b6109fc565b905082815260208101848484011115611ca857611ca761098a565b5b611cb3848285610d25565b509392505050565b5f82601f830112611ccf57611cce6107ce565b5b8151611cdf848260208601611c7a565b91505092915050565b5f60408284031215611cfd57611cfc611ba9565b5b611d0760406109fc565b90505f82015167ffffffffffffffff811115611d2657611d25611bad565b5b611d3284828501611c1d565b5f83015250602082015167ffffffffffffffff811115611d5557611d54611bad565b5b611d6184828501611cbb565b60208301525092915050565b5f611d7f611d7a84611bb1565b6109fc565b90508083825260208201905060208402830185811115611da257611da16107d6565b5b835b81811015611de957805167ffffffffffffffff811115611dc757611dc66107ce565b5b808601611dd48982611ce8565b85526020850194505050602081019050611da4565b5050509392505050565b5f82601f830112611e0757611e066107ce565b5b8151611e17848260208601611d6d565b91505092915050565b5f81519050611e2e81610960565b92915050565b5f60808284031215611e4957611e48611ba9565b5b611e5360806109fc565b90505f82015167ffffffffffffffff811115611e7257611e71611bad565b5b611e7e84828501611c1d565b5f83015250602082015167ffffffffffffffff811115611ea157611ea0611bad565b5b611ead84828501611c1d565b602083015250604082015167ffffffffffffffff811115611ed157611ed0611bad565b5b611edd84828501611c1d565b604083015250606082015167ffffffffffffffff811115611f0157611f00611bad565b5b611f0d84828501611c1d565b60608301525092915050565b5f67ffffffffffffffff821115611f3357611f3261099e565b5b602082029050602081019050919050565b5f81519050611f5281610838565b92915050565b5f60408284031215611f6d57611f6c611ba9565b5b611f7760406109fc565b90505f611f8684828501611f44565b5f83015250602082015167ffffffffffffffff811115611fa957611fa8611bad565b5b611fb584828501611c1d565b60208301525092915050565b5f611fd3611fce84611f19565b6109fc565b90508083825260208201905060208402830185811115611ff657611ff56107d6565b5b835b8181101561203d57805167ffffffffffffffff81111561201b5761201a6107ce565b5b8086016120288982611f58565b85526020850194505050602081019050611ff8565b5050509392505050565b5f82601f83011261205b5761205a6107ce565b5b815161206b848260208601611fc1565b91505092915050565b5f81519050612082816117e8565b92915050565b5f6101a0828403121561209e5761209d611ba9565b5b6120a96101a06109fc565b90505f6120b88482850161198e565b5f83015250602082015167ffffffffffffffff8111156120db576120da611bad565b5b6120e784828501611df3565b60208301525060406120fb84828501611e20565b604083015250606082015167ffffffffffffffff81111561211f5761211e611bad565b5b61212b84828501611e34565b606083015250608061213f8482850161198e565b60808301525060a06121538482850161198e565b60a08301525060c082015167ffffffffffffffff81111561217757612176611bad565b5b61218384828501612047565b60c08301525060e06121978482850161198e565b60e0830152506101006121ac8482850161198e565b6101008301525061012082015167ffffffffffffffff8111156121d2576121d1611bad565b5b6121de84828501611c1d565b6101208301525061014082015167ffffffffffffffff81111561220457612203611bad565b5b61221084828501611c1d565b6101408301525061016082015167ffffffffffffffff81111561223657612235611bad565b5b61224284828501611c1d565b6101608301525061018061225884828501612074565b6101808301525092915050565b5f61227761227284611b7e565b6109fc565b9050808382526020820190506020840283018581111561229a576122996107d6565b5b835b818110156122e157805167ffffffffffffffff8111156122bf576122be6107ce565b5b8086016122cc8982612088565b8552602085019450505060208101905061229c565b5050509392505050565b5f82601f8301126122ff576122fe6107ce565b5b815161230f848260208601612265565b91505092915050565b5f6040828403121561232d5761232c611ba9565b5b61233760406109fc565b90505f82015167ffffffffffffffff81111561235657612355611bad565b5b61236284828501611c1d565b5f8301525060206123758482850161198e565b60208301525092915050565b5f8060408385031215612397576123966107a4565b5b5f83015167ffffffffffffffff8111156123b4576123b36107a8565b5b6123c0858286016122eb565b925050602083015167ffffffffffffffff8111156123e1576123e06107a8565b5b6123ed85828601612318565b9150509250929050565b5f6020828403121561240c5761240b6107a4565b5b5f82015167ffffffffffffffff811115612429576124286107a8565b5b61243584828501612088565b9150509291505056fea2646970667358221220474767dcc81f6675e7195bf1321ab8fa53f81d082262705c435f0a6f41e55c0264736f6c63430008160033", } // GovernanceWrapperABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/liquid_staking.abigen.go b/contracts/bindings/testing/liquid_staking.abigen.go index 74deba0f5..9be0e8a75 100644 --- a/contracts/bindings/testing/liquid_staking.abigen.go +++ b/contracts/bindings/testing/liquid_staking.abigen.go @@ -32,7 +32,7 @@ var ( // LiquidStakingMetaData contains all meta data concerning the LiquidStaking contract. var LiquidStakingMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Data\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"Success\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"staking\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorAddress\",\"type\":\"address\"}],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b50604051620031d7380380620031d783398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612970620008675f395f8181610907015281816109ec01528181610bac01528181610c6c015261117501525f6108e001525f6108ac01525f61088701526129705ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d9190611501565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115bf565b6104cd565b6040516101699190611617565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b604051610193919061163f565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611658565b6105c0565b6040516101cf9190611617565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a8565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116ee565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b919061171f565b60405180910390f35b34801561025f575f80fd5b50610268610905565b6040516102759190611793565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117ac565b610929565b6040516102b1919061163f565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117ac565b61093e565b6040516102ed919061163f565b60405180910390f35b348015610301575f80fd5b5061030a610953565b6040516103179190611501565b60405180910390f35b34801561032b575f80fd5b506103346109df565b604051610341919061188e565b60405180910390f35b610364600480360381019061035f91906116a8565b610b68565b005b348015610371575f80fd5b5061038c600480360381019061038791906115bf565b610d58565b6040516103999190611617565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c39190611902565b610e65565b005b3480156103d5575f80fd5b506103f060048036038101906103eb919061199f565b611152565b6040516103fd919061163f565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117ac565b611172565b604051610439919061163f565b60405180910390f35b5f805461044e90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a0a565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a8919061163f565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a67565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a67565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e7919061163f565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e3382611214565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112df565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a0a565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b86565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123e3565b5090505f815167ffffffffffffffff811115610aa457610aa3611baa565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5e57828181518110610af357610af2612459565b5b60200260200101515f0151828281518110610b1157610b10612459565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b5690612486565b915050610ad7565b5080935050505090565b5f8103610ba1576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba9611434565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610c039190611b86565b5f60405180830381865afa158015610c1d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c4591906123e3565b5090505f815f81518110610c5c57610c5b612459565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cc59291906124dc565b6020604051808303815f875af1158015610ce1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d059190612503565b905080610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e90612578565b60405180910390fd5b610d513386611369565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610da59190611a67565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e53919061163f565b60405180910390a36001905092915050565b42841015610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f906125e0565b60405180910390fd5b5f6001610eb36108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f38969594939291906125fe565b60405160208183030381529060405280519060200120604051602001610f5f9291906126d1565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f949493929190612707565b6020604051602081039080840390855afa158015610fb4573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102757508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105d90612794565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611141919061163f565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111ce9291906127b2565b602060405180830381865afa1580156111e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120d91906127d9565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112609190611a67565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112d3919061163f565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f60405161130f91906128a0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161134e9594939291906128b6565b60405160208183030381529060405280519060200120905090565b8060025f82825461137a9190612907565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611428919061163f565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114ae578082015181840152602081019050611493565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114d382611477565b6114dd8185611481565b93506114ed818560208601611491565b6114f6816114b9565b840191505092915050565b5f6020820190508181035f83015261151981846114c9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61155b82611532565b9050919050565b61156b81611551565b8114611575575f80fd5b50565b5f8135905061158681611562565b92915050565b5f819050919050565b61159e8161158c565b81146115a8575f80fd5b50565b5f813590506115b981611595565b92915050565b5f80604083850312156115d5576115d461152a565b5b5f6115e285828601611578565b92505060206115f3858286016115ab565b9150509250929050565b5f8115159050919050565b611611816115fd565b82525050565b5f60208201905061162a5f830184611608565b92915050565b6116398161158c565b82525050565b5f6020820190506116525f830184611630565b92915050565b5f805f6060848603121561166f5761166e61152a565b5b5f61167c86828701611578565b935050602061168d86828701611578565b925050604061169e868287016115ab565b9150509250925092565b5f602082840312156116bd576116bc61152a565b5b5f6116ca848285016115ab565b91505092915050565b5f60ff82169050919050565b6116e8816116d3565b82525050565b5f6020820190506117015f8301846116df565b92915050565b5f819050919050565b61171981611707565b82525050565b5f6020820190506117325f830184611710565b92915050565b5f819050919050565b5f61175b61175661175184611532565b611738565b611532565b9050919050565b5f61176c82611741565b9050919050565b5f61177d82611762565b9050919050565b61178d81611773565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f602082840312156117c1576117c061152a565b5b5f6117ce84828501611578565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61180981611551565b82525050565b5f61181a8383611800565b60208301905092915050565b5f602082019050919050565b5f61183c826117d7565b61184681856117e1565b9350611851836117f1565b805f5b83811015611881578151611868888261180f565b975061187383611826565b925050600181019050611854565b5085935050505092915050565b5f6020820190508181035f8301526118a68184611832565b905092915050565b6118b7816116d3565b81146118c1575f80fd5b50565b5f813590506118d2816118ae565b92915050565b6118e181611707565b81146118eb575f80fd5b50565b5f813590506118fc816118d8565b92915050565b5f805f805f805f60e0888a03121561191d5761191c61152a565b5b5f61192a8a828b01611578565b975050602061193b8a828b01611578565b965050604061194c8a828b016115ab565b955050606061195d8a828b016115ab565b945050608061196e8a828b016118c4565b93505060a061197f8a828b016118ee565b92505060c06119908a828b016118ee565b91505092959891949750929550565b5f80604083850312156119b5576119b461152a565b5b5f6119c285828601611578565b92505060206119d385828601611578565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2157607f821691505b602082108103611a3457611a336119dd565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a718261158c565b9150611a7c8361158c565b9250828203905081811115611a9457611a93611a3a565b5b92915050565b5f82825260208201905092915050565b5f611ab482611477565b611abe8185611a9a565b9350611ace818560208601611491565b611ad7816114b9565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611afe81611ae2565b82525050565b611b0d816115fd565b82525050565b5f60a083015f8301518482035f860152611b2d8282611aaa565b9150506020830151611b426020860182611af5565b506040830151611b556040860182611af5565b506060830151611b686060860182611b04565b506080830151611b7b6080860182611b04565b508091505092915050565b5f6020820190508181035f830152611b9e8184611b13565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826114b9565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611521565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c6781611562565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8b57611c8a611baa565b5b611c94826114b9565b9050602081019050919050565b5f611cb3611cae84611c71565b611c08565b905082815260208101848484011115611ccf57611cce611c6d565b5b611cda848285611491565b509392505050565b5f82601f830112611cf657611cf5611ba6565b5b8151611d06848260208601611ca1565b91505092915050565b611d18816115fd565b8114611d22575f80fd5b50565b5f81519050611d3381611d0f565b92915050565b5f67ffffffffffffffff821115611d5357611d52611baa565b5b611d5c826114b9565b9050602081019050919050565b5f611d7b611d7684611d39565b611c08565b905082815260208101848484011115611d9757611d96611c6d565b5b611da2848285611491565b509392505050565b5f82601f830112611dbe57611dbd611ba6565b5b8151611dce848260208601611d69565b91505092915050565b5f81519050611de581611595565b92915050565b5f60a08284031215611e0057611dff611c51565b5b611e0a60a0611c08565b90505f82015167ffffffffffffffff811115611e2957611e28611c55565b5b611e3584828501611daa565b5f83015250602082015167ffffffffffffffff811115611e5857611e57611c55565b5b611e6484828501611daa565b602083015250604082015167ffffffffffffffff811115611e8857611e87611c55565b5b611e9484828501611daa565b604083015250606082015167ffffffffffffffff811115611eb857611eb7611c55565b5b611ec484828501611daa565b606083015250608082015167ffffffffffffffff811115611ee857611ee7611c55565b5b611ef484828501611daa565b60808301525092915050565b5f8160070b9050919050565b611f1581611f00565b8114611f1f575f80fd5b50565b5f81519050611f3081611f0c565b92915050565b5f60608284031215611f4b57611f4a611c51565b5b611f556060611c08565b90505f611f6484828501611dd7565b5f830152506020611f7784828501611dd7565b6020830152506040611f8b84828501611dd7565b60408301525092915050565b5f60808284031215611fac57611fab611c51565b5b611fb66040611c08565b90505f611fc584828501611f36565b5f83015250606082015167ffffffffffffffff811115611fe857611fe7611c55565b5b611ff484828501611daa565b60208301525092915050565b5f67ffffffffffffffff82111561201a57612019611baa565b5b602082029050602081019050919050565b61203481611ae2565b811461203e575f80fd5b50565b5f8151905061204f8161202b565b92915050565b5f61206761206284612000565b611c08565b9050808382526020820190506020840283018581111561208a57612089611c4d565b5b835b818110156120b3578061209f8882612041565b84526020840193505060208101905061208c565b5050509392505050565b5f82601f8301126120d1576120d0611ba6565b5b81516120e1848260208601612055565b91505092915050565b5f6101a08284031215612100576120ff611c51565b5b61210b6101a0611c08565b90505f61211a84828501611c59565b5f83015250602082015167ffffffffffffffff81111561213d5761213c611c55565b5b61214984828501611ce2565b602083015250604061215d84828501611d25565b604083015250606082015167ffffffffffffffff81111561218157612180611c55565b5b61218d84828501611daa565b60608301525060806121a184828501611dd7565b60808301525060a06121b584828501611dd7565b60a08301525060c082015167ffffffffffffffff8111156121d9576121d8611c55565b5b6121e584828501611deb565b60c08301525060e06121f984828501611f22565b60e08301525061010082015167ffffffffffffffff81111561221e5761221d611c55565b5b61222a84828501611daa565b6101008301525061012082015167ffffffffffffffff8111156122505761224f611c55565b5b61225c84828501611f97565b6101208301525061014061227284828501611dd7565b6101408301525061016061228884828501611f22565b6101608301525061018082015167ffffffffffffffff8111156122ae576122ad611c55565b5b6122ba848285016120bd565b6101808301525092915050565b5f6122d96122d484611c22565b611c08565b905080838252602082019050602084028301858111156122fc576122fb611c4d565b5b835b8181101561234357805167ffffffffffffffff81111561232157612320611ba6565b5b80860161232e89826120ea565b855260208501945050506020810190506122fe565b5050509392505050565b5f82601f83011261236157612360611ba6565b5b81516123718482602086016122c7565b91505092915050565b5f6040828403121561238f5761238e611c51565b5b6123996040611c08565b90505f82015167ffffffffffffffff8111156123b8576123b7611c55565b5b6123c484828501611daa565b5f8301525060206123d784828501612041565b60208301525092915050565b5f80604083850312156123f9576123f861152a565b5b5f83015167ffffffffffffffff8111156124165761241561152e565b5b6124228582860161234d565b925050602083015167ffffffffffffffff8111156124435761244261152e565b5b61244f8582860161237a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6124908261158c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c2576124c1611a3a565b5b600182019050919050565b6124d681611551565b82525050565b5f6040820190506124ef5f8301856124cd565b6124fc6020830184611630565b9392505050565b5f602082840312156125185761251761152a565b5b5f61252584828501611d25565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f612562601283611481565b915061256d8261252e565b602082019050919050565b5f6020820190508181035f83015261258f81612556565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f6125ca601783611481565b91506125d582612596565b602082019050919050565b5f6020820190508181035f8301526125f7816125be565b9050919050565b5f60c0820190506126115f830189611710565b61261e60208301886124cd565b61262b60408301876124cd565b6126386060830186611630565b6126456080830185611630565b61265260a0830184611630565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61269b60028361265d565b91506126a682612667565b600282019050919050565b5f819050919050565b6126cb6126c682611707565b6126b1565b82525050565b5f6126db8261268f565b91506126e782856126ba565b6020820191506126f782846126ba565b6020820191508190509392505050565b5f60808201905061271a5f830187611710565b61272760208301866116df565b6127346040830185611710565b6127416060830184611710565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f61277e600e83611481565b91506127898261274a565b602082019050919050565b5f6020820190508181035f8301526127ab81612772565b9050919050565b5f6040820190506127c55f8301856124cd565b6127d260208301846124cd565b9392505050565b5f602082840312156127ee576127ed61152a565b5b5f6127fb84828501611dd7565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461282c81611a0a565b6128368186612804565b9450600182165f8114612850576001811461286557612897565b60ff1983168652811515820286019350612897565b61286e8561280e565b5f5b8381101561288f57815481890152600182019150602081019050612870565b838801955050505b50505092915050565b5f6128ab8284612820565b915081905092915050565b5f60a0820190506128c95f830188611710565b6128d66020830187611710565b6128e36040830186611710565b6128f06060830185611630565b6128fd60808301846124cd565b9695505050505050565b5f6129118261158c565b915061291c8361158c565b925082820190508082111561293457612933611a3a565b5b9291505056fea2646970667358221220e1befea2f1d88361e22fa46de66a0946314b8d5bf3a55903625d53ee040c04d264736f6c63430008150033", + Bin: "0x61010060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525034801562000058575f80fd5b506040516200318a3803806200318a83398181016040528101906200007e9190620002f0565b81816012825f9081620000929190620005aa565b508160019081620000a49190620005aa565b508060ff1660808160ff16815250504660a08181525050620000cb620000dd60201b60201c565b60c08181525050505050505062000817565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010f919062000736565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000150959493929190620007bc565b60405160208183030381529060405280519060200120905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001cc8262000184565b810181811067ffffffffffffffff82111715620001ee57620001ed62000194565b5b80604052505050565b5f620002026200016b565b9050620002108282620001c1565b919050565b5f67ffffffffffffffff82111562000232576200023162000194565b5b6200023d8262000184565b9050602081019050919050565b5f5b83811015620002695780820151818401526020810190506200024c565b5f8484015250505050565b5f6200028a620002848462000215565b620001f7565b905082815260208101848484011115620002a957620002a862000180565b5b620002b68482856200024a565b509392505050565b5f82601f830112620002d557620002d46200017c565b5b8151620002e784826020860162000274565b91505092915050565b5f806040838503121562000309576200030862000174565b5b5f83015167ffffffffffffffff81111562000329576200032862000178565b5b6200033785828601620002be565b925050602083015167ffffffffffffffff8111156200035b576200035a62000178565b5b6200036985828601620002be565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003c257607f821691505b602082108103620003d857620003d76200037d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ff565b620004488683620003ff565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004926200048c620004868462000460565b62000469565b62000460565b9050919050565b5f819050919050565b620004ad8362000472565b620004c5620004bc8262000499565b8484546200040b565b825550505050565b5f90565b620004db620004cd565b620004e8818484620004a2565b505050565b5b818110156200050f57620005035f82620004d1565b600181019050620004ee565b5050565b601f8211156200055e576200052881620003de565b6200053384620003f0565b8101602085101562000543578190505b6200055b6200055285620003f0565b830182620004ed565b50505b505050565b5f82821c905092915050565b5f620005805f198460080262000563565b1980831691505092915050565b5f6200059a83836200056f565b9150826002028217905092915050565b620005b58262000373565b67ffffffffffffffff811115620005d157620005d062000194565b5b620005dd8254620003aa565b620005ea82828562000513565b5f60209050601f83116001811462000620575f84156200060b578287015190505b6200061785826200058d565b86555062000686565b601f1984166200063086620003de565b5f5b82811015620006595784890151825560018201915060208501945060208101905062000632565b8683101562000679578489015162000675601f8916826200056f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620006b881620003aa565b620006c481866200068e565b9450600182165f8114620006e15760018114620006f7576200072d565b60ff19831686528115158202860193506200072d565b620007028562000698565b5f5b83811015620007255781548189015260018201915060208101905062000704565b838801955050505b50505092915050565b5f620007438284620006aa565b915081905092915050565b5f819050919050565b62000762816200074e565b82525050565b620007738162000460565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007a48262000779565b9050919050565b620007b68162000798565b82525050565b5f60a082019050620007d15f83018862000757565b620007e0602083018762000757565b620007ef604083018662000757565b620007fe606083018562000768565b6200080d6080830184620007ab565b9695505050505050565b60805160a05160c05160e051612923620008675f395f8181610907015281816109ec01528181610ba601528181610c66015261116f01525f6108e001525f6108ac01525f61088701526129235ff3fe608060405260043610610101575f3560e01c806370a08231116100945780639fa6dd35116100635780639fa6dd351461034a578063a9059cbb14610366578063d505accf146103a2578063dd62ed3e146103ca578063f639187e1461040657610108565b806370a082311461027e5780637ecebe00146102ba57806395d89b41146102f65780639de702581461032057610108565b80632e1a7d4d116100d05780632e1a7d4d146101d8578063313ce567146102005780633644e5151461022a5780634cf088d91461025457610108565b806306fdde031461010c578063095ea7b31461013657806318160ddd1461017257806323b872dd1461019c57610108565b3661010857005b5f80fd5b348015610117575f80fd5b50610120610442565b60405161012d91906114fb565b60405180910390f35b348015610141575f80fd5b5061015c600480360381019061015791906115b9565b6104cd565b6040516101699190611611565b60405180910390f35b34801561017d575f80fd5b506101866105ba565b6040516101939190611639565b60405180910390f35b3480156101a7575f80fd5b506101c260048036038101906101bd9190611652565b6105c0565b6040516101cf9190611611565b60405180910390f35b3480156101e3575f80fd5b506101fe60048036038101906101f991906116a2565b6107fb565b005b34801561020b575f80fd5b50610214610885565b60405161022191906116e8565b60405180910390f35b348015610235575f80fd5b5061023e6108a9565b60405161024b9190611719565b60405180910390f35b34801561025f575f80fd5b50610268610905565b604051610275919061178d565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f91906117a6565b610929565b6040516102b19190611639565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906117a6565b61093e565b6040516102ed9190611639565b60405180910390f35b348015610301575f80fd5b5061030a610953565b60405161031791906114fb565b60405180910390f35b34801561032b575f80fd5b506103346109df565b6040516103419190611888565b60405180910390f35b610364600480360381019061035f91906116a2565b610b62565b005b348015610371575f80fd5b5061038c600480360381019061038791906115b9565b610d52565b6040516103999190611611565b60405180910390f35b3480156103ad575f80fd5b506103c860048036038101906103c391906118fc565b610e5f565b005b3480156103d5575f80fd5b506103f060048036038101906103eb9190611999565b61114c565b6040516103fd9190611639565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906117a6565b61116c565b6040516104399190611639565b60405180910390f35b5f805461044e90611a04565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611a04565b80156104c55780601f1061049c576101008083540402835291602001916104c5565b820191905f5260205f20905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a89190611639565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106ed5782816106709190611a61565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107399190611a61565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516107e79190611639565b60405180910390a360019150509392505050565b5f8103610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083e338261120e565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610881573d5f803e3d5ffd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146108de576108d96112d9565b610900565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461096090611a04565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611a04565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b505050505081565b60606109e961142e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610a439190611b80565b5f60405180830381865afa158015610a5d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610a8591906123dd565b5090505f815167ffffffffffffffff811115610aa457610aa3611ba4565b5b604051908082528060200260200182016040528015610ad25781602001602082028036833780820191505090505b5090505f5b8251811015610b5857828181518110610af357610af2612453565b5b60200260200101515f0151828281518110610b1157610b10612453565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610ad7565b5080935050505090565b5f8103610b9b576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba361142e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cf3f2340836040518263ffffffff1660e01b8152600401610bfd9190611b80565b5f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610c3f91906123dd565b5090505f815f81518110610c5657610c55612453565b5b60200260200101515f015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663026e402b83876040518363ffffffff1660e01b8152600401610cbf92919061248f565b6020604051808303815f875af1158015610cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cff91906124b6565b905080610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d389061252b565b60405180910390fd5b610d4b3386611363565b5050505050565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d9f9190611a61565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e4d9190611639565b60405180910390a36001905092915050565b42841015610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990612593565b60405180910390fd5b5f6001610ead6108a9565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001610f32969594939291906125b1565b60405160208183030381529060405280519060200120604051602001610f59929190612684565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610f8e94939291906126ba565b6020604051602081039080840390855afa158015610fae573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561102157508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105790612747565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258760405161113b9190611639565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315049a5a30846040518363ffffffff1660e01b81526004016111c8929190612765565b602060405180830381865afa1580156111e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611207919061278c565b9050919050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461125a9190611a61565b925050819055508060025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112cd9190611639565b60405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516113099190612853565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001611348959493929190612869565b60405160208183030381529060405280519060200120905090565b8060025f82825461137491906128ba565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114229190611639565b60405180910390a35050565b6040518060a00160405280606081526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156114a857808201518184015260208101905061148d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6114cd82611471565b6114d7818561147b565b93506114e781856020860161148b565b6114f0816114b3565b840191505092915050565b5f6020820190508181035f83015261151381846114c3565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115558261152c565b9050919050565b6115658161154b565b811461156f575f80fd5b50565b5f813590506115808161155c565b92915050565b5f819050919050565b61159881611586565b81146115a2575f80fd5b50565b5f813590506115b38161158f565b92915050565b5f80604083850312156115cf576115ce611524565b5b5f6115dc85828601611572565b92505060206115ed858286016115a5565b9150509250929050565b5f8115159050919050565b61160b816115f7565b82525050565b5f6020820190506116245f830184611602565b92915050565b61163381611586565b82525050565b5f60208201905061164c5f83018461162a565b92915050565b5f805f6060848603121561166957611668611524565b5b5f61167686828701611572565b935050602061168786828701611572565b9250506040611698868287016115a5565b9150509250925092565b5f602082840312156116b7576116b6611524565b5b5f6116c4848285016115a5565b91505092915050565b5f60ff82169050919050565b6116e2816116cd565b82525050565b5f6020820190506116fb5f8301846116d9565b92915050565b5f819050919050565b61171381611701565b82525050565b5f60208201905061172c5f83018461170a565b92915050565b5f819050919050565b5f61175561175061174b8461152c565b611732565b61152c565b9050919050565b5f6117668261173b565b9050919050565b5f6117778261175c565b9050919050565b6117878161176d565b82525050565b5f6020820190506117a05f83018461177e565b92915050565b5f602082840312156117bb576117ba611524565b5b5f6117c884828501611572565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6118038161154b565b82525050565b5f61181483836117fa565b60208301905092915050565b5f602082019050919050565b5f611836826117d1565b61184081856117db565b935061184b836117eb565b805f5b8381101561187b5781516118628882611809565b975061186d83611820565b92505060018101905061184e565b5085935050505092915050565b5f6020820190508181035f8301526118a0818461182c565b905092915050565b6118b1816116cd565b81146118bb575f80fd5b50565b5f813590506118cc816118a8565b92915050565b6118db81611701565b81146118e5575f80fd5b50565b5f813590506118f6816118d2565b92915050565b5f805f805f805f60e0888a03121561191757611916611524565b5b5f6119248a828b01611572565b97505060206119358a828b01611572565b96505060406119468a828b016115a5565b95505060606119578a828b016115a5565b94505060806119688a828b016118be565b93505060a06119798a828b016118e8565b92505060c061198a8a828b016118e8565b91505092959891949750929550565b5f80604083850312156119af576119ae611524565b5b5f6119bc85828601611572565b92505060206119cd85828601611572565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a1b57607f821691505b602082108103611a2e57611a2d6119d7565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a6b82611586565b9150611a7683611586565b9250828203905081811115611a8e57611a8d611a34565b5b92915050565b5f82825260208201905092915050565b5f611aae82611471565b611ab88185611a94565b9350611ac881856020860161148b565b611ad1816114b3565b840191505092915050565b5f67ffffffffffffffff82169050919050565b611af881611adc565b82525050565b611b07816115f7565b82525050565b5f60a083015f8301518482035f860152611b278282611aa4565b9150506020830151611b3c6020860182611aef565b506040830151611b4f6040860182611aef565b506060830151611b626060860182611afe565b506080830151611b756080860182611afe565b508091505092915050565b5f6020820190508181035f830152611b988184611b0d565b905092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611bda826114b3565b810181811067ffffffffffffffff82111715611bf957611bf8611ba4565b5b80604052505050565b5f611c0b61151b565b9050611c178282611bd1565b919050565b5f67ffffffffffffffff821115611c3657611c35611ba4565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f81519050611c618161155c565b92915050565b5f80fd5b5f67ffffffffffffffff821115611c8557611c84611ba4565b5b611c8e826114b3565b9050602081019050919050565b5f611cad611ca884611c6b565b611c02565b905082815260208101848484011115611cc957611cc8611c67565b5b611cd484828561148b565b509392505050565b5f82601f830112611cf057611cef611ba0565b5b8151611d00848260208601611c9b565b91505092915050565b611d12816115f7565b8114611d1c575f80fd5b50565b5f81519050611d2d81611d09565b92915050565b5f67ffffffffffffffff821115611d4d57611d4c611ba4565b5b611d56826114b3565b9050602081019050919050565b5f611d75611d7084611d33565b611c02565b905082815260208101848484011115611d9157611d90611c67565b5b611d9c84828561148b565b509392505050565b5f82601f830112611db857611db7611ba0565b5b8151611dc8848260208601611d63565b91505092915050565b5f81519050611ddf8161158f565b92915050565b5f60a08284031215611dfa57611df9611c4b565b5b611e0460a0611c02565b90505f82015167ffffffffffffffff811115611e2357611e22611c4f565b5b611e2f84828501611da4565b5f83015250602082015167ffffffffffffffff811115611e5257611e51611c4f565b5b611e5e84828501611da4565b602083015250604082015167ffffffffffffffff811115611e8257611e81611c4f565b5b611e8e84828501611da4565b604083015250606082015167ffffffffffffffff811115611eb257611eb1611c4f565b5b611ebe84828501611da4565b606083015250608082015167ffffffffffffffff811115611ee257611ee1611c4f565b5b611eee84828501611da4565b60808301525092915050565b5f8160070b9050919050565b611f0f81611efa565b8114611f19575f80fd5b50565b5f81519050611f2a81611f06565b92915050565b5f60608284031215611f4557611f44611c4b565b5b611f4f6060611c02565b90505f611f5e84828501611dd1565b5f830152506020611f7184828501611dd1565b6020830152506040611f8584828501611dd1565b60408301525092915050565b5f60808284031215611fa657611fa5611c4b565b5b611fb06040611c02565b90505f611fbf84828501611f30565b5f83015250606082015167ffffffffffffffff811115611fe257611fe1611c4f565b5b611fee84828501611da4565b60208301525092915050565b5f67ffffffffffffffff82111561201457612013611ba4565b5b602082029050602081019050919050565b61202e81611adc565b8114612038575f80fd5b50565b5f8151905061204981612025565b92915050565b5f61206161205c84611ffa565b611c02565b9050808382526020820190506020840283018581111561208457612083611c47565b5b835b818110156120ad5780612099888261203b565b845260208401935050602081019050612086565b5050509392505050565b5f82601f8301126120cb576120ca611ba0565b5b81516120db84826020860161204f565b91505092915050565b5f6101a082840312156120fa576120f9611c4b565b5b6121056101a0611c02565b90505f61211484828501611c53565b5f83015250602082015167ffffffffffffffff81111561213757612136611c4f565b5b61214384828501611cdc565b602083015250604061215784828501611d1f565b604083015250606082015167ffffffffffffffff81111561217b5761217a611c4f565b5b61218784828501611da4565b606083015250608061219b84828501611dd1565b60808301525060a06121af84828501611dd1565b60a08301525060c082015167ffffffffffffffff8111156121d3576121d2611c4f565b5b6121df84828501611de5565b60c08301525060e06121f384828501611f1c565b60e08301525061010082015167ffffffffffffffff81111561221857612217611c4f565b5b61222484828501611da4565b6101008301525061012082015167ffffffffffffffff81111561224a57612249611c4f565b5b61225684828501611f91565b6101208301525061014061226c84828501611dd1565b6101408301525061016061228284828501611f1c565b6101608301525061018082015167ffffffffffffffff8111156122a8576122a7611c4f565b5b6122b4848285016120b7565b6101808301525092915050565b5f6122d36122ce84611c1c565b611c02565b905080838252602082019050602084028301858111156122f6576122f5611c47565b5b835b8181101561233d57805167ffffffffffffffff81111561231b5761231a611ba0565b5b80860161232889826120e4565b855260208501945050506020810190506122f8565b5050509392505050565b5f82601f83011261235b5761235a611ba0565b5b815161236b8482602086016122c1565b91505092915050565b5f6040828403121561238957612388611c4b565b5b6123936040611c02565b90505f82015167ffffffffffffffff8111156123b2576123b1611c4f565b5b6123be84828501611da4565b5f8301525060206123d18482850161203b565b60208301525092915050565b5f80604083850312156123f3576123f2611524565b5b5f83015167ffffffffffffffff8111156124105761240f611528565b5b61241c85828601612347565b925050602083015167ffffffffffffffff81111561243d5761243c611528565b5b61244985828601612374565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6124898161154b565b82525050565b5f6040820190506124a25f830185612480565b6124af602083018461162a565b9392505050565b5f602082840312156124cb576124ca611524565b5b5f6124d884828501611d1f565b91505092915050565b7f4661696c656420746f2064656c656761746500000000000000000000000000005f82015250565b5f61251560128361147b565b9150612520826124e1565b602082019050919050565b5f6020820190508181035f83015261254281612509565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61257d60178361147b565b915061258882612549565b602082019050919050565b5f6020820190508181035f8301526125aa81612571565b9050919050565b5f60c0820190506125c45f83018961170a565b6125d16020830188612480565b6125de6040830187612480565b6125eb606083018661162a565b6125f8608083018561162a565b61260560a083018461162a565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61264e600283612610565b91506126598261261a565b600282019050919050565b5f819050919050565b61267e61267982611701565b612664565b82525050565b5f61268e82612642565b915061269a828561266d565b6020820191506126aa828461266d565b6020820191508190509392505050565b5f6080820190506126cd5f83018761170a565b6126da60208301866116d9565b6126e7604083018561170a565b6126f4606083018461170a565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f612731600e8361147b565b915061273c826126fd565b602082019050919050565b5f6020820190508181035f83015261275e81612725565b9050919050565b5f6040820190506127785f830185612480565b6127856020830184612480565b9392505050565b5f602082840312156127a1576127a0611524565b5b5f6127ae84828501611dd1565b91505092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f81546127df81611a04565b6127e981866127b7565b9450600182165f811461280357600181146128185761284a565b60ff198316865281151582028601935061284a565b612821856127c1565b5f5b8381101561284257815481890152600182019150602081019050612823565b838801955050505b50505092915050565b5f61285e82846127d3565b915081905092915050565b5f60a08201905061287c5f83018861170a565b612889602083018761170a565b612896604083018661170a565b6128a3606083018561162a565b6128b06080830184612480565b9695505050505050565b5f6128c482611586565b91506128cf83611586565b92508282019050808211156128e7576128e6611a34565b5b9291505056fea26469706673582212204181e33327d3b449da71947774c4d087ef74cd7b352e93f17a7074365cbc412664736f6c63430008160033", } // LiquidStakingABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/precompile_constructor.abigen.go b/contracts/bindings/testing/precompile_constructor.abigen.go index d90f5ec8c..94dc29a0c 100644 --- a/contracts/bindings/testing/precompile_constructor.abigen.go +++ b/contracts/bindings/testing/precompile_constructor.abigen.go @@ -32,7 +32,7 @@ var ( // PrecompileConstructorMetaData contains all meta data concerning the PrecompileConstructor contract. var PrecompileConstructorMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"stakingModule\",\"outputs\":[{\"internalType\":\"contractIStakingModule\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea264697066735822122032de415702619c2679a6596f73b8062fb27ef9e79eecaa57e39997b2e4430c3864736f6c63430008150033", + Bin: "0x60a060405273d9a998cac66092748ffec7cfbd155aae1737c2ff73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610056575f80fd5b5060805173ffffffffffffffffffffffffffffffffffffffff1663dcaf464a6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100a1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100c9919061028a565b506102d1565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012a826100e4565b810181811067ffffffffffffffff82111715610149576101486100f4565b5b80604052505050565b5f61015b6100cf565b90506101678282610121565b919050565b5f67ffffffffffffffff821115610186576101856100f4565b5b602082029050602081019050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101c48261019b565b9050919050565b6101d4816101ba565b81146101de575f80fd5b50565b5f815190506101ef816101cb565b92915050565b5f6102076102028461016c565b610152565b9050808382526020820190506020840283018581111561022a57610229610197565b5b835b81811015610253578061023f88826101e1565b84526020840193505060208101905061022c565b5050509392505050565b5f82601f830112610271576102706100e0565b5b81516102818482602086016101f5565b91505092915050565b5f6020828403121561029f5761029e6100d8565b5b5f82015167ffffffffffffffff8111156102bc576102bb6100dc565b5b6102c88482850161025d565b91505092915050565b6080516101236102e85f395f604601526101235ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063504b82bf14602a575b5f80fd5b60306044565b604051603b919060d6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f60a460a0609c846068565b6087565b6068565b9050919050565b5f60b3826090565b9050919050565b5f60c28260ab565b9050919050565b60d08160ba565b82525050565b5f60208201905060e75f83018460c9565b9291505056fea2646970667358221220ece9db4f829fb1e02e42eb683059b0e791be368d87d36b1be8ab1696fa7a797164736f6c63430008160033", } // PrecompileConstructorABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/testing/solmate_erc20.abigen.go b/contracts/bindings/testing/solmate_erc20.abigen.go index ee50028de..264f1c1d2 100644 --- a/contracts/bindings/testing/solmate_erc20.abigen.go +++ b/contracts/bindings/testing/solmate_erc20.abigen.go @@ -32,7 +32,7 @@ var ( // SolmateERC20MetaData contains all meta data concerning the SolmateERC20 contract. var SolmateERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea2646970667358221220561e30e936bfd35118ded14fe94698dde467ab2fc1b044b1e39f92a717be6d7c64736f6c63430008150033", + Bin: "0x60e060405234801562000010575f80fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544b0000000000000000000000000000000000000000000000000000000000008152506012825f90816200008f9190620003ca565b508160019081620000a19190620003ca565b508060ff1660808160ff16815250504660a08181525050620000c8620000d860201b60201c565b60c0818152505050505062000637565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200010a919062000556565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200014b959493929190620005dc565b60405160208183030381529060405280519060200120905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001e257607f821691505b602082108103620001f857620001f76200019d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200025c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200021f565b6200026886836200021f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002b2620002ac620002a68462000280565b62000289565b62000280565b9050919050565b5f819050919050565b620002cd8362000292565b620002e5620002dc82620002b9565b8484546200022b565b825550505050565b5f90565b620002fb620002ed565b62000308818484620002c2565b505050565b5b818110156200032f57620003235f82620002f1565b6001810190506200030e565b5050565b601f8211156200037e576200034881620001fe565b620003538462000210565b8101602085101562000363578190505b6200037b620003728562000210565b8301826200030d565b50505b505050565b5f82821c905092915050565b5f620003a05f198460080262000383565b1980831691505092915050565b5f620003ba83836200038f565b9150826002028217905092915050565b620003d58262000166565b67ffffffffffffffff811115620003f157620003f062000170565b5b620003fd8254620001ca565b6200040a82828562000333565b5f60209050601f83116001811462000440575f84156200042b578287015190505b620004378582620003ad565b865550620004a6565b601f1984166200045086620001fe565b5f5b82811015620004795784890151825560018201915060208501945060208101905062000452565b8683101562000499578489015162000495601f8916826200038f565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154620004d881620001ca565b620004e48186620004ae565b9450600182165f811462000501576001811462000517576200054d565b60ff19831686528115158202860193506200054d565b6200052285620004b8565b5f5b83811015620005455781548189015260018201915060208101905062000524565b838801955050505b50505092915050565b5f620005638284620004ca565b915081905092915050565b5f819050919050565b62000582816200056e565b82525050565b620005938162000280565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620005c48262000599565b9050919050565b620005d681620005b8565b82525050565b5f60a082019050620005f15f83018862000577565b62000600602083018762000577565b6200060f604083018662000577565b6200061e606083018562000588565b6200062d6080830184620005cb565b9695505050505050565b60805160a05160c0516115b0620006625f395f6106d301525f61069f01525f61067a01526115b05ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806340c10f191161008a57806395d89b411161006457806395d89b4114610225578063a9059cbb14610243578063d505accf14610273578063dd62ed3e1461028f576100cd565b806340c10f19146101a957806370a08231146101c55780637ecebe00146101f5576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102bf565b6040516100e69190610e03565b60405180910390f35b61010960048036038101906101049190610eb4565b61034a565b6040516101169190610f0c565b60405180910390f35b610127610437565b6040516101349190610f34565b60405180910390f35b61015760048036038101906101529190610f4d565b61043d565b6040516101649190610f0c565b60405180910390f35b610175610678565b6040516101829190610fb8565b60405180910390f35b61019361069c565b6040516101a09190610fe9565b60405180910390f35b6101c360048036038101906101be9190610eb4565b6106f8565b005b6101df60048036038101906101da9190611002565b610754565b6040516101ec9190610f34565b60405180910390f35b61020f600480360381019061020a9190611002565b610769565b60405161021c9190610f34565b60405180910390f35b61022d61077e565b60405161023a9190610e03565b60405180910390f35b61025d60048036038101906102589190610eb4565b61080a565b60405161026a9190610f0c565b60405180910390f35b61028d60048036038101906102889190611081565b610917565b005b6102a960048036038101906102a4919061111e565b610c04565b6040516102b69190610f34565b60405180910390f35b5f80546102cb90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546102f790611189565b80156103425780601f1061031957610100808354040283529160200191610342565b820191905f5260205f20905b81548152906001019060200180831161032557829003601f168201915b505050505081565b5f8160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104259190610f34565b60405180910390a36001905092915050565b60025481565b5f8060045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461056a5782816104ed91906111e6565b60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8260035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105b691906111e6565b925050819055508260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516106649190610f34565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f000000000000000000000000000000000000000000000000000000000000000046146106d1576106cc610c24565b6106f3565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b6107028282610cae565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516107489190610f34565b60405180910390a25050565b6003602052805f5260405f205f915090505481565b6005602052805f5260405f205f915090505481565b6001805461078b90611189565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790611189565b80156108025780601f106107d957610100808354040283529160200191610802565b820191905f5260205f20905b8154815290600101906020018083116107e557829003601f168201915b505050505081565b5f8160035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461085791906111e6565b925050819055508160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109059190610f34565b60405180910390a36001905092915050565b4284101561095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190611263565b60405180910390fd5b5f600161096561069c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60055f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b6040516020016109ea96959493929190611290565b60405160208183030381529060405280519060200120604051602001610a11929190611363565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051610a469493929190611399565b6020604051602081039080840390855afa158015610a66573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ad957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611426565b60405180910390fd5b8560045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610bf39190610f34565b60405180910390a350505050505050565b6004602052815f5260405f20602052805f5260405f205f91509150505481565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610c5491906114e0565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610c939594939291906114f6565b60405160208183030381529060405280519060200120905090565b8060025f828254610cbf9190611547565b925050819055508060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d6d9190610f34565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015610db0578082015181840152602081019050610d95565b5f8484015250505050565b5f601f19601f8301169050919050565b5f610dd582610d79565b610ddf8185610d83565b9350610def818560208601610d93565b610df881610dbb565b840191505092915050565b5f6020820190508181035f830152610e1b8184610dcb565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e5082610e27565b9050919050565b610e6081610e46565b8114610e6a575f80fd5b50565b5f81359050610e7b81610e57565b92915050565b5f819050919050565b610e9381610e81565b8114610e9d575f80fd5b50565b5f81359050610eae81610e8a565b92915050565b5f8060408385031215610eca57610ec9610e23565b5b5f610ed785828601610e6d565b9250506020610ee885828601610ea0565b9150509250929050565b5f8115159050919050565b610f0681610ef2565b82525050565b5f602082019050610f1f5f830184610efd565b92915050565b610f2e81610e81565b82525050565b5f602082019050610f475f830184610f25565b92915050565b5f805f60608486031215610f6457610f63610e23565b5b5f610f7186828701610e6d565b9350506020610f8286828701610e6d565b9250506040610f9386828701610ea0565b9150509250925092565b5f60ff82169050919050565b610fb281610f9d565b82525050565b5f602082019050610fcb5f830184610fa9565b92915050565b5f819050919050565b610fe381610fd1565b82525050565b5f602082019050610ffc5f830184610fda565b92915050565b5f6020828403121561101757611016610e23565b5b5f61102484828501610e6d565b91505092915050565b61103681610f9d565b8114611040575f80fd5b50565b5f813590506110518161102d565b92915050565b61106081610fd1565b811461106a575f80fd5b50565b5f8135905061107b81611057565b92915050565b5f805f805f805f60e0888a03121561109c5761109b610e23565b5b5f6110a98a828b01610e6d565b97505060206110ba8a828b01610e6d565b96505060406110cb8a828b01610ea0565b95505060606110dc8a828b01610ea0565b94505060806110ed8a828b01611043565b93505060a06110fe8a828b0161106d565b92505060c061110f8a828b0161106d565b91505092959891949750929550565b5f806040838503121561113457611133610e23565b5b5f61114185828601610e6d565b925050602061115285828601610e6d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806111a057607f821691505b6020821081036111b3576111b261115c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f082610e81565b91506111fb83610e81565b9250828203905081811115611213576112126111b9565b5b92915050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f61124d601783610d83565b915061125882611219565b602082019050919050565b5f6020820190508181035f83015261127a81611241565b9050919050565b61128a81610e46565b82525050565b5f60c0820190506112a35f830189610fda565b6112b06020830188611281565b6112bd6040830187611281565b6112ca6060830186610f25565b6112d76080830185610f25565b6112e460a0830184610f25565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f61132d6002836112ef565b9150611338826112f9565b600282019050919050565b5f819050919050565b61135d61135882610fd1565b611343565b82525050565b5f61136d82611321565b9150611379828561134c565b602082019150611389828461134c565b6020820191508190509392505050565b5f6080820190506113ac5f830187610fda565b6113b96020830186610fa9565b6113c66040830185610fda565b6113d36060830184610fda565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f611410600e83610d83565b915061141b826113dc565b602082019050919050565b5f6020820190508181035f83015261143d81611404565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815461146c81611189565b6114768186611444565b9450600182165f811461149057600181146114a5576114d7565b60ff19831686528115158202860193506114d7565b6114ae8561144e565b5f5b838110156114cf578154818901526001820191506020810190506114b0565b838801955050505b50505092915050565b5f6114eb8284611460565b915081905092915050565b5f60a0820190506115095f830188610fda565b6115166020830187610fda565b6115236040830186610fda565b6115306060830185610f25565b61153d6080830184611281565b9695505050505050565b5f61155182610e81565b915061155c83610e81565b9250828201905080821115611574576115736111b9565b5b9291505056fea264697066735822122088b82cac4f015144f3e0155de8794578983afeab3f8e52677bc38859aea688e064736f6c63430008160033", } // SolmateERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/foundry.toml b/contracts/foundry.toml index aaa72f417..d26fb4b95 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -2,7 +2,7 @@ fuzz_runs = 1024 ignored_error_codes = [1878, 5574] evm_version = 'shanghai' -solc_version = '0.8.21' +solc_version = '0.8.22' cache = true force = false optimizer = false diff --git a/contracts/hardhat.config.js b/contracts/hardhat.config.js index 91a374be7..f5bebd7ec 100644 --- a/contracts/hardhat.config.js +++ b/contracts/hardhat.config.js @@ -27,7 +27,7 @@ /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: "0.8.18", + solidity: "0.8.22", defaultNetwork: "localhost", networks: { hardhat: {}, diff --git a/contracts/src/cosmos/CosmosTypes.sol b/contracts/src/cosmos/CosmosTypes.sol index 559bd213f..d081d06ec 100644 --- a/contracts/src/cosmos/CosmosTypes.sol +++ b/contracts/src/cosmos/CosmosTypes.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; /** * @dev This library contains types used by the Cosmos module. @@ -64,7 +64,10 @@ library Cosmos { */ contract CosmosTypes { function coin(Cosmos.Coin calldata) public pure {} + function pageRequest(Cosmos.PageRequest calldata) public pure {} + function pageResponse(Cosmos.PageResponse calldata) public pure {} + function codecAny(Cosmos.CodecAny calldata) public pure {} } diff --git a/contracts/src/cosmos/precompile/Bank.sol b/contracts/src/cosmos/precompile/Bank.sol index 6a618cc45..e9f997c5c 100644 --- a/contracts/src/cosmos/precompile/Bank.sol +++ b/contracts/src/cosmos/precompile/Bank.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/Distribution.sol b/contracts/src/cosmos/precompile/Distribution.sol index e959fe8a3..b1570610e 100644 --- a/contracts/src/cosmos/precompile/Distribution.sol +++ b/contracts/src/cosmos/precompile/Distribution.sol @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/Governance.sol b/contracts/src/cosmos/precompile/Governance.sol index 009872a5b..e52efee5c 100644 --- a/contracts/src/cosmos/precompile/Governance.sol +++ b/contracts/src/cosmos/precompile/Governance.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/Staking.sol b/contracts/src/cosmos/precompile/Staking.sol index 26750e829..4af2eadbd 100644 --- a/contracts/src/cosmos/precompile/Staking.sol +++ b/contracts/src/cosmos/precompile/Staking.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {Cosmos} from "../CosmosTypes.sol"; diff --git a/contracts/src/cosmos/precompile/examples/Deploy.s.sol b/contracts/src/cosmos/precompile/examples/Deploy.s.sol index 112fc0621..b84fb7a45 100644 --- a/contracts/src/cosmos/precompile/examples/Deploy.s.sol +++ b/contracts/src/cosmos/precompile/examples/Deploy.s.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import "../../../../lib/forge-std/src/Script.sol"; import "../../../../lib/forge-std/src/console2.sol"; diff --git a/contracts/src/cosmos/precompile/examples/LiquidStaking.sol b/contracts/src/cosmos/precompile/examples/LiquidStaking.sol index bd41b67dd..60c34f3d2 100644 --- a/contracts/src/cosmos/precompile/examples/LiquidStaking.sol +++ b/contracts/src/cosmos/precompile/examples/LiquidStaking.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.17; +pragma solidity 0.8.22; import {IStakingModule} from "../Staking.sol"; import {ERC20} from "../../../../lib/ERC20.sol"; diff --git a/contracts/src/testing/ConsumeGas.sol b/contracts/src/testing/ConsumeGas.sol index 6cf3d822b..7430584c9 100644 --- a/contracts/src/testing/ConsumeGas.sol +++ b/contracts/src/testing/ConsumeGas.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; contract ConsumeGas { event GasConsumed(uint256 gasUsed); diff --git a/contracts/src/testing/SolmateERC20.sol b/contracts/src/testing/SolmateERC20.sol index 7069f8398..0ba13ed56 100644 --- a/contracts/src/testing/SolmateERC20.sol +++ b/contracts/src/testing/SolmateERC20.sol @@ -23,7 +23,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.4; +pragma solidity 0.8.22; import {ERC20} from "../../lib/ERC20.sol"; diff --git a/cosmos/config/mocks/app_options.go b/cosmos/config/mocks/app_options.go index 75bd3c1a4..9c73a94b2 100644 --- a/cosmos/config/mocks/app_options.go +++ b/cosmos/config/mocks/app_options.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/go.sum b/cosmos/go.sum index 69148a48e..0032989a3 100644 --- a/cosmos/go.sum +++ b/cosmos/go.sum @@ -260,6 +260,7 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= diff --git a/cosmos/lib/ante/eject.go b/cosmos/runtime/ante/ante.go similarity index 53% rename from cosmos/lib/ante/eject.go rename to cosmos/runtime/ante/ante.go index a8ed64abd..367127ab9 100644 --- a/cosmos/lib/ante/eject.go +++ b/cosmos/runtime/ante/ante.go @@ -21,51 +21,18 @@ package ante import ( - "errors" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/ante" - "pkg.berachain.dev/polaris/cosmos/x/evm/types" - "pkg.berachain.dev/polaris/eth/common" - "pkg.berachain.dev/polaris/lib/utils" + "pkg.berachain.dev/polaris/cosmos/txpool" ) -const numBlocksWait = 10 - // NewAnteHandler creates a new instance of AnteHandler with EjectOnRecheckTxDecorator. -func NewAnteHandler() sdk.AnteHandler { +func NewAnteHandler(mempool *txpool.Mempool) sdk.AnteHandler { anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), - &EjectOnRecheckTxDecorator{ - seen: make(map[common.Hash]uint64), - }, + mempool, } return sdk.ChainAnteDecorators(anteDecorators...) } - -// EjectOnRecheckTxDecorator will return an error if the context is a recheck tx. -// This is used to forcibly eject transactions from the CometBFT mempool after they -// have been passed down to the application, as we want to prevent the comet mempool -// from growing in size. -type EjectOnRecheckTxDecorator struct { - seen map[common.Hash]uint64 -} - -// Antehandle implements sdk.AnteHandler. -func (e *EjectOnRecheckTxDecorator) AnteHandle( - ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler, -) (sdk.Context, error) { - msgs := tx.GetMsgs() - if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); ok { - hash := wet.Unwrap().Hash() - e.seen[hash]++ - if e.seen[hash] > numBlocksWait { - delete(e.seen, hash) // prevent leak - return ctx, errors.New("recheck tx") - } - } - - return next(ctx, tx, simulate) -} diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index 8ed6635e2..a20f2c223 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -32,9 +32,9 @@ import ( "github.com/ethereum/go-ethereum/beacon/engine" - antelib "pkg.berachain.dev/polaris/cosmos/lib/ante" libtx "pkg.berachain.dev/polaris/cosmos/lib/tx" "pkg.berachain.dev/polaris/cosmos/miner" + antelib "pkg.berachain.dev/polaris/cosmos/runtime/ante" "pkg.berachain.dev/polaris/cosmos/runtime/comet" "pkg.berachain.dev/polaris/cosmos/txpool" evmkeeper "pkg.berachain.dev/polaris/cosmos/x/evm/keeper" @@ -110,8 +110,7 @@ func (p *Polaris) Build(app CosmosApp, ek EVMKeeper) error { return err } - // Set the ante handler to nil, since it is not needed. - app.SetAnteHandler(antelib.NewAnteHandler()) + app.SetAnteHandler(antelib.NewAnteHandler(p.WrappedTxPool)) return nil } diff --git a/cosmos/txpool/ante.go b/cosmos/txpool/ante.go new file mode 100644 index 000000000..11baff7f7 --- /dev/null +++ b/cosmos/txpool/ante.go @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2023, Berachain Foundation. All rights reserved. +// Use of this software is govered by the Business Source License included +// in the LICENSE file of this repository and at www.mariadb.com/bsl11. +// +// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY +// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER +// VERSIONS OF THE LICENSED WORK. +// +// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF +// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF +// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE). +// +// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +// TITLE. + +package txpool + +import ( + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/ethereum/go-ethereum/core/txpool" + + "pkg.berachain.dev/polaris/cosmos/x/evm/types" + coretypes "pkg.berachain.dev/polaris/eth/core/types" + "pkg.berachain.dev/polaris/lib/utils" +) + +// AnteHandle implements sdk.AnteHandler. +// It is used to determine whether transactions should be ejected +// from the comet mempool. +func (m *Mempool) AnteHandle( + ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler, +) (sdk.Context, error) { + msgs := tx.GetMsgs() + + // We only want to eject transactions from comet on recheck. + if ctx.ExecMode() == sdk.ExecModeReCheck { + if wet, ok := utils.GetAs[*types.WrappedEthereumTransaction](msgs[0]); ok { + if m.shouldEject(wet.Unwrap()) { + return ctx, errors.New("eject from comet mempool") + } + } + } + return next(ctx, tx, simulate) +} + +// shouldEject returns true if the transaction should be ejected from the CometBFT mempool. +func (m *Mempool) shouldEject(tx *coretypes.Transaction) bool { + txHash := tx.Hash() + // Ejection conditions + // 1. If the transaction has been included in a block. + // TODO: we should add somemore conditons later. + return m.txpool.Status(txHash) == txpool.TxStatusIncluded +} diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index a3039799e..e653e1e4a 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -49,6 +49,11 @@ type Lifecycle interface { Stop() error } +// GethTxPool is used for generating mocks. +type GethTxPool interface { + eth.TxPool +} + // Mempool is a mempool that adheres to the cosmos mempool interface. // It purposefully does not implement `Select` or `Remove` as the purpose of this mempool // is to allow for transactions coming in from CometBFT's gossip to be added to the underlying diff --git a/cosmos/txpool/mocks/geth_tx_pool.go b/cosmos/txpool/mocks/geth_tx_pool.go index 13e883702..1134b2a4b 100644 --- a/cosmos/txpool/mocks/geth_tx_pool.go +++ b/cosmos/txpool/mocks/geth_tx_pool.go @@ -1,9 +1,13 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks import ( + common "github.com/ethereum/go-ethereum/common" core "github.com/ethereum/go-ethereum/core" + + coretxpool "github.com/ethereum/go-ethereum/core/txpool" + event "github.com/ethereum/go-ethereum/event" mock "github.com/stretchr/testify/mock" @@ -70,6 +74,48 @@ func (_c *GethTxPool_Add_Call) RunAndReturn(run func([]*types.Transaction, bool, return _c } +// Has provides a mock function with given fields: hash +func (_m *GethTxPool) Has(hash common.Hash) bool { + ret := _m.Called(hash) + + var r0 bool + if rf, ok := ret.Get(0).(func(common.Hash) bool); ok { + r0 = rf(hash) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// GethTxPool_Has_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Has' +type GethTxPool_Has_Call struct { + *mock.Call +} + +// Has is a helper method to define mock.On call +// - hash common.Hash +func (_e *GethTxPool_Expecter) Has(hash interface{}) *GethTxPool_Has_Call { + return &GethTxPool_Has_Call{Call: _e.mock.On("Has", hash)} +} + +func (_c *GethTxPool_Has_Call) Run(run func(hash common.Hash)) *GethTxPool_Has_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash)) + }) + return _c +} + +func (_c *GethTxPool_Has_Call) Return(_a0 bool) *GethTxPool_Has_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GethTxPool_Has_Call) RunAndReturn(run func(common.Hash) bool) *GethTxPool_Has_Call { + _c.Call.Return(run) + return _c +} + // Stats provides a mock function with given fields: func (_m *GethTxPool) Stats() (int, int) { ret := _m.Called() @@ -121,6 +167,48 @@ func (_c *GethTxPool_Stats_Call) RunAndReturn(run func() (int, int)) *GethTxPool return _c } +// Status provides a mock function with given fields: hash +func (_m *GethTxPool) Status(hash common.Hash) coretxpool.TxStatus { + ret := _m.Called(hash) + + var r0 coretxpool.TxStatus + if rf, ok := ret.Get(0).(func(common.Hash) coretxpool.TxStatus); ok { + r0 = rf(hash) + } else { + r0 = ret.Get(0).(coretxpool.TxStatus) + } + + return r0 +} + +// GethTxPool_Status_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Status' +type GethTxPool_Status_Call struct { + *mock.Call +} + +// Status is a helper method to define mock.On call +// - hash common.Hash +func (_e *GethTxPool_Expecter) Status(hash interface{}) *GethTxPool_Status_Call { + return &GethTxPool_Status_Call{Call: _e.mock.On("Status", hash)} +} + +func (_c *GethTxPool_Status_Call) Run(run func(hash common.Hash)) *GethTxPool_Status_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash)) + }) + return _c +} + +func (_c *GethTxPool_Status_Call) Return(_a0 coretxpool.TxStatus) *GethTxPool_Status_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GethTxPool_Status_Call) RunAndReturn(run func(common.Hash) coretxpool.TxStatus) *GethTxPool_Status_Call { + _c.Call.Return(run) + return _c +} + // SubscribeNewTxsEvent provides a mock function with given fields: _a0 func (_m *GethTxPool) SubscribeNewTxsEvent(_a0 chan<- core.NewTxsEvent) event.Subscription { ret := _m.Called(_a0) diff --git a/cosmos/txpool/mocks/lifecycle.go b/cosmos/txpool/mocks/lifecycle.go index 10149b667..ea092e3e2 100644 --- a/cosmos/txpool/mocks/lifecycle.go +++ b/cosmos/txpool/mocks/lifecycle.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/sdk_tx.go b/cosmos/txpool/mocks/sdk_tx.go index 7dada2b96..ae28d4c08 100644 --- a/cosmos/txpool/mocks/sdk_tx.go +++ b/cosmos/txpool/mocks/sdk_tx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/subscription.go b/cosmos/txpool/mocks/subscription.go index ce56bd877..4f9f4703b 100644 --- a/cosmos/txpool/mocks/subscription.go +++ b/cosmos/txpool/mocks/subscription.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_broadcaster.go b/cosmos/txpool/mocks/tx_broadcaster.go index ad301bbf8..c85399b9a 100644 --- a/cosmos/txpool/mocks/tx_broadcaster.go +++ b/cosmos/txpool/mocks/tx_broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_serializer.go b/cosmos/txpool/mocks/tx_serializer.go index 5cf02ba74..d15bece59 100644 --- a/cosmos/txpool/mocks/tx_serializer.go +++ b/cosmos/txpool/mocks/tx_serializer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/cosmos/txpool/mocks/tx_sub_provider.go b/cosmos/txpool/mocks/tx_sub_provider.go index 92f098976..d7a69f443 100644 --- a/cosmos/txpool/mocks/tx_sub_provider.go +++ b/cosmos/txpool/mocks/tx_sub_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/e2e/testapp/go.sum b/e2e/testapp/go.sum index c9f92066a..889a8f6f8 100644 --- a/e2e/testapp/go.sum +++ b/e2e/testapp/go.sum @@ -426,6 +426,7 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= diff --git a/eth/core/state/journal/mocks/accesslist.go b/eth/core/state/journal/mocks/accesslist.go index 7ed5837f9..a847df855 100644 --- a/eth/core/state/journal/mocks/accesslist.go +++ b/eth/core/state/journal/mocks/accesslist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/log.go b/eth/core/state/journal/mocks/log.go index 709639650..706346a32 100644 --- a/eth/core/state/journal/mocks/log.go +++ b/eth/core/state/journal/mocks/log.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/refund.go b/eth/core/state/journal/mocks/refund.go index d8cb61ad8..8a41601a3 100644 --- a/eth/core/state/journal/mocks/refund.go +++ b/eth/core/state/journal/mocks/refund.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destruct_state_plugin.go b/eth/core/state/journal/mocks/self_destruct_state_plugin.go index 59d14f165..92757402d 100644 --- a/eth/core/state/journal/mocks/self_destruct_state_plugin.go +++ b/eth/core/state/journal/mocks/self_destruct_state_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/self_destructs.go b/eth/core/state/journal/mocks/self_destructs.go index b38c383a8..c611cce41 100644 --- a/eth/core/state/journal/mocks/self_destructs.go +++ b/eth/core/state/journal/mocks/self_destructs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/journal/mocks/transient_storage.go b/eth/core/state/journal/mocks/transient_storage.go index c3e3bda1e..cb80ff594 100644 --- a/eth/core/state/journal/mocks/transient_storage.go +++ b/eth/core/state/journal/mocks/transient_storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/plugin.go b/eth/core/state/mocks/plugin.go index c624b3d00..bf7fd72d0 100644 --- a/eth/core/state/mocks/plugin.go +++ b/eth/core/state/mocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/polar_state_db.go b/eth/core/state/mocks/polar_state_db.go index 8383e6889..d08ee01ea 100644 --- a/eth/core/state/mocks/polar_state_db.go +++ b/eth/core/state/mocks/polar_state_db.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/core/state/mocks/precompile_plugin.go b/eth/core/state/mocks/precompile_plugin.go index b066d0422..9ad9ea4e2 100644 --- a/eth/core/state/mocks/precompile_plugin.go +++ b/eth/core/state/mocks/precompile_plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.4. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package mocks diff --git a/eth/eth.go b/eth/eth.go index 39eb5868e..8455fabb5 100644 --- a/eth/eth.go +++ b/eth/eth.go @@ -24,6 +24,7 @@ import ( "fmt" "net/http" + "github.com/ethereum/go-ethereum/core/txpool" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/miner" @@ -50,6 +51,8 @@ type ( Add([]*coretypes.Transaction, bool, bool) []error Stats() (int, int) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription + Status(hash common.Hash) txpool.TxStatus + Has(hash common.Hash) bool } // ExecutionLayerNode is the entrypoint for the evm execution environment. diff --git a/eth/go.sum b/eth/go.sum index c80f4be75..26f488115 100644 --- a/eth/go.sum +++ b/eth/go.sum @@ -69,6 +69,7 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= From cca0785543a313828f38ae9e3a0dbbd7b4875cf3 Mon Sep 17 00:00:00 2001 From: Devon Bear Date: Tue, 31 Oct 2023 14:07:31 -0400 Subject: [PATCH 7/7] based ante handler --- cosmos/runtime/runtime.go | 2 +- cosmos/txpool/ante.go | 26 +++++++++++++++++++++++--- cosmos/txpool/mempool.go | 5 ++++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/cosmos/runtime/runtime.go b/cosmos/runtime/runtime.go index a20f2c223..324386800 100644 --- a/cosmos/runtime/runtime.go +++ b/cosmos/runtime/runtime.go @@ -93,7 +93,7 @@ func New( } // Wrap the geth miner and txpool with the cosmos miner and txpool. - p.WrappedTxPool = txpool.New(p.TxPool()) + p.WrappedTxPool = txpool.New(p.Blockchain(), p.TxPool()) p.WrappedMiner = miner.New(p.Miner()) return p diff --git a/cosmos/txpool/ante.go b/cosmos/txpool/ante.go index 11baff7f7..346d6c198 100644 --- a/cosmos/txpool/ante.go +++ b/cosmos/txpool/ante.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/core/txpool" "pkg.berachain.dev/polaris/cosmos/x/evm/types" + "pkg.berachain.dev/polaris/eth/common" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/lib/utils" ) @@ -53,9 +54,28 @@ func (m *Mempool) AnteHandle( // shouldEject returns true if the transaction should be ejected from the CometBFT mempool. func (m *Mempool) shouldEject(tx *coretypes.Transaction) bool { - txHash := tx.Hash() + if tx == nil { + return false + } + txStatus := m.txStatus(tx.Hash()) + // Ejection conditions // 1. If the transaction has been included in a block. - // TODO: we should add somemore conditons later. - return m.txpool.Status(txHash) == txpool.TxStatusIncluded + // 2. If the transaction is unknown to the node. + return txStatus == txpool.TxStatusIncluded || txStatus == txpool.TxStatusUnknown +} + +// txStatus returns the status of the transaction. +func (m *Mempool) txStatus(hash common.Hash) txpool.TxStatus { + // Looking for the transaction in txpool first. + status := m.txpool.Status(hash) + + // If the transaction is unknown to the pool, try looking it up locally. + if status == txpool.TxStatusUnknown { + lookup := m.chain.GetTransactionLookup(hash) + if lookup != nil { + status = txpool.TxStatusIncluded + } + } + return status } diff --git a/cosmos/txpool/mempool.go b/cosmos/txpool/mempool.go index e653e1e4a..db1df4166 100644 --- a/cosmos/txpool/mempool.go +++ b/cosmos/txpool/mempool.go @@ -33,6 +33,7 @@ import ( "pkg.berachain.dev/polaris/cosmos/x/evm/types" "pkg.berachain.dev/polaris/eth" + "pkg.berachain.dev/polaris/eth/core" coretypes "pkg.berachain.dev/polaris/eth/core/types" "pkg.berachain.dev/polaris/lib/utils" ) @@ -60,13 +61,15 @@ type GethTxPool interface { // geth txpool during `CheckTx`, that is the only purpose of `Mempool“. type Mempool struct { txpool eth.TxPool + chain core.ChainReader handler Lifecycle } // NewMempool creates a new Mempool. -func New(txpool eth.TxPool) *Mempool { +func New(chain core.ChainReader, txpool eth.TxPool) *Mempool { return &Mempool{ txpool: txpool, + chain: chain, } }