mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 12:17:28 +00:00 
			
		
		
		
	migrate code and fix go mod
This commit is contained in:
		
							parent
							
								
									5207a300ad
								
							
						
					
					
						commit
						dde7485ee9
					
				
							
								
								
									
										45
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								Makefile
									
									
									
									
									
								
							@ -1,8 +1,10 @@
 | 
			
		||||
################################################################################
 | 
			
		||||
###                             Project Info                                 ###
 | 
			
		||||
################################################################################
 | 
			
		||||
PROJECT_NAME := kava# unique namespace for project
 | 
			
		||||
 | 
			
		||||
PROJECT_NAME := 0g-chain# unique namespace for project
 | 
			
		||||
MAIN_ENTRY := ./cmd
 | 
			
		||||
BINARY_NAME := 0gchaind
 | 
			
		||||
DOCKER_IMAGE_NAME := 0glabs/0g-chain
 | 
			
		||||
GO_BIN ?= go
 | 
			
		||||
 | 
			
		||||
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
 | 
			
		||||
@ -37,7 +39,7 @@ print-git-info:
 | 
			
		||||
 | 
			
		||||
.PHONY: print-version
 | 
			
		||||
print-version:
 | 
			
		||||
	@echo "kava $(VERSION)\ntendermint $(TENDERMINT_VERSION)\ncosmos $(COSMOS_SDK_VERSION)"
 | 
			
		||||
	@echo "$(BINARY_NAME) $(VERSION)\ntendermint $(TENDERMINT_VERSION)\ncosmos $(COSMOS_SDK_VERSION)"
 | 
			
		||||
 | 
			
		||||
################################################################################
 | 
			
		||||
###                             Project Settings                             ###
 | 
			
		||||
@ -45,7 +47,7 @@ print-version:
 | 
			
		||||
LEDGER_ENABLED ?= true
 | 
			
		||||
DOCKER:=docker
 | 
			
		||||
DOCKER_BUF := $(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace bufbuild/buf
 | 
			
		||||
HTTPS_GIT := https://github.com/Kava-Labs/kava.git
 | 
			
		||||
HTTPS_GIT := https://github.com/0glabs/0g-chain.git
 | 
			
		||||
 | 
			
		||||
################################################################################
 | 
			
		||||
###                             Machine Info                                 ###
 | 
			
		||||
@ -142,8 +144,8 @@ build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags))
 | 
			
		||||
 | 
			
		||||
# process linker flags
 | 
			
		||||
 | 
			
		||||
ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=kava \
 | 
			
		||||
		  -X github.com/cosmos/cosmos-sdk/version.AppName=kava \
 | 
			
		||||
ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=$(PROJECT_NAME) \
 | 
			
		||||
		  -X github.com/cosmos/cosmos-sdk/version.AppName=$(PROJECT_NAME) \
 | 
			
		||||
		  -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION_NUMBER) \
 | 
			
		||||
		  -X github.com/cosmos/cosmos-sdk/version.Commit=$(GIT_COMMIT) \
 | 
			
		||||
		  -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)" \
 | 
			
		||||
@ -188,15 +190,15 @@ all: install
 | 
			
		||||
 | 
			
		||||
build: go.sum
 | 
			
		||||
ifeq ($(OS), Windows_NT)
 | 
			
		||||
	$(GO_BIN) build -mod=readonly $(BUILD_FLAGS) -o out/$(shell $(GO_BIN) env GOOS)/kava.exe ./cmd/kava
 | 
			
		||||
	$(GO_BIN) build -mod=readonly $(BUILD_FLAGS) -o out/$(shell $(GO_BIN) env GOOS)/$(BINARY_NAME).exe $(MAIN_ENTRY)
 | 
			
		||||
else
 | 
			
		||||
	$(GO_BIN) build -mod=readonly $(BUILD_FLAGS) -o out/$(shell $(GO_BIN) env GOOS)/kava ./cmd/kava
 | 
			
		||||
	$(GO_BIN) build -mod=readonly $(BUILD_FLAGS) -o out/$(shell $(GO_BIN) env GOOS)/$(BINARY_NAME) $(MAIN_ENTRY)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
build-linux: go.sum
 | 
			
		||||
	LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build
 | 
			
		||||
 | 
			
		||||
# build on rocksdb-backed kava on macOS with shared libs from brew
 | 
			
		||||
# build on rocksdb-backed 0gchaind on macOS with shared libs from brew
 | 
			
		||||
# this assumes you are on macOS & these deps have been installed with brew:
 | 
			
		||||
# rocksdb, snappy, lz4, and zstd
 | 
			
		||||
# use like `make build-rocksdb-brew COSMOS_BUILD_OPTIONS=rocksdb`
 | 
			
		||||
@ -205,7 +207,7 @@ build-rocksdb-brew:
 | 
			
		||||
	export CGO_LDFLAGS := -L$(shell brew --prefix rocksdb)/lib -lrocksdb -lstdc++ -lm -lz -L$(shell brew --prefix snappy)/lib -L$(shell brew --prefix lz4)/lib -L$(shell brew --prefix zstd)/lib
 | 
			
		||||
 | 
			
		||||
install: go.sum
 | 
			
		||||
	$(GO_BIN) install -mod=readonly $(BUILD_FLAGS) ./cmd/kava
 | 
			
		||||
	$(GO_BIN) install -mod=readonly $(BUILD_FLAGS) $(MAIN_ENTRY)
 | 
			
		||||
 | 
			
		||||
########################################
 | 
			
		||||
### Tools & dependencies
 | 
			
		||||
@ -227,6 +229,7 @@ go.sum: go.mod
 | 
			
		||||
# Set to exclude riot links as they trigger false positives
 | 
			
		||||
link-check:
 | 
			
		||||
	@$(GO_BIN) get -u github.com/raviqqe/liche@f57a5d1c5be4856454cb26de155a65a4fd856ee3
 | 
			
		||||
	# TODO: replace kava in following line with project name
 | 
			
		||||
	liche -r . --exclude "^http://127.*|^https://riot.im/app*|^http://kava-testnet*|^https://testnet-dex*|^https://kava3.data.kava.io*|^https://ipfs.io*|^https://apps.apple.com*|^https://kava.quicksync.io*"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -241,26 +244,26 @@ format:
 | 
			
		||||
	find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs misspell -w
 | 
			
		||||
	find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/tendermint
 | 
			
		||||
	find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/cosmos/cosmos-sdk
 | 
			
		||||
	find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/kava-labs/kava
 | 
			
		||||
	find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs goimports -w -local github.com/0glabs/0g-chain
 | 
			
		||||
.PHONY: format
 | 
			
		||||
 | 
			
		||||
###############################################################################
 | 
			
		||||
###                                Localnet                                 ###
 | 
			
		||||
###############################################################################
 | 
			
		||||
 | 
			
		||||
# Build docker image and tag as kava/kava:local
 | 
			
		||||
# Build docker image and tag as 0glabs/0g-chain:local
 | 
			
		||||
docker-build:
 | 
			
		||||
	DOCKER_BUILDKIT=1 $(DOCKER) build -t kava/kava:local .
 | 
			
		||||
	DOCKER_BUILDKIT=1 $(DOCKER) build -t $(DOCKER_IMAGE_NAME):local .
 | 
			
		||||
 | 
			
		||||
docker-build-rocksdb:
 | 
			
		||||
	DOCKER_BUILDKIT=1 $(DOCKER) build -f Dockerfile-rocksdb -t kava/kava:local .
 | 
			
		||||
	DOCKER_BUILDKIT=1 $(DOCKER) build -f Dockerfile-rocksdb -t $(DOCKER_IMAGE_NAME):local .
 | 
			
		||||
 | 
			
		||||
build-docker-local-kava:
 | 
			
		||||
build-docker-local-0gchain:
 | 
			
		||||
	@$(MAKE) -C networks/local
 | 
			
		||||
 | 
			
		||||
# Run a 4-node testnet locally
 | 
			
		||||
localnet-start: build-linux localnet-stop
 | 
			
		||||
	@if ! [ -f build/node0/kvd/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/kvd:Z kava/kavanode testnet --v 4 -o . --starting-ip-address 192.168.10.2 --keyring-backend=test ; fi
 | 
			
		||||
	@if ! [ -f build/node0/kvd/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/kvd:Z $(DOCKER_IMAGE_NAME)-node testnet --v 4 -o . --starting-ip-address 192.168.10.2 --keyring-backend=test ; fi
 | 
			
		||||
	docker-compose up -d
 | 
			
		||||
 | 
			
		||||
localnet-stop:
 | 
			
		||||
@ -269,7 +272,7 @@ localnet-stop:
 | 
			
		||||
# Launch a new single validator chain
 | 
			
		||||
start:
 | 
			
		||||
	./contrib/devnet/init-new-chain.sh
 | 
			
		||||
	kava start
 | 
			
		||||
	$(BINARY_NAME) start
 | 
			
		||||
 | 
			
		||||
#proto-format:
 | 
			
		||||
#@echo "Formatting Protobuf files"
 | 
			
		||||
@ -310,7 +313,7 @@ test:
 | 
			
		||||
	@$(GO_BIN) test $$($(GO_BIN) list ./... | grep -v 'contrib' | grep -v 'tests/e2e')
 | 
			
		||||
 | 
			
		||||
test-rocksdb:
 | 
			
		||||
	@go test -tags=rocksdb ./cmd/kava/opendb
 | 
			
		||||
	@go test -tags=rocksdb $(MAIN_ENTRY)/opendb
 | 
			
		||||
 | 
			
		||||
# Run cli integration tests
 | 
			
		||||
# `-p 4` to use 4 cores, `-tags cli_test` to tell $(GO_BIN) not to ignore the cli package
 | 
			
		||||
@ -326,15 +329,15 @@ test-migrate:
 | 
			
		||||
# This submits an AWS Batch job to run a lot of sims, each within a docker image. Results are uploaded to S3
 | 
			
		||||
start-remote-sims:
 | 
			
		||||
	# build the image used for running sims in, and tag it
 | 
			
		||||
	docker build -f simulations/Dockerfile -t kava/kava-sim:master .
 | 
			
		||||
	docker build -f simulations/Dockerfile -t $(DOCKER_IMAGE_NAME)-sim:master .
 | 
			
		||||
	# push that image to the hub
 | 
			
		||||
	docker push kava/kava-sim:master
 | 
			
		||||
	docker push $(DOCKER_IMAGE_NAME)-sim:master
 | 
			
		||||
	# submit an array job on AWS Batch, using 1000 seeds, spot instances
 | 
			
		||||
	aws batch submit-job \
 | 
			
		||||
		-—job-name "master-$(VERSION)" \
 | 
			
		||||
		-—job-queue “simulation-1-queue-spot" \
 | 
			
		||||
		-—array-properties size=1000 \
 | 
			
		||||
		-—job-definition kava-sim-master \
 | 
			
		||||
		-—job-definition $(BINARY_NAME)-sim-master \
 | 
			
		||||
		-—container-override environment=[{SIM_NAME=master-$(VERSION)}]
 | 
			
		||||
 | 
			
		||||
update-kvtool:
 | 
			
		||||
 | 
			
		||||
@ -32,15 +32,15 @@ import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/staking"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/supply"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/x/auction"
 | 
			
		||||
	"github.com/kava-labs/kava/x/bep3"
 | 
			
		||||
	"github.com/kava-labs/kava/x/cdp"
 | 
			
		||||
	"github.com/kava-labs/kava/x/committee"
 | 
			
		||||
	"github.com/kava-labs/kava/x/incentive"
 | 
			
		||||
	"github.com/kava-labs/kava/x/kavadist"
 | 
			
		||||
	"github.com/kava-labs/kava/x/pricefeed"
 | 
			
		||||
	"github.com/kava-labs/kava/x/swap"
 | 
			
		||||
	validatorvesting "github.com/kava-labs/kava/x/validator-vesting"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/auction"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/bep3"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/cdp"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/incentive"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/kavadist"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/pricefeed"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/swap"
 | 
			
		||||
	validatorvesting "github.com/0glabs/0g-chain/x/validator-vesting"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type StoreKeysPrefixes struct {
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@ import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	sdkmath "cosmossdk.io/math"
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
 | 
			
		||||
	abci "github.com/cometbft/cometbft/abci/types"
 | 
			
		||||
	tmbytes "github.com/cometbft/cometbft/libs/bytes"
 | 
			
		||||
 | 
			
		||||
@ -20,9 +20,9 @@ import (
 | 
			
		||||
	evmtypes "github.com/evmos/ethermint/x/evm/types"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	// bep3types "github.com/kava-labs/kava/x/bep3/types"
 | 
			
		||||
	// pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	// bep3types "github.com/0glabs/0g-chain/x/bep3/types"
 | 
			
		||||
	// pricefeedtypes "github.com/0glabs/0g-chain/x/pricefeed/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMain(m *testing.M) {
 | 
			
		||||
 | 
			
		||||
@ -10,8 +10,8 @@ import (
 | 
			
		||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/ante"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/ante"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ sdk.AnteHandler = (&MockAnteHandler{}).AnteHandle
 | 
			
		||||
 | 
			
		||||
@ -14,8 +14,8 @@ import (
 | 
			
		||||
	evmtypes "github.com/evmos/ethermint/x/evm/types"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/ante"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/ante"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func newMsgGrant(granter sdk.AccAddress, grantee sdk.AccAddress, a authz.Authorization, expiration time.Time) *authz.MsgGrant {
 | 
			
		||||
 | 
			
		||||
@ -33,13 +33,13 @@ import (
 | 
			
		||||
	feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	// cdptypes "github.com/kava-labs/kava/x/cdp/types"
 | 
			
		||||
	evmutilkeeper "github.com/kava-labs/kava/x/evmutil/keeper"
 | 
			
		||||
	evmutiltestutil "github.com/kava-labs/kava/x/evmutil/testutil"
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
	// hardtypes "github.com/kava-labs/kava/x/hard/types"
 | 
			
		||||
	// pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	// cdptypes "github.com/0glabs/0g-chain/x/cdp/types"
 | 
			
		||||
	evmutilkeeper "github.com/0glabs/0g-chain/x/evmutil/keeper"
 | 
			
		||||
	evmutiltestutil "github.com/0glabs/0g-chain/x/evmutil/testutil"
 | 
			
		||||
	evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
	// hardtypes "github.com/0glabs/0g-chain/x/hard/types"
 | 
			
		||||
	// pricefeedtypes "github.com/0glabs/0g-chain/x/pricefeed/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,8 @@ import (
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/ante"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/ante"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func mustParseDecCoins(value string) sdk.DecCoins {
 | 
			
		||||
 | 
			
		||||
@ -12,8 +12,8 @@ import (
 | 
			
		||||
	vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
 | 
			
		||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/ante"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/ante"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestVestingMempoolDecorator_MsgCreateVestingAccount_Unauthorized(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										40
									
								
								app/app.go
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								app/app.go
									
									
									
									
									
								
							@ -105,16 +105,22 @@ import (
 | 
			
		||||
	feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app/ante"
 | 
			
		||||
	kavaparams "github.com/kava-labs/kava/app/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/ante"
 | 
			
		||||
	kavaparams "github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
 | 
			
		||||
	evmutil "github.com/kava-labs/kava/x/evmutil"
 | 
			
		||||
	evmutilkeeper "github.com/kava-labs/kava/x/evmutil/keeper"
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
	evmutil "github.com/0glabs/0g-chain/x/evmutil"
 | 
			
		||||
	evmutilkeeper "github.com/0glabs/0g-chain/x/evmutil/keeper"
 | 
			
		||||
	evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
 | 
			
		||||
	validatorvesting "github.com/kava-labs/kava/x/validator-vesting"
 | 
			
		||||
	validatorvestingrest "github.com/kava-labs/kava/x/validator-vesting/client/rest"
 | 
			
		||||
	validatorvestingtypes "github.com/kava-labs/kava/x/validator-vesting/types"
 | 
			
		||||
	committee "github.com/0glabs/0g-chain/x/committee/v1"
 | 
			
		||||
	committeekeeper "github.com/0glabs/0g-chain/x/committee/v1/keeper"
 | 
			
		||||
	committeetypes "github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
	das "github.com/0glabs/0g-chain/x/das/v1"
 | 
			
		||||
	daskeeper "github.com/0glabs/0g-chain/x/das/v1/keeper"
 | 
			
		||||
	dastypes "github.com/0glabs/0g-chain/x/das/v1/types"
 | 
			
		||||
	validatorvesting "github.com/0glabs/0g-chain/x/validator-vesting"
 | 
			
		||||
	validatorvestingrest "github.com/0glabs/0g-chain/x/validator-vesting/client/rest"
 | 
			
		||||
	validatorvestingtypes "github.com/0glabs/0g-chain/x/validator-vesting/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@ -159,6 +165,8 @@ var (
 | 
			
		||||
		evmutil.AppModuleBasic{},
 | 
			
		||||
		mint.AppModuleBasic{},
 | 
			
		||||
		consensus.AppModuleBasic{},
 | 
			
		||||
		committee.AppModuleBasic{},
 | 
			
		||||
		das.AppModuleBasic{},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// module account permissions
 | 
			
		||||
@ -235,6 +243,8 @@ type App struct {
 | 
			
		||||
	transferKeeper        ibctransferkeeper.Keeper
 | 
			
		||||
	mintKeeper            mintkeeper.Keeper
 | 
			
		||||
	consensusParamsKeeper consensusparamkeeper.Keeper
 | 
			
		||||
	CommitteeKeeper       committeekeeper.Keeper
 | 
			
		||||
	DasKeeper             daskeeper.Keeper
 | 
			
		||||
 | 
			
		||||
	// make scoped keepers public for test purposes
 | 
			
		||||
	ScopedIBCKeeper      capabilitykeeper.ScopedKeeper
 | 
			
		||||
@ -299,6 +309,8 @@ func NewApp(
 | 
			
		||||
		minttypes.StoreKey,
 | 
			
		||||
		consensusparamtypes.StoreKey,
 | 
			
		||||
		crisistypes.StoreKey,
 | 
			
		||||
		committeetypes.StoreKey,
 | 
			
		||||
		dastypes.StoreKey,
 | 
			
		||||
	)
 | 
			
		||||
	tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey, feemarkettypes.TransientKey)
 | 
			
		||||
	memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
 | 
			
		||||
@ -540,6 +552,11 @@ func NewApp(
 | 
			
		||||
	govKeeper.SetLegacyRouter(govRouter)
 | 
			
		||||
	app.govKeeper = *govKeeper
 | 
			
		||||
 | 
			
		||||
	app.CommitteeKeeper = committeekeeper.NewKeeper(
 | 
			
		||||
		keys[committeetypes.StoreKey], appCodec, app.stakingKeeper,
 | 
			
		||||
	)
 | 
			
		||||
	app.DasKeeper = daskeeper.NewKeeper(keys[dastypes.StoreKey], appCodec, app.stakingKeeper)
 | 
			
		||||
 | 
			
		||||
	// create the module manager (Note: Any module instantiated in the module manager that is later modified
 | 
			
		||||
	// must be passed by reference here.)
 | 
			
		||||
	app.mm = module.NewManager(
 | 
			
		||||
@ -599,6 +616,9 @@ func NewApp(
 | 
			
		||||
		evmutiltypes.ModuleName,
 | 
			
		||||
		consensusparamtypes.ModuleName,
 | 
			
		||||
		packetforwardtypes.ModuleName,
 | 
			
		||||
 | 
			
		||||
		committeetypes.ModuleName,
 | 
			
		||||
		dastypes.ModuleName,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// Warning: Some end blockers must run before others. Ensure the dependencies are understood before modifying this list.
 | 
			
		||||
@ -628,6 +648,8 @@ func NewApp(
 | 
			
		||||
		minttypes.ModuleName,
 | 
			
		||||
		consensusparamtypes.ModuleName,
 | 
			
		||||
		packetforwardtypes.ModuleName,
 | 
			
		||||
		committeetypes.ModuleName,
 | 
			
		||||
		dastypes.ModuleName,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// Warning: Some init genesis methods must run before others. Ensure the dependencies are understood before modifying this list
 | 
			
		||||
@ -656,6 +678,8 @@ func NewApp(
 | 
			
		||||
		consensusparamtypes.ModuleName,
 | 
			
		||||
		packetforwardtypes.ModuleName,
 | 
			
		||||
		crisistypes.ModuleName, // runs the invariants at genesis, should run after other modules
 | 
			
		||||
		committeetypes.ModuleName,
 | 
			
		||||
		dastypes.ModuleName,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	app.mm.RegisterInvariants(&app.crisisKeeper)
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ package app
 | 
			
		||||
import (
 | 
			
		||||
	enccodec "github.com/evmos/ethermint/encoding/codec"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// MakeEncodingConfig creates an EncodingConfig and registers the app's types on it.
 | 
			
		||||
 | 
			
		||||
@ -41,7 +41,7 @@ import (
 | 
			
		||||
	feemarketkeeper "github.com/evmos/ethermint/x/feemarket/keeper"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	evmutilkeeper "github.com/kava-labs/kava/x/evmutil/keeper"
 | 
			
		||||
	evmutilkeeper "github.com/0glabs/0g-chain/x/evmutil/keeper"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								chaincfg/coin.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								chaincfg/coin.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
package chaincfg
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	ethaccounts "github.com/ethereum/go-ethereum/accounts"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// Bip44CoinType satisfies EIP84. See https://github.com/ethereum/EIPs/issues/84 for more info.
 | 
			
		||||
	Bip44CoinType uint32 = 60 // TODO: need new coin type for 0g-chain (a0gi)
 | 
			
		||||
 | 
			
		||||
	// BIP44HDPath is the default BIP44 HD path used on Ethereum.
 | 
			
		||||
	BIP44HDPath = ethaccounts.DefaultBaseDerivationPath.String()
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TODO: Implement BIP44CoinType and BIP44HDPath
 | 
			
		||||
// SetBip44CoinType sets the global coin type to be used in hierarchical deterministic wallets.
 | 
			
		||||
func setBip44CoinType(config *sdk.Config) {
 | 
			
		||||
	config.SetCoinType(Bip44CoinType)
 | 
			
		||||
	config.SetPurpose(sdk.Purpose)            // Shared
 | 
			
		||||
	config.SetFullFundraiserPath(BIP44HDPath) //nolint: staticcheck
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								chaincfg/config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								chaincfg/config.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
package chaincfg
 | 
			
		||||
 | 
			
		||||
import sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	AppName   = "0gchain"
 | 
			
		||||
	EnvPrefix = "0GCHAIN"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func SetSDKConfig() *sdk.Config {
 | 
			
		||||
	config := sdk.GetConfig()
 | 
			
		||||
	setBech32Prefixes(config)
 | 
			
		||||
	// setBip44CoinType(config)
 | 
			
		||||
	return config
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								chaincfg/denoms.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								chaincfg/denoms.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
package chaincfg
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"cosmossdk.io/math"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// DisplayDenom defines the denomination displayed to users in client applications.
 | 
			
		||||
	DisplayDenom = "a0gi"
 | 
			
		||||
	// BaseDenom defines to the default denomination used in 0g-chain
 | 
			
		||||
	BaseDenom = "neuron"
 | 
			
		||||
 | 
			
		||||
	BaseDenomUnit = 18
 | 
			
		||||
 | 
			
		||||
	ConversionMultiplier = 1e18
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RegisterDenoms registers the base and display denominations to the SDK.
 | 
			
		||||
func RegisterDenoms() {
 | 
			
		||||
	if err := sdk.RegisterDenom(DisplayDenom, math.LegacyOneDec()); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := sdk.RegisterDenom(BaseDenom, math.LegacyNewDecWithPrec(1, BaseDenomUnit)); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								chaincfg/homedir.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								chaincfg/homedir.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
package chaincfg
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	stdlog "log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	HomeDirName = ".0gchain"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// DefaultNodeHome default home directories for the application daemon
 | 
			
		||||
	DefaultNodeHome string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	userHomeDir, err := os.UserHomeDir()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		stdlog.Printf("Failed to get home dir %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	DefaultNodeHome = filepath.Join(userHomeDir, HomeDirName)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								chaincfg/prefix.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								chaincfg/prefix.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
package chaincfg
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Bech32Prefix defines the Bech32 prefix used for EthAccounts
 | 
			
		||||
	Bech32Prefix = "0g"
 | 
			
		||||
 | 
			
		||||
	// PrefixAccount is the prefix for account keys
 | 
			
		||||
	PrefixAccount = "acc"
 | 
			
		||||
	// PrefixValidator is the prefix for validator keys
 | 
			
		||||
	PrefixValidator = "val"
 | 
			
		||||
	// PrefixConsensus is the prefix for consensus keys
 | 
			
		||||
	PrefixConsensus = "cons"
 | 
			
		||||
	// PrefixPublic is the prefix for public keys
 | 
			
		||||
	PrefixPublic = "pub"
 | 
			
		||||
	// PrefixOperator is the prefix for operator keys
 | 
			
		||||
	PrefixOperator = "oper"
 | 
			
		||||
 | 
			
		||||
	// PrefixAddress is the prefix for addresses
 | 
			
		||||
	PrefixAddress = "addr"
 | 
			
		||||
 | 
			
		||||
	// Bech32PrefixAccAddr defines the Bech32 prefix of an account's address
 | 
			
		||||
	Bech32PrefixAccAddr = Bech32Prefix
 | 
			
		||||
	// Bech32PrefixAccPub defines the Bech32 prefix of an account's public key
 | 
			
		||||
	Bech32PrefixAccPub = Bech32Prefix + PrefixPublic
 | 
			
		||||
	// Bech32PrefixValAddr defines the Bech32 prefix of a validator's operator address
 | 
			
		||||
	Bech32PrefixValAddr = Bech32Prefix + PrefixValidator + PrefixOperator
 | 
			
		||||
	// Bech32PrefixValPub defines the Bech32 prefix of a validator's operator public key
 | 
			
		||||
	Bech32PrefixValPub = Bech32Prefix + PrefixValidator + PrefixOperator + PrefixPublic
 | 
			
		||||
	// Bech32PrefixConsAddr defines the Bech32 prefix of a consensus node address
 | 
			
		||||
	Bech32PrefixConsAddr = Bech32Prefix + PrefixValidator + PrefixConsensus
 | 
			
		||||
	// Bech32PrefixConsPub defines the Bech32 prefix of a consensus node public key
 | 
			
		||||
	Bech32PrefixConsPub = Bech32Prefix + PrefixValidator + PrefixConsensus + PrefixPublic
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// setBech32Prefixes sets the global prefixes to be used when serializing addresses and public keys to Bech32 strings.
 | 
			
		||||
func setBech32Prefixes(config *sdk.Config) {
 | 
			
		||||
	config.SetBech32PrefixForAccount(Bech32PrefixAccAddr, Bech32PrefixAccPub)
 | 
			
		||||
	config.SetBech32PrefixForValidator(Bech32PrefixValAddr, Bech32PrefixValPub)
 | 
			
		||||
	config.SetBech32PrefixForConsensusNode(Bech32PrefixConsAddr, Bech32PrefixConsPub)
 | 
			
		||||
}
 | 
			
		||||
@ -28,7 +28,7 @@ import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/slashing"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/x/staking"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ The Kava gRPC client is a tool for making gRPC queries on a Kava chain.
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
  kavaGrpc "github.com/kava-labs/kava/client/grpc"
 | 
			
		||||
  kavaGrpc "github.com/0glabs/0g-chain/client/grpc"
 | 
			
		||||
)
 | 
			
		||||
grpcUrl := "https://grpc.kava.io:443"
 | 
			
		||||
client, err := kavaGrpc.NewClient(grpcUrl)
 | 
			
		||||
@ -46,7 +46,7 @@ Example: Query Kava module `x/evmutil` for params
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
import (
 | 
			
		||||
  evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
  evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
rsp, err := client.Query.Evmutil.Params(
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,8 @@ package grpc
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/client/grpc/query"
 | 
			
		||||
	"github.com/kava-labs/kava/client/grpc/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/client/grpc/query"
 | 
			
		||||
	"github.com/0glabs/0g-chain/client/grpc/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// KavaGrpcClient enables the usage of kava grpc query clients and query utils
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ package grpc_test
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/client/grpc"
 | 
			
		||||
	"github.com/0glabs/0g-chain/client/grpc"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -24,21 +24,21 @@ import (
 | 
			
		||||
	evmtypes "github.com/evmos/ethermint/x/evm/types"
 | 
			
		||||
	feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
 | 
			
		||||
 | 
			
		||||
	// auctiontypes "github.com/kava-labs/kava/x/auction/types"
 | 
			
		||||
	// bep3types "github.com/kava-labs/kava/x/bep3/types"
 | 
			
		||||
	// cdptypes "github.com/kava-labs/kava/x/cdp/types"
 | 
			
		||||
	// committeetypes "github.com/kava-labs/kava/x/committee/types"
 | 
			
		||||
	// communitytypes "github.com/kava-labs/kava/x/community/types"
 | 
			
		||||
	// earntypes "github.com/kava-labs/kava/x/earn/types"
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
	// hardtypes "github.com/kava-labs/kava/x/hard/types"
 | 
			
		||||
	// incentivetypes "github.com/kava-labs/kava/x/incentive/types"
 | 
			
		||||
	// issuancetypes "github.com/kava-labs/kava/x/issuance/types"
 | 
			
		||||
	// kavadisttypes "github.com/kava-labs/kava/x/kavadist/types"
 | 
			
		||||
	// liquidtypes "github.com/kava-labs/kava/x/liquid/types"
 | 
			
		||||
	// pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
 | 
			
		||||
	// savingstypes "github.com/kava-labs/kava/x/savings/types"
 | 
			
		||||
	// swaptypes "github.com/kava-labs/kava/x/swap/types"
 | 
			
		||||
	// auctiontypes "github.com/0glabs/0g-chain/x/auction/types"
 | 
			
		||||
	// bep3types "github.com/0glabs/0g-chain/x/bep3/types"
 | 
			
		||||
	// cdptypes "github.com/0glabs/0g-chain/x/cdp/types"
 | 
			
		||||
	// committeetypes "github.com/0glabs/0g-chain/x/committee/types"
 | 
			
		||||
	// communitytypes "github.com/0glabs/0g-chain/x/community/types"
 | 
			
		||||
	// earntypes "github.com/0glabs/0g-chain/x/earn/types"
 | 
			
		||||
	evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
	// hardtypes "github.com/0glabs/0g-chain/x/hard/types"
 | 
			
		||||
	// incentivetypes "github.com/0glabs/0g-chain/x/incentive/types"
 | 
			
		||||
	// issuancetypes "github.com/0glabs/0g-chain/x/issuance/types"
 | 
			
		||||
	// kavadisttypes "github.com/0glabs/0g-chain/x/kavadist/types"
 | 
			
		||||
	// liquidtypes "github.com/0glabs/0g-chain/x/liquid/types"
 | 
			
		||||
	// pricefeedtypes "github.com/0glabs/0g-chain/x/pricefeed/types"
 | 
			
		||||
	// savingstypes "github.com/0glabs/0g-chain/x/savings/types"
 | 
			
		||||
	// swaptypes "github.com/0glabs/0g-chain/x/swap/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// QueryClient is a wrapper with all Cosmos and Kava grpc query clients
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ package query_test
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/client/grpc/query"
 | 
			
		||||
	"github.com/0glabs/0g-chain/client/grpc/query"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,9 +7,9 @@ import (
 | 
			
		||||
	grpctypes "github.com/cosmos/cosmos-sdk/types/grpc"
 | 
			
		||||
	"google.golang.org/grpc/metadata"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/params"
 | 
			
		||||
	query "github.com/kava-labs/kava/client/grpc/query"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
	query "github.com/0glabs/0g-chain/client/grpc/query"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Util contains utility functions for the Kava gRPC client
 | 
			
		||||
 | 
			
		||||
@ -13,6 +13,7 @@ import (
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	simappparams "cosmossdk.io/simapp/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/client/rest"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/flags"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
@ -20,7 +21,6 @@ import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
 | 
			
		||||
	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/kava-labs/kava/client/rest"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestBaseReq_Sanitize(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
@ -23,8 +23,8 @@ import (
 | 
			
		||||
	"github.com/spf13/cast"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
@ -9,8 +9,8 @@ import (
 | 
			
		||||
	genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func AssertInvariantsCmd(config params.EncodingConfig) *cobra.Command {
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
// Sourced from https://github.com/evmos/ethermint/blob/main/cmd/ethermintd/genaccounts.go
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
@ -7,7 +7,7 @@ import (
 | 
			
		||||
	authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// newQueryCmd creates all the commands for querying blockchain state.
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
@ -23,21 +23,16 @@ import (
 | 
			
		||||
	servercfg "github.com/evmos/ethermint/server/config"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/app/params"
 | 
			
		||||
	"github.com/kava-labs/kava/cmd/kava/cmd/rocksdb"
 | 
			
		||||
	"github.com/kava-labs/kava/cmd/kava/opendb"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/chaincfg"
 | 
			
		||||
	"github.com/0glabs/0g-chain/cmd/opendb"
 | 
			
		||||
	"github.com/0glabs/0g-chain/cmd/rocksdb"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EnvPrefix is the prefix environment variables must have to configure the app.
 | 
			
		||||
const EnvPrefix = "KAVA"
 | 
			
		||||
 | 
			
		||||
// NewRootCmd creates a new root command for the kava blockchain.
 | 
			
		||||
// NewRootCmd creates a new root command for the 0g-chain blockchain.
 | 
			
		||||
func NewRootCmd() *cobra.Command {
 | 
			
		||||
	app.SetSDKConfig().Seal()
 | 
			
		||||
 | 
			
		||||
	encodingConfig := app.MakeEncodingConfig()
 | 
			
		||||
 | 
			
		||||
	initClientCtx := client.Context{}.
 | 
			
		||||
		WithCodec(encodingConfig.Marshaler).
 | 
			
		||||
		WithInterfaceRegistry(encodingConfig.InterfaceRegistry).
 | 
			
		||||
@ -46,13 +41,12 @@ func NewRootCmd() *cobra.Command {
 | 
			
		||||
		WithInput(os.Stdin).
 | 
			
		||||
		WithAccountRetriever(types.AccountRetriever{}).
 | 
			
		||||
		WithBroadcastMode(flags.FlagBroadcastMode).
 | 
			
		||||
		WithHomeDir(app.DefaultNodeHome).
 | 
			
		||||
		WithHomeDir(chaincfg.DefaultNodeHome).
 | 
			
		||||
		WithKeyringOptions(hd.EthSecp256k1Option()).
 | 
			
		||||
		WithViper(EnvPrefix)
 | 
			
		||||
 | 
			
		||||
		WithViper(chaincfg.EnvPrefix)
 | 
			
		||||
	rootCmd := &cobra.Command{
 | 
			
		||||
		Use:   "kava",
 | 
			
		||||
		Short: "Daemon and CLI for the Kava blockchain.",
 | 
			
		||||
		Use:   chaincfg.AppName,
 | 
			
		||||
		Short: "Daemon and CLI for the 0g-chain blockchain.",
 | 
			
		||||
		PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
 | 
			
		||||
			cmd.SetOut(cmd.OutOrStdout())
 | 
			
		||||
			cmd.SetErr(cmd.ErrOrStderr())
 | 
			
		||||
@ -71,7 +65,7 @@ func NewRootCmd() *cobra.Command {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			customAppTemplate, customAppConfig := servercfg.AppConfig("ukava")
 | 
			
		||||
			customAppTemplate, customAppConfig := servercfg.AppConfig(chaincfg.BaseDenom)
 | 
			
		||||
 | 
			
		||||
			return server.InterceptConfigsPreRunHandler(
 | 
			
		||||
				cmd,
 | 
			
		||||
@ -82,12 +76,12 @@ func NewRootCmd() *cobra.Command {
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	addSubCmds(rootCmd, encodingConfig, app.DefaultNodeHome)
 | 
			
		||||
	addSubCmds(rootCmd, encodingConfig, chaincfg.DefaultNodeHome)
 | 
			
		||||
 | 
			
		||||
	return rootCmd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// addSubCmds registers all the sub commands used by kava.
 | 
			
		||||
// addSubCmds registers all the sub commands used by 0g-chain.
 | 
			
		||||
func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, defaultNodeHome string) {
 | 
			
		||||
	gentxModule, ok := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic)
 | 
			
		||||
	if !ok {
 | 
			
		||||
@ -116,7 +110,7 @@ func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, de
 | 
			
		||||
 | 
			
		||||
	opts := ethermintserver.StartOptions{
 | 
			
		||||
		AppCreator:      ac.newApp,
 | 
			
		||||
		DefaultNodeHome: app.DefaultNodeHome,
 | 
			
		||||
		DefaultNodeHome: chaincfg.DefaultNodeHome,
 | 
			
		||||
		DBOpener:        opendb.OpenDB,
 | 
			
		||||
	}
 | 
			
		||||
	// ethermintserver adds additional flags to start the JSON-RPC server for evm support
 | 
			
		||||
@ -131,7 +125,7 @@ func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, de
 | 
			
		||||
	rootCmd.AddCommand(
 | 
			
		||||
		newQueryCmd(),
 | 
			
		||||
		newTxCmd(),
 | 
			
		||||
		keyCommands(app.DefaultNodeHome),
 | 
			
		||||
		keyCommands(chaincfg.DefaultNodeHome),
 | 
			
		||||
		rocksdb.RocksDBCmd,
 | 
			
		||||
		newShardCmd(opts),
 | 
			
		||||
	)
 | 
			
		||||
@ -1,10 +1,10 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	dbm "github.com/cometbft/cometbft-db"
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package cmd
 | 
			
		||||
package zgchaind
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
@ -6,7 +6,7 @@ import (
 | 
			
		||||
	authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// newTxCmd creates all commands for submitting blockchain transactions.
 | 
			
		||||
@ -1,25 +0,0 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/server"
 | 
			
		||||
	svrcmd "github.com/cosmos/cosmos-sdk/server/cmd"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/cmd/kava/cmd"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	rootCmd := cmd.NewRootCmd()
 | 
			
		||||
 | 
			
		||||
	if err := svrcmd.Execute(rootCmd, cmd.EnvPrefix, app.DefaultNodeHome); err != nil {
 | 
			
		||||
		switch e := err.(type) {
 | 
			
		||||
		case server.ErrorCode:
 | 
			
		||||
			os.Exit(e.Code)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								cmd/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								cmd/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/server"
 | 
			
		||||
	svrcmd "github.com/cosmos/cosmos-sdk/server/cmd"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/chaincfg"
 | 
			
		||||
	chain "github.com/0glabs/0g-chain/cmd/0gchaind"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	chaincfg.SetSDKConfig().Seal()
 | 
			
		||||
	chaincfg.RegisterDenoms()
 | 
			
		||||
 | 
			
		||||
	rootCmd := chain.NewRootCmd()
 | 
			
		||||
 | 
			
		||||
	if err := svrcmd.Execute(rootCmd, chaincfg.EnvPrefix, chaincfg.DefaultNodeHome); err != nil {
 | 
			
		||||
		switch e := err.(type) {
 | 
			
		||||
		case server.ErrorCode:
 | 
			
		||||
			os.Exit(e.Code)
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -14,9 +14,9 @@ import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/cmd/opendb"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/server"
 | 
			
		||||
	"github.com/kava-labs/kava/cmd/kava/opendb"
 | 
			
		||||
	"github.com/linxGnu/grocksdb"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"golang.org/x/exp/slices"
 | 
			
		||||
							
								
								
									
										58
									
								
								crypto/vrf/algorithm.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								crypto/vrf/algorithm.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,58 @@
 | 
			
		||||
package vrf
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/crypto/hd"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/crypto/keyring"
 | 
			
		||||
	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// SupportedAlgorithms defines the list of signing algorithms used on Evmos:
 | 
			
		||||
	//  - eth_secp256k1 (Ethereum)
 | 
			
		||||
	//  - secp256k1 (Tendermint)
 | 
			
		||||
	SupportedAlgorithms = keyring.SigningAlgoList{VrfAlgo}
 | 
			
		||||
	// SupportedAlgorithmsLedger defines the list of signing algorithms used on Evmos for the Ledger device:
 | 
			
		||||
	//  - eth_secp256k1 (Ethereum)
 | 
			
		||||
	//  - secp256k1 (Tendermint)
 | 
			
		||||
	SupportedAlgorithmsLedger = keyring.SigningAlgoList{VrfAlgo}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func VrfOption() keyring.Option {
 | 
			
		||||
	return func(options *keyring.Options) {
 | 
			
		||||
		options.SupportedAlgos = SupportedAlgorithms
 | 
			
		||||
		options.SupportedAlgosLedger = SupportedAlgorithmsLedger
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	VrfType = hd.PubKeyType(KeyType)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_       keyring.SignatureAlgo = VrfAlgo
 | 
			
		||||
	VrfAlgo                       = vrfAlgo{}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type vrfAlgo struct{}
 | 
			
		||||
 | 
			
		||||
func (s vrfAlgo) Name() hd.PubKeyType {
 | 
			
		||||
	return VrfType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s vrfAlgo) Derive() hd.DeriveFn {
 | 
			
		||||
	return func(mnemonic, bip39Passphrase, path string) ([]byte, error) {
 | 
			
		||||
		key, err := GenerateKey()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return key.Bytes(), nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s vrfAlgo) Generate() hd.GenerateFn {
 | 
			
		||||
	return func(bz []byte) cryptotypes.PrivKey {
 | 
			
		||||
		key, _ := GenerateKey()
 | 
			
		||||
		return key
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										496
									
								
								crypto/vrf/keys.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										496
									
								
								crypto/vrf/keys.pb.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,496 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: crypto/vrf/keys.proto
 | 
			
		||||
 | 
			
		||||
package vrf
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	_ "github.com/cosmos/gogoproto/gogoproto"
 | 
			
		||||
	proto "github.com/cosmos/gogoproto/proto"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// PubKey defines a type alias for an vrf.PublicKey that implements
 | 
			
		||||
// Vrf's PubKey interface. It represents the 32-byte compressed public
 | 
			
		||||
// key format.
 | 
			
		||||
type PubKey struct {
 | 
			
		||||
	// key is the public key in byte form
 | 
			
		||||
	Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PubKey) Reset()      { *m = PubKey{} }
 | 
			
		||||
func (*PubKey) ProtoMessage() {}
 | 
			
		||||
func (*PubKey) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_eae59d1af27f5957, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (m *PubKey) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_PubKey.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *PubKey) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_PubKey.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *PubKey) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *PubKey) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_PubKey.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_PubKey proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *PubKey) GetKey() []byte {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Key
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PrivKey defines a type alias for an vrf.PrivateKey that implements
 | 
			
		||||
// Vrf's PrivateKey interface.
 | 
			
		||||
type PrivKey struct {
 | 
			
		||||
	// key is the private key in byte form
 | 
			
		||||
	Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PrivKey) Reset()         { *m = PrivKey{} }
 | 
			
		||||
func (m *PrivKey) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*PrivKey) ProtoMessage()    {}
 | 
			
		||||
func (*PrivKey) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_eae59d1af27f5957, []int{1}
 | 
			
		||||
}
 | 
			
		||||
func (m *PrivKey) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_PrivKey.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *PrivKey) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_PrivKey.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *PrivKey) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *PrivKey) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_PrivKey.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_PrivKey proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *PrivKey) GetKey() []byte {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Key
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*PubKey)(nil), "crypto.vrf.PubKey")
 | 
			
		||||
	proto.RegisterType((*PrivKey)(nil), "crypto.vrf.PrivKey")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("crypto/vrf/keys.proto", fileDescriptor_eae59d1af27f5957) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_eae59d1af27f5957 = []byte{
 | 
			
		||||
	// 174 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0x2e, 0xaa, 0x2c,
 | 
			
		||||
	0x28, 0xc9, 0xd7, 0x2f, 0x2b, 0x4a, 0xd3, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f,
 | 
			
		||||
	0xc9, 0x17, 0xe2, 0x82, 0x08, 0xeb, 0x95, 0x15, 0xa5, 0x49, 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83,
 | 
			
		||||
	0x85, 0xf5, 0x41, 0x2c, 0x88, 0x0a, 0x25, 0x05, 0x2e, 0xb6, 0x80, 0xd2, 0x24, 0xef, 0xd4, 0x4a,
 | 
			
		||||
	0x21, 0x01, 0x2e, 0xe6, 0xec, 0xd4, 0x4a, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x9e, 0x20, 0x10, 0xd3,
 | 
			
		||||
	0x8a, 0x65, 0xc6, 0x02, 0x79, 0x06, 0x25, 0x69, 0x2e, 0xf6, 0x80, 0xa2, 0xcc, 0x32, 0xac, 0x4a,
 | 
			
		||||
	0x9c, 0xec, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09,
 | 
			
		||||
	0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x35, 0x3d, 0xb3,
 | 
			
		||||
	0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0xdf, 0x20, 0x3d, 0x27, 0x31, 0xa9, 0x58, 0xdf,
 | 
			
		||||
	0x20, 0x5d, 0x37, 0x39, 0x23, 0x31, 0x33, 0x4f, 0x1f, 0xe1, 0xd8, 0x24, 0x36, 0xb0, 0x33, 0x8c,
 | 
			
		||||
	0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xb8, 0x32, 0x07, 0xc1, 0x00, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PubKey) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PubKey) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if len(m.Key) > 0 {
 | 
			
		||||
		i -= len(m.Key)
 | 
			
		||||
		copy(dAtA[i:], m.Key)
 | 
			
		||||
		i = encodeVarintKeys(dAtA, i, uint64(len(m.Key)))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0xa
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PrivKey) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PrivKey) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if len(m.Key) > 0 {
 | 
			
		||||
		i -= len(m.Key)
 | 
			
		||||
		copy(dAtA[i:], m.Key)
 | 
			
		||||
		i = encodeVarintKeys(dAtA, i, uint64(len(m.Key)))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0xa
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintKeys(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovKeys(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func (m *PubKey) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	l = len(m.Key)
 | 
			
		||||
	if l > 0 {
 | 
			
		||||
		n += 1 + l + sovKeys(uint64(l))
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *PrivKey) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	l = len(m.Key)
 | 
			
		||||
	if l > 0 {
 | 
			
		||||
		n += 1 + l + sovKeys(uint64(l))
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovKeys(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozKeys(x uint64) (n int) {
 | 
			
		||||
	return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (m *PubKey) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowKeys
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: PubKey: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var byteLen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowKeys
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				byteLen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if byteLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthKeys
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + byteLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthKeys
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...)
 | 
			
		||||
			if m.Key == nil {
 | 
			
		||||
				m.Key = []byte{}
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipKeys(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthKeys
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (m *PrivKey) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowKeys
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: PrivKey: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var byteLen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowKeys
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				byteLen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if byteLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthKeys
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + byteLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthKeys
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...)
 | 
			
		||||
			if m.Key == nil {
 | 
			
		||||
				m.Key = []byte{}
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipKeys(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthKeys
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipKeys(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowKeys
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowKeys
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowKeys
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthKeys
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupKeys
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthKeys
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthKeys        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowKeys          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										194
									
								
								crypto/vrf/vrf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								crypto/vrf/vrf.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,194 @@
 | 
			
		||||
package vrf
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto/subtle"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	errorsmod "cosmossdk.io/errors"
 | 
			
		||||
	tmcrypto "github.com/cometbft/cometbft/crypto"
 | 
			
		||||
	vrfalgo "github.com/coniks-sys/coniks-go/crypto/vrf"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
 | 
			
		||||
	errortypes "github.com/cosmos/cosmos-sdk/types/errors"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// PrivKeySize defines the size of the PrivKey bytes
 | 
			
		||||
	PrivKeySize = 64
 | 
			
		||||
	// PubKeySize defines the size of the PubKey bytes
 | 
			
		||||
	PubKeySize = 32
 | 
			
		||||
	// KeyType is the string constant for the vrf algorithm
 | 
			
		||||
	KeyType = "vrf"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Amino encoding names
 | 
			
		||||
const (
 | 
			
		||||
	// PrivKeyName defines the amino encoding name for the vrf private key
 | 
			
		||||
	PrivKeyName = "vrf/PrivKey"
 | 
			
		||||
	// PubKeyName defines the amino encoding name for the vrf public key
 | 
			
		||||
	PubKeyName = "vrf/PubKey"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
// vrf Private Key
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ cryptotypes.PrivKey  = &PrivKey{}
 | 
			
		||||
	_ codec.AminoMarshaler = &PrivKey{}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GenerateKey generates a new random private key. It returns an error upon
 | 
			
		||||
// failure.
 | 
			
		||||
func GenerateKey() (*PrivKey, error) {
 | 
			
		||||
	priv, err := vrfalgo.GenerateKey(nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &PrivKey{
 | 
			
		||||
		Key: priv,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (privKey PrivKey) getVrfPrivateKey() vrfalgo.PrivateKey {
 | 
			
		||||
	return vrfalgo.PrivateKey(privKey.Key)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bytes returns the byte representation of the Private Key.
 | 
			
		||||
func (privKey PrivKey) Bytes() []byte {
 | 
			
		||||
	bz := make([]byte, len(privKey.Key))
 | 
			
		||||
	copy(bz, privKey.Key)
 | 
			
		||||
 | 
			
		||||
	return bz
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PubKey returns the private key's public key. If the privkey is not valid
 | 
			
		||||
// it returns a nil value.
 | 
			
		||||
func (privKey PrivKey) PubKey() cryptotypes.PubKey {
 | 
			
		||||
	pk, _ := vrfalgo.PrivateKey(privKey.Key).Public()
 | 
			
		||||
 | 
			
		||||
	return &PubKey{
 | 
			
		||||
		Key: pk,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equals returns true if two private keys are equal and false otherwise.
 | 
			
		||||
func (privKey PrivKey) Equals(other cryptotypes.LedgerPrivKey) bool {
 | 
			
		||||
	return privKey.Type() == other.Type() && subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Type returns vrf
 | 
			
		||||
func (privKey PrivKey) Type() string {
 | 
			
		||||
	return KeyType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Compute generates the vrf value for the byte slice m using the
 | 
			
		||||
// underlying private key sk.
 | 
			
		||||
func (privKey PrivKey) Sign(digestBz []byte) ([]byte, error) {
 | 
			
		||||
	sk := privKey.getVrfPrivateKey()
 | 
			
		||||
 | 
			
		||||
	return sk.Compute(digestBz), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalAmino overrides Amino binary marshaling.
 | 
			
		||||
func (privKey PrivKey) MarshalAmino() ([]byte, error) {
 | 
			
		||||
	return privKey.Key, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalAmino overrides Amino binary marshaling.
 | 
			
		||||
func (privKey *PrivKey) UnmarshalAmino(bz []byte) error {
 | 
			
		||||
	if len(bz) != PrivKeySize {
 | 
			
		||||
		return fmt.Errorf("invalid privkey size, expected %d got %d", PrivKeySize, len(bz))
 | 
			
		||||
	}
 | 
			
		||||
	privKey.Key = bz
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalAminoJSON overrides Amino JSON marshaling.
 | 
			
		||||
func (privKey PrivKey) MarshalAminoJSON() ([]byte, error) {
 | 
			
		||||
	// When we marshal to Amino JSON, we don't marshal the "key" field itself,
 | 
			
		||||
	// just its contents (i.e. the key bytes).
 | 
			
		||||
	return privKey.MarshalAmino()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalAminoJSON overrides Amino JSON marshaling.
 | 
			
		||||
func (privKey *PrivKey) UnmarshalAminoJSON(bz []byte) error {
 | 
			
		||||
	return privKey.UnmarshalAmino(bz)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
// vrf Public Key
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ cryptotypes.PubKey   = &PubKey{}
 | 
			
		||||
	_ codec.AminoMarshaler = &PubKey{}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// func (pubKey PubKey) getVrfPublicKey() vrfalgo.PublicKey {
 | 
			
		||||
// 	return vrfalgo.PublicKey(pubKey.Key)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// Address returns the address of the ECDSA public key.
 | 
			
		||||
// The function will return an empty address if the public key is invalid.
 | 
			
		||||
func (pubKey PubKey) Address() tmcrypto.Address {
 | 
			
		||||
	return tmcrypto.Address(common.BytesToAddress(pubKey.Key).Bytes())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bytes returns the raw bytes of the ECDSA public key.
 | 
			
		||||
func (pubKey PubKey) Bytes() []byte {
 | 
			
		||||
	bz := make([]byte, len(pubKey.Key))
 | 
			
		||||
	copy(bz, pubKey.Key)
 | 
			
		||||
 | 
			
		||||
	return bz
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String implements the fmt.Stringer interface.
 | 
			
		||||
func (pubKey PubKey) String() string {
 | 
			
		||||
	return fmt.Sprintf("vrf{%X}", pubKey.Key)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Type returns vrf
 | 
			
		||||
func (pubKey PubKey) Type() string {
 | 
			
		||||
	return KeyType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equals returns true if the pubkey type is the same and their bytes are deeply equal.
 | 
			
		||||
func (pubKey PubKey) Equals(other cryptotypes.PubKey) bool {
 | 
			
		||||
	return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Verify returns true iff vrf=Compute(m) for the sk that
 | 
			
		||||
// corresponds to pk.
 | 
			
		||||
func (pubKey PubKey) VerifySignature(msg, sig []byte) bool {
 | 
			
		||||
	panic("not implement")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalAmino overrides Amino binary marshaling.
 | 
			
		||||
func (pubKey PubKey) MarshalAmino() ([]byte, error) {
 | 
			
		||||
	return pubKey.Key, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalAmino overrides Amino binary marshaling.
 | 
			
		||||
func (pubKey *PubKey) UnmarshalAmino(bz []byte) error {
 | 
			
		||||
	if len(bz) != PubKeySize {
 | 
			
		||||
		return errorsmod.Wrapf(errortypes.ErrInvalidPubKey, "invalid pubkey size, expected %d, got %d", PubKeySize, len(bz))
 | 
			
		||||
	}
 | 
			
		||||
	pubKey.Key = bz
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalAminoJSON overrides Amino JSON marshaling.
 | 
			
		||||
func (pubKey PubKey) MarshalAminoJSON() ([]byte, error) {
 | 
			
		||||
	// When we marshal to Amino JSON, we don't marshal the "key" field itself,
 | 
			
		||||
	// just its contents (i.e. the key bytes).
 | 
			
		||||
	return pubKey.MarshalAmino()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalAminoJSON overrides Amino JSON marshaling.
 | 
			
		||||
func (pubKey *PubKey) UnmarshalAminoJSON(bz []byte) error {
 | 
			
		||||
	return pubKey.UnmarshalAmino(bz)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										96
									
								
								crypto/vrf/vrf_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								crypto/vrf/vrf_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,96 @@
 | 
			
		||||
package vrf
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
 | 
			
		||||
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestPrivKey(t *testing.T) {
 | 
			
		||||
	// validate type and equality
 | 
			
		||||
	privKey, err := GenerateKey()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	require.Implements(t, (*cryptotypes.PrivKey)(nil), privKey)
 | 
			
		||||
 | 
			
		||||
	// validate inequality
 | 
			
		||||
	privKey2, err := GenerateKey()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	require.False(t, privKey.Equals(privKey2))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestPrivKey_PubKey(t *testing.T) {
 | 
			
		||||
	privKey, err := GenerateKey()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// validate type and equality
 | 
			
		||||
	pubKey := &PubKey{
 | 
			
		||||
		Key: privKey.PubKey().Bytes(),
 | 
			
		||||
	}
 | 
			
		||||
	require.Implements(t, (*cryptotypes.PubKey)(nil), pubKey)
 | 
			
		||||
 | 
			
		||||
	// validate inequality
 | 
			
		||||
	privKey2, err := GenerateKey()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	require.False(t, pubKey.Equals(privKey2.PubKey()))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMarshalAmino(t *testing.T) {
 | 
			
		||||
	aminoCdc := codec.NewLegacyAmino()
 | 
			
		||||
	privKey, err := GenerateKey()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	pubKey := privKey.PubKey().(*PubKey)
 | 
			
		||||
 | 
			
		||||
	testCases := []struct {
 | 
			
		||||
		desc      string
 | 
			
		||||
		msg       codec.AminoMarshaler
 | 
			
		||||
		typ       interface{}
 | 
			
		||||
		expBinary []byte
 | 
			
		||||
		expJSON   string
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			"vrf private key",
 | 
			
		||||
			privKey,
 | 
			
		||||
			&PrivKey{},
 | 
			
		||||
			append([]byte{64}, privKey.Bytes()...), // Length-prefixed.
 | 
			
		||||
			"\"" + base64.StdEncoding.EncodeToString(privKey.Bytes()) + "\"",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"vrf public key",
 | 
			
		||||
			pubKey,
 | 
			
		||||
			&PubKey{},
 | 
			
		||||
			append([]byte{32}, pubKey.Bytes()...), // Length-prefixed.
 | 
			
		||||
			"\"" + base64.StdEncoding.EncodeToString(pubKey.Bytes()) + "\"",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
		t.Run(tc.desc, func(t *testing.T) {
 | 
			
		||||
			// Do a round trip of encoding/decoding binary.
 | 
			
		||||
			bz, err := aminoCdc.Marshal(tc.msg)
 | 
			
		||||
			require.NoError(t, err)
 | 
			
		||||
			require.Equal(t, tc.expBinary, bz)
 | 
			
		||||
 | 
			
		||||
			err = aminoCdc.Unmarshal(bz, tc.typ)
 | 
			
		||||
			require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
			require.Equal(t, tc.msg, tc.typ)
 | 
			
		||||
 | 
			
		||||
			// Do a round trip of encoding/decoding JSON.
 | 
			
		||||
			bz, err = aminoCdc.MarshalJSON(tc.msg)
 | 
			
		||||
			require.NoError(t, err)
 | 
			
		||||
			require.Equal(t, tc.expJSON, string(bz))
 | 
			
		||||
 | 
			
		||||
			err = aminoCdc.UnmarshalJSON(bz, tc.typ)
 | 
			
		||||
			require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
			require.Equal(t, tc.msg, tc.typ)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.mod
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
module github.com/kava-labs/kava
 | 
			
		||||
module github.com/0glabs/0g-chain
 | 
			
		||||
 | 
			
		||||
go 1.21
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,7 @@ require (
 | 
			
		||||
	github.com/cenkalti/backoff/v4 v4.1.3
 | 
			
		||||
	github.com/cometbft/cometbft v0.37.4
 | 
			
		||||
	github.com/cometbft/cometbft-db v0.9.1
 | 
			
		||||
	github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71
 | 
			
		||||
	github.com/cosmos/cosmos-proto v1.0.0-beta.4
 | 
			
		||||
	github.com/cosmos/cosmos-sdk v0.47.10
 | 
			
		||||
	github.com/cosmos/go-bip39 v1.0.0
 | 
			
		||||
@ -18,7 +19,6 @@ require (
 | 
			
		||||
	github.com/ethereum/go-ethereum v1.10.26
 | 
			
		||||
	github.com/evmos/ethermint v0.21.0
 | 
			
		||||
	github.com/go-kit/kit v0.12.0
 | 
			
		||||
	github.com/gogo/protobuf v1.3.2
 | 
			
		||||
	github.com/golang/protobuf v1.5.3
 | 
			
		||||
	github.com/gorilla/mux v1.8.0
 | 
			
		||||
	github.com/grpc-ecosystem/grpc-gateway v1.16.0
 | 
			
		||||
@ -111,6 +111,7 @@ require (
 | 
			
		||||
	github.com/go-stack/stack v1.8.1 // indirect
 | 
			
		||||
	github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
 | 
			
		||||
	github.com/gogo/googleapis v1.4.1 // indirect
 | 
			
		||||
	github.com/gogo/protobuf v1.3.2 // indirect
 | 
			
		||||
	github.com/golang/glog v1.1.2 // indirect
 | 
			
		||||
	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 | 
			
		||||
	github.com/golang/mock v1.6.0 // indirect
 | 
			
		||||
@ -183,7 +184,6 @@ require (
 | 
			
		||||
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
			
		||||
	github.com/spf13/pflag v1.0.5 // indirect
 | 
			
		||||
	github.com/status-im/keycard-go v0.2.0 // indirect
 | 
			
		||||
	github.com/stretchr/objx v0.5.0 // indirect
 | 
			
		||||
	github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
 | 
			
		||||
	github.com/tendermint/go-amino v0.16.0 // indirect
 | 
			
		||||
	github.com/tidwall/btree v1.6.0 // indirect
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@ -396,6 +396,8 @@ github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZ
 | 
			
		||||
github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M=
 | 
			
		||||
github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4=
 | 
			
		||||
github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak=
 | 
			
		||||
github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71 h1:MFLTqgfJclmtaQ1SRUrWwmDX/1UBok3XWUethkJ2swQ=
 | 
			
		||||
github.com/coniks-sys/coniks-go v0.0.0-20180722014011-11acf4819b71/go.mod h1:TrHYHH4Wze7v7Hkwu1MH1W+mCPQKM+gs+PicdEV14o8=
 | 
			
		||||
github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
 | 
			
		||||
github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
 | 
			
		||||
github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										61
									
								
								helper/da/client/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								helper/da/client/client.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
			
		||||
package client
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-evmos/helper/da/light"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DaLightRpcClient interface {
 | 
			
		||||
	Sample(ctx context.Context, streamId, headerHash []byte, blobIdx, times uint32) (bool, error)
 | 
			
		||||
	Destroy()
 | 
			
		||||
	GetInstanceCount() int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type daLightClient struct {
 | 
			
		||||
	maxInstance int
 | 
			
		||||
	pool        ConnectionPool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewDaLightClient(address string, instanceLimit int) DaLightRpcClient {
 | 
			
		||||
	return &daLightClient{
 | 
			
		||||
		maxInstance: instanceLimit,
 | 
			
		||||
		pool:        NewConnectionPool(address, instanceLimit, 10*time.Minute),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *daLightClient) Sample(ctx context.Context, streamId, headerHash []byte, blobIdx, times uint32) (bool, error) {
 | 
			
		||||
	connection, err := c.pool.GetConnection()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, errors.Wrap(err, "failed to connect to da light server")
 | 
			
		||||
	}
 | 
			
		||||
	defer c.pool.ReleaseConnection(connection)
 | 
			
		||||
 | 
			
		||||
	req := &light.SampleRequest{
 | 
			
		||||
		StreamId:        streamId,
 | 
			
		||||
		BatchHeaderHash: headerHash,
 | 
			
		||||
		BlobIndex:       blobIdx,
 | 
			
		||||
		Times:           times,
 | 
			
		||||
	}
 | 
			
		||||
	client := light.NewLightClient(connection)
 | 
			
		||||
	reply, err := client.Sample(ctx, req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, errors.Wrap(err, "failed to sample from da light server")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return reply.Success, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *daLightClient) Destroy() {
 | 
			
		||||
	if c.pool != nil {
 | 
			
		||||
		c.pool.Close()
 | 
			
		||||
		c.pool = nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *daLightClient) GetInstanceCount() int {
 | 
			
		||||
	return c.maxInstance
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										101
									
								
								helper/da/client/pool.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								helper/da/client/pool.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,101 @@
 | 
			
		||||
package client
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
	"google.golang.org/grpc/backoff"
 | 
			
		||||
	"google.golang.org/grpc/credentials/insecure"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ConnectionPool interface {
 | 
			
		||||
	GetConnection() (*grpc.ClientConn, error)
 | 
			
		||||
	ReleaseConnection(*grpc.ClientConn)
 | 
			
		||||
	Close()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type connectionPoolImpl struct {
 | 
			
		||||
	address string
 | 
			
		||||
	maxSize int
 | 
			
		||||
	timeout time.Duration
 | 
			
		||||
	param   grpc.ConnectParams
 | 
			
		||||
 | 
			
		||||
	mu   sync.Mutex
 | 
			
		||||
	pool []*grpc.ClientConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewConnectionPool(address string, maxSize int, timeout time.Duration) ConnectionPool {
 | 
			
		||||
	return &connectionPoolImpl{
 | 
			
		||||
		address: address,
 | 
			
		||||
		maxSize: maxSize,
 | 
			
		||||
		timeout: timeout,
 | 
			
		||||
		param: grpc.ConnectParams{
 | 
			
		||||
			Backoff: backoff.Config{
 | 
			
		||||
				BaseDelay:  1.0 * time.Second,
 | 
			
		||||
				Multiplier: 1.5,
 | 
			
		||||
				Jitter:     0.2,
 | 
			
		||||
				MaxDelay:   30 * time.Second,
 | 
			
		||||
			},
 | 
			
		||||
			MinConnectTimeout: 30 * time.Second,
 | 
			
		||||
		},
 | 
			
		||||
		pool: make([]*grpc.ClientConn, 0, maxSize),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *connectionPoolImpl) GetConnection() (*grpc.ClientConn, error) {
 | 
			
		||||
	p.mu.Lock()
 | 
			
		||||
	defer p.mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	if p.pool == nil {
 | 
			
		||||
		return nil, errors.New("connection pool is closed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check if there's any available connection in the pool
 | 
			
		||||
	if len(p.pool) > 0 {
 | 
			
		||||
		conn := p.pool[0]
 | 
			
		||||
		p.pool = p.pool[1:]
 | 
			
		||||
		return conn, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If the pool is empty, create a new connection
 | 
			
		||||
	conn, err := grpc.Dial(p.address, grpc.WithBlock(),
 | 
			
		||||
		grpc.WithConnectParams(p.param),
 | 
			
		||||
		grpc.WithTransportCredentials(insecure.NewCredentials()))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return conn, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *connectionPoolImpl) ReleaseConnection(conn *grpc.ClientConn) {
 | 
			
		||||
	p.mu.Lock()
 | 
			
		||||
	defer p.mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	if p.pool != nil {
 | 
			
		||||
		// If the pool is full, close the connection
 | 
			
		||||
		if len(p.pool) >= p.maxSize {
 | 
			
		||||
			conn.Close()
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Add the connection back to the pool
 | 
			
		||||
		p.pool = append(p.pool, conn)
 | 
			
		||||
	} else {
 | 
			
		||||
		conn.Close()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *connectionPoolImpl) Close() {
 | 
			
		||||
	p.mu.Lock()
 | 
			
		||||
	defer p.mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	if p.pool != nil {
 | 
			
		||||
		for _, conn := range p.pool {
 | 
			
		||||
			conn.Close()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		p.pool = nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								helper/da/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								helper/da/go.mod
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
module github.com/0glabs/0g-evmos/helper/da
 | 
			
		||||
 | 
			
		||||
go 1.20
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/json-iterator/go v1.1.12
 | 
			
		||||
	github.com/lesismal/nbio v1.5.4
 | 
			
		||||
	github.com/pkg/errors v0.9.1
 | 
			
		||||
	github.com/rs/zerolog v1.32.0
 | 
			
		||||
	google.golang.org/grpc v1.63.2
 | 
			
		||||
	google.golang.org/protobuf v1.33.0
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/lesismal/llib v1.1.13 // indirect
 | 
			
		||||
	github.com/mattn/go-colorable v0.1.13 // indirect
 | 
			
		||||
	github.com/mattn/go-isatty v0.0.19 // indirect
 | 
			
		||||
	github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
 | 
			
		||||
	github.com/modern-go/reflect2 v1.0.2 // indirect
 | 
			
		||||
	github.com/stretchr/testify v1.8.4 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.19.0 // indirect
 | 
			
		||||
	golang.org/x/net v0.21.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.17.0 // indirect
 | 
			
		||||
	golang.org/x/text v0.14.0 // indirect
 | 
			
		||||
	google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										60
									
								
								helper/da/go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								helper/da/go.sum
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,60 @@
 | 
			
		||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 | 
			
		||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 | 
			
		||||
github.com/lesismal/llib v1.1.13 h1:+w1+t0PykXpj2dXQck0+p6vdC9/mnbEXHgUy/HXDGfE=
 | 
			
		||||
github.com/lesismal/llib v1.1.13/go.mod h1:70tFXXe7P1FZ02AU9l8LgSOK7d7sRrpnkUr3rd3gKSg=
 | 
			
		||||
github.com/lesismal/nbio v1.5.4 h1:fZ6FOVZOBm7nFuudYsq+WyHJuM2UNuPdlvF/1LVa6lo=
 | 
			
		||||
github.com/lesismal/nbio v1.5.4/go.mod h1:mvfYBAA1jmrafXf2XvkM28jWkMTfA5jGks+HKDBMmOc=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
 | 
			
		||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 | 
			
		||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 | 
			
		||||
github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
 | 
			
		||||
github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
 | 
			
		||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210513122933-cd7d49e622d5/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 | 
			
		||||
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
 | 
			
		||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
 | 
			
		||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
 | 
			
		||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 | 
			
		||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY=
 | 
			
		||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY=
 | 
			
		||||
google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
 | 
			
		||||
google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
 | 
			
		||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
 | 
			
		||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
							
								
								
									
										397
									
								
								helper/da/light/light.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								helper/da/light/light.pb.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,397 @@
 | 
			
		||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
			
		||||
// versions:
 | 
			
		||||
// 	protoc-gen-go v1.28.1
 | 
			
		||||
// 	protoc        v4.25.3
 | 
			
		||||
// source: light/light.proto
 | 
			
		||||
 | 
			
		||||
package light
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
	sync "sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Verify that this generated code is sufficiently up-to-date.
 | 
			
		||||
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
 | 
			
		||||
	// Verify that runtime/protoimpl is sufficiently up-to-date.
 | 
			
		||||
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SampleRequest contains the blob to sample (by batch and blob index) and required sample times
 | 
			
		||||
type SampleRequest struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
	unknownFields protoimpl.UnknownFields
 | 
			
		||||
 | 
			
		||||
	StreamId        []byte `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"`
 | 
			
		||||
	BatchHeaderHash []byte `protobuf:"bytes,2,opt,name=batch_header_hash,json=batchHeaderHash,proto3" json:"batch_header_hash,omitempty"`
 | 
			
		||||
	BlobIndex       uint32 `protobuf:"varint,3,opt,name=blob_index,json=blobIndex,proto3" json:"blob_index,omitempty"`
 | 
			
		||||
	Times           uint32 `protobuf:"varint,4,opt,name=times,proto3" json:"times,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleRequest) Reset() {
 | 
			
		||||
	*x = SampleRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_light_light_proto_msgTypes[0]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleRequest) String() string {
 | 
			
		||||
	return protoimpl.X.MessageStringOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*SampleRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *SampleRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_light_light_proto_msgTypes[0]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
			ms.StoreMessageInfo(mi)
 | 
			
		||||
		}
 | 
			
		||||
		return ms
 | 
			
		||||
	}
 | 
			
		||||
	return mi.MessageOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use SampleRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*SampleRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_light_light_proto_rawDescGZIP(), []int{0}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleRequest) GetStreamId() []byte {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.StreamId
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleRequest) GetBatchHeaderHash() []byte {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.BatchHeaderHash
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleRequest) GetBlobIndex() uint32 {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.BlobIndex
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleRequest) GetTimes() uint32 {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.Times
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SampleReply contains the sample result
 | 
			
		||||
type SampleReply struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
	unknownFields protoimpl.UnknownFields
 | 
			
		||||
 | 
			
		||||
	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleReply) Reset() {
 | 
			
		||||
	*x = SampleReply{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_light_light_proto_msgTypes[1]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleReply) String() string {
 | 
			
		||||
	return protoimpl.X.MessageStringOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*SampleReply) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *SampleReply) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_light_light_proto_msgTypes[1]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
			ms.StoreMessageInfo(mi)
 | 
			
		||||
		}
 | 
			
		||||
		return ms
 | 
			
		||||
	}
 | 
			
		||||
	return mi.MessageOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use SampleReply.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*SampleReply) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_light_light_proto_rawDescGZIP(), []int{1}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *SampleReply) GetSuccess() bool {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.Success
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type RetrieveRequest struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
	unknownFields protoimpl.UnknownFields
 | 
			
		||||
 | 
			
		||||
	BatchHeaderHash []byte `protobuf:"bytes,1,opt,name=batch_header_hash,json=batchHeaderHash,proto3" json:"batch_header_hash,omitempty"`
 | 
			
		||||
	BlobIndex       uint32 `protobuf:"varint,2,opt,name=blob_index,json=blobIndex,proto3" json:"blob_index,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveRequest) Reset() {
 | 
			
		||||
	*x = RetrieveRequest{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_light_light_proto_msgTypes[2]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveRequest) String() string {
 | 
			
		||||
	return protoimpl.X.MessageStringOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*RetrieveRequest) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveRequest) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_light_light_proto_msgTypes[2]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
			ms.StoreMessageInfo(mi)
 | 
			
		||||
		}
 | 
			
		||||
		return ms
 | 
			
		||||
	}
 | 
			
		||||
	return mi.MessageOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use RetrieveRequest.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*RetrieveRequest) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_light_light_proto_rawDescGZIP(), []int{2}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveRequest) GetBatchHeaderHash() []byte {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.BatchHeaderHash
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveRequest) GetBlobIndex() uint32 {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.BlobIndex
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type RetrieveReply struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
	unknownFields protoimpl.UnknownFields
 | 
			
		||||
 | 
			
		||||
	Status bool   `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
 | 
			
		||||
	Data   []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveReply) Reset() {
 | 
			
		||||
	*x = RetrieveReply{}
 | 
			
		||||
	if protoimpl.UnsafeEnabled {
 | 
			
		||||
		mi := &file_light_light_proto_msgTypes[3]
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		ms.StoreMessageInfo(mi)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveReply) String() string {
 | 
			
		||||
	return protoimpl.X.MessageStringOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*RetrieveReply) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveReply) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	mi := &file_light_light_proto_msgTypes[3]
 | 
			
		||||
	if protoimpl.UnsafeEnabled && x != nil {
 | 
			
		||||
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 | 
			
		||||
		if ms.LoadMessageInfo() == nil {
 | 
			
		||||
			ms.StoreMessageInfo(mi)
 | 
			
		||||
		}
 | 
			
		||||
		return ms
 | 
			
		||||
	}
 | 
			
		||||
	return mi.MessageOf(x)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Use RetrieveReply.ProtoReflect.Descriptor instead.
 | 
			
		||||
func (*RetrieveReply) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return file_light_light_proto_rawDescGZIP(), []int{3}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveReply) GetStatus() bool {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.Status
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *RetrieveReply) GetData() []byte {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.Data
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var File_light_light_proto protoreflect.FileDescriptor
 | 
			
		||||
 | 
			
		||||
var file_light_light_proto_rawDesc = []byte{
 | 
			
		||||
	0x0a, 0x11, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x70, 0x72,
 | 
			
		||||
	0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0d, 0x53,
 | 
			
		||||
	0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09,
 | 
			
		||||
	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52,
 | 
			
		||||
	0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x61, 0x74,
 | 
			
		||||
	0x63, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02,
 | 
			
		||||
	0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65,
 | 
			
		||||
	0x72, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x69, 0x6e,
 | 
			
		||||
	0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x62, 0x49,
 | 
			
		||||
	0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20,
 | 
			
		||||
	0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x22, 0x27, 0x0a, 0x0b, 0x53, 0x61,
 | 
			
		||||
	0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63,
 | 
			
		||||
	0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63,
 | 
			
		||||
	0x65, 0x73, 0x73, 0x22, 0x5c, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52,
 | 
			
		||||
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f,
 | 
			
		||||
	0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28,
 | 
			
		||||
	0x0c, 0x52, 0x0f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x61,
 | 
			
		||||
	0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78,
 | 
			
		||||
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x62, 0x49, 0x6e, 0x64, 0x65,
 | 
			
		||||
	0x78, 0x22, 0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x70,
 | 
			
		||||
	0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61,
 | 
			
		||||
	0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x79,
 | 
			
		||||
	0x0a, 0x05, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c,
 | 
			
		||||
	0x65, 0x12, 0x14, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65,
 | 
			
		||||
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e,
 | 
			
		||||
	0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3a, 0x0a,
 | 
			
		||||
	0x08, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x12, 0x16, 0x2e, 0x6c, 0x69, 0x67, 0x68,
 | 
			
		||||
	0x74, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 | 
			
		||||
	0x74, 0x1a, 0x14, 0x2e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65,
 | 
			
		||||
	0x76, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74,
 | 
			
		||||
	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x30,
 | 
			
		||||
	0x67, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x2f, 0x72, 0x75, 0x6e,
 | 
			
		||||
	0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f,
 | 
			
		||||
	0x74, 0x6f, 0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	file_light_light_proto_rawDescOnce sync.Once
 | 
			
		||||
	file_light_light_proto_rawDescData = file_light_light_proto_rawDesc
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func file_light_light_proto_rawDescGZIP() []byte {
 | 
			
		||||
	file_light_light_proto_rawDescOnce.Do(func() {
 | 
			
		||||
		file_light_light_proto_rawDescData = protoimpl.X.CompressGZIP(file_light_light_proto_rawDescData)
 | 
			
		||||
	})
 | 
			
		||||
	return file_light_light_proto_rawDescData
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var file_light_light_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
 | 
			
		||||
var file_light_light_proto_goTypes = []interface{}{
 | 
			
		||||
	(*SampleRequest)(nil),   // 0: light.SampleRequest
 | 
			
		||||
	(*SampleReply)(nil),     // 1: light.SampleReply
 | 
			
		||||
	(*RetrieveRequest)(nil), // 2: light.RetrieveRequest
 | 
			
		||||
	(*RetrieveReply)(nil),   // 3: light.RetrieveReply
 | 
			
		||||
}
 | 
			
		||||
var file_light_light_proto_depIdxs = []int32{
 | 
			
		||||
	0, // 0: light.Light.Sample:input_type -> light.SampleRequest
 | 
			
		||||
	2, // 1: light.Light.Retrieve:input_type -> light.RetrieveRequest
 | 
			
		||||
	1, // 2: light.Light.Sample:output_type -> light.SampleReply
 | 
			
		||||
	3, // 3: light.Light.Retrieve:output_type -> light.RetrieveReply
 | 
			
		||||
	2, // [2:4] is the sub-list for method output_type
 | 
			
		||||
	0, // [0:2] is the sub-list for method input_type
 | 
			
		||||
	0, // [0:0] is the sub-list for extension type_name
 | 
			
		||||
	0, // [0:0] is the sub-list for extension extendee
 | 
			
		||||
	0, // [0:0] is the sub-list for field type_name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { file_light_light_proto_init() }
 | 
			
		||||
func file_light_light_proto_init() {
 | 
			
		||||
	if File_light_light_proto != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if !protoimpl.UnsafeEnabled {
 | 
			
		||||
		file_light_light_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*SampleRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
				return &v.sizeCache
 | 
			
		||||
			case 2:
 | 
			
		||||
				return &v.unknownFields
 | 
			
		||||
			default:
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_light_light_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*SampleReply); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
				return &v.sizeCache
 | 
			
		||||
			case 2:
 | 
			
		||||
				return &v.unknownFields
 | 
			
		||||
			default:
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_light_light_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*RetrieveRequest); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
				return &v.sizeCache
 | 
			
		||||
			case 2:
 | 
			
		||||
				return &v.unknownFields
 | 
			
		||||
			default:
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		file_light_light_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 | 
			
		||||
			switch v := v.(*RetrieveReply); i {
 | 
			
		||||
			case 0:
 | 
			
		||||
				return &v.state
 | 
			
		||||
			case 1:
 | 
			
		||||
				return &v.sizeCache
 | 
			
		||||
			case 2:
 | 
			
		||||
				return &v.unknownFields
 | 
			
		||||
			default:
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	type x struct{}
 | 
			
		||||
	out := protoimpl.TypeBuilder{
 | 
			
		||||
		File: protoimpl.DescBuilder{
 | 
			
		||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
			
		||||
			RawDescriptor: file_light_light_proto_rawDesc,
 | 
			
		||||
			NumEnums:      0,
 | 
			
		||||
			NumMessages:   4,
 | 
			
		||||
			NumExtensions: 0,
 | 
			
		||||
			NumServices:   1,
 | 
			
		||||
		},
 | 
			
		||||
		GoTypes:           file_light_light_proto_goTypes,
 | 
			
		||||
		DependencyIndexes: file_light_light_proto_depIdxs,
 | 
			
		||||
		MessageInfos:      file_light_light_proto_msgTypes,
 | 
			
		||||
	}.Build()
 | 
			
		||||
	File_light_light_proto = out.File
 | 
			
		||||
	file_light_light_proto_rawDesc = nil
 | 
			
		||||
	file_light_light_proto_goTypes = nil
 | 
			
		||||
	file_light_light_proto_depIdxs = nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										141
									
								
								helper/da/light/light_grpc.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								helper/da/light/light_grpc.pb.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,141 @@
 | 
			
		||||
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 | 
			
		||||
// versions:
 | 
			
		||||
// - protoc-gen-go-grpc v1.2.0
 | 
			
		||||
// - protoc             v4.25.3
 | 
			
		||||
// source: light/light.proto
 | 
			
		||||
 | 
			
		||||
package light
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	context "context"
 | 
			
		||||
	grpc "google.golang.org/grpc"
 | 
			
		||||
	codes "google.golang.org/grpc/codes"
 | 
			
		||||
	status "google.golang.org/grpc/status"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the grpc package it is being compiled against.
 | 
			
		||||
// Requires gRPC-Go v1.32.0 or later.
 | 
			
		||||
const _ = grpc.SupportPackageIsVersion7
 | 
			
		||||
 | 
			
		||||
// LightClient is the client API for Light service.
 | 
			
		||||
//
 | 
			
		||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 | 
			
		||||
type LightClient interface {
 | 
			
		||||
	Sample(ctx context.Context, in *SampleRequest, opts ...grpc.CallOption) (*SampleReply, error)
 | 
			
		||||
	Retrieve(ctx context.Context, in *RetrieveRequest, opts ...grpc.CallOption) (*RetrieveReply, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type lightClient struct {
 | 
			
		||||
	cc grpc.ClientConnInterface
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewLightClient(cc grpc.ClientConnInterface) LightClient {
 | 
			
		||||
	return &lightClient{cc}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *lightClient) Sample(ctx context.Context, in *SampleRequest, opts ...grpc.CallOption) (*SampleReply, error) {
 | 
			
		||||
	out := new(SampleReply)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/light.Light/Sample", in, out, opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *lightClient) Retrieve(ctx context.Context, in *RetrieveRequest, opts ...grpc.CallOption) (*RetrieveReply, error) {
 | 
			
		||||
	out := new(RetrieveReply)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/light.Light/Retrieve", in, out, opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LightServer is the server API for Light service.
 | 
			
		||||
// All implementations must embed UnimplementedLightServer
 | 
			
		||||
// for forward compatibility
 | 
			
		||||
type LightServer interface {
 | 
			
		||||
	Sample(context.Context, *SampleRequest) (*SampleReply, error)
 | 
			
		||||
	Retrieve(context.Context, *RetrieveRequest) (*RetrieveReply, error)
 | 
			
		||||
	mustEmbedUnimplementedLightServer()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnimplementedLightServer must be embedded to have forward compatible implementations.
 | 
			
		||||
type UnimplementedLightServer struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (UnimplementedLightServer) Sample(context.Context, *SampleRequest) (*SampleReply, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method Sample not implemented")
 | 
			
		||||
}
 | 
			
		||||
func (UnimplementedLightServer) Retrieve(context.Context, *RetrieveRequest) (*RetrieveReply, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method Retrieve not implemented")
 | 
			
		||||
}
 | 
			
		||||
func (UnimplementedLightServer) mustEmbedUnimplementedLightServer() {}
 | 
			
		||||
 | 
			
		||||
// UnsafeLightServer may be embedded to opt out of forward compatibility for this service.
 | 
			
		||||
// Use of this interface is not recommended, as added methods to LightServer will
 | 
			
		||||
// result in compilation errors.
 | 
			
		||||
type UnsafeLightServer interface {
 | 
			
		||||
	mustEmbedUnimplementedLightServer()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterLightServer(s grpc.ServiceRegistrar, srv LightServer) {
 | 
			
		||||
	s.RegisterService(&Light_ServiceDesc, srv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _Light_Sample_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(SampleRequest)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if interceptor == nil {
 | 
			
		||||
		return srv.(LightServer).Sample(ctx, in)
 | 
			
		||||
	}
 | 
			
		||||
	info := &grpc.UnaryServerInfo{
 | 
			
		||||
		Server:     srv,
 | 
			
		||||
		FullMethod: "/light.Light/Sample",
 | 
			
		||||
	}
 | 
			
		||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
			
		||||
		return srv.(LightServer).Sample(ctx, req.(*SampleRequest))
 | 
			
		||||
	}
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _Light_Retrieve_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(RetrieveRequest)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if interceptor == nil {
 | 
			
		||||
		return srv.(LightServer).Retrieve(ctx, in)
 | 
			
		||||
	}
 | 
			
		||||
	info := &grpc.UnaryServerInfo{
 | 
			
		||||
		Server:     srv,
 | 
			
		||||
		FullMethod: "/light.Light/Retrieve",
 | 
			
		||||
	}
 | 
			
		||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
			
		||||
		return srv.(LightServer).Retrieve(ctx, req.(*RetrieveRequest))
 | 
			
		||||
	}
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Light_ServiceDesc is the grpc.ServiceDesc for Light service.
 | 
			
		||||
// It's only intended for direct use with grpc.RegisterService,
 | 
			
		||||
// and not to be introspected or modified (even as a copy)
 | 
			
		||||
var Light_ServiceDesc = grpc.ServiceDesc{
 | 
			
		||||
	ServiceName: "light.Light",
 | 
			
		||||
	HandlerType: (*LightServer)(nil),
 | 
			
		||||
	Methods: []grpc.MethodDesc{
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "Sample",
 | 
			
		||||
			Handler:    _Light_Sample_Handler,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "Retrieve",
 | 
			
		||||
			Handler:    _Light_Retrieve_Handler,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	Streams:  []grpc.StreamDesc{},
 | 
			
		||||
	Metadata: "light/light.proto",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										89
									
								
								helper/da/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								helper/da/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,89 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/signal"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-evmos/helper/da/service"
 | 
			
		||||
	"github.com/0glabs/0g-evmos/helper/da/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/lesismal/nbio/nbhttp"
 | 
			
		||||
	"github.com/lesismal/nbio/nbhttp/websocket"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	subscribeMsg = "{\"jsonrpc\":\"2.0\",\"method\":\"subscribe\",\"id\":1,\"params\":{\"query\":\"tm.event='Tx'\"}}"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	rpcAddress   = flag.String("rpc-address", "34.214.2.28:32001", "address of da-light rpc server")
 | 
			
		||||
	wsAddress    = flag.String("ws-address", "127.0.0.1:26657", "address of emvos ws server")
 | 
			
		||||
	relativePath = flag.String("relative-path", "", "relative path of evmosd")
 | 
			
		||||
	account      = flag.String("account", "", "account to run evmosd cli")
 | 
			
		||||
	keyring      = flag.String("keyring", "", "keyring to run evmosd cli")
 | 
			
		||||
	homePath     = flag.String("home", "", "home path of evmosd node")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func newUpgrader() *websocket.Upgrader {
 | 
			
		||||
	u := websocket.NewUpgrader()
 | 
			
		||||
	u.OnMessage(func(c *websocket.Conn, messageType websocket.MessageType, data []byte) {
 | 
			
		||||
		log.Println("onEcho:", string(data))
 | 
			
		||||
		ctx := context.WithValue(context.Background(), types.DA_RPC_ADDRESS, *rpcAddress)
 | 
			
		||||
		ctx = context.WithValue(ctx, types.NODE_CLI_RELATIVE_PATH, *relativePath)
 | 
			
		||||
		ctx = context.WithValue(ctx, types.NODE_CLI_EXEC_ACCOUNT, *account)
 | 
			
		||||
		ctx = context.WithValue(ctx, types.NODE_CLI_EXEC_KEYRING, *keyring)
 | 
			
		||||
		ctx = context.WithValue(ctx, types.NODE_HOME_PATH, *homePath)
 | 
			
		||||
		go func() { service.OnMessage(ctx, c, messageType, data) }()
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	u.OnClose(func(c *websocket.Conn, err error) {
 | 
			
		||||
		fmt.Println("OnClose:", c.RemoteAddr().String(), err)
 | 
			
		||||
		service.OnClose()
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	return u
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
	engine := nbhttp.NewEngine(nbhttp.Config{})
 | 
			
		||||
	err := engine.Start()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("nbio.Start failed: %v\n", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		u := url.URL{Scheme: "ws", Host: *wsAddress, Path: "/websocket"}
 | 
			
		||||
		dialer := &websocket.Dialer{
 | 
			
		||||
			Engine:      engine,
 | 
			
		||||
			Upgrader:    newUpgrader(),
 | 
			
		||||
			DialTimeout: time.Second * 3,
 | 
			
		||||
		}
 | 
			
		||||
		c, res, err := dialer.Dial(u.String(), nil)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if res != nil && res.Body != nil {
 | 
			
		||||
				bReason, _ := io.ReadAll(res.Body)
 | 
			
		||||
				fmt.Printf("dial failed: %v, reason: %v\n", err, string(bReason))
 | 
			
		||||
			} else {
 | 
			
		||||
				fmt.Printf("dial failed: %v\n", err)
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		c.WriteMessage(websocket.TextMessage, []byte(subscribeMsg))
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	interrupt := make(chan os.Signal, 1)
 | 
			
		||||
	signal.Notify(interrupt, os.Interrupt)
 | 
			
		||||
	<-interrupt
 | 
			
		||||
	ctx, cancel := context.WithCancel(context.Background())
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	engine.Shutdown(ctx)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										33
									
								
								helper/da/proto/light.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								helper/da/proto/light.proto
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
			
		||||
syntax = "proto3";
 | 
			
		||||
 | 
			
		||||
package light;
 | 
			
		||||
 | 
			
		||||
option go_package = "proto/light";
 | 
			
		||||
 | 
			
		||||
service Light {
 | 
			
		||||
  rpc Sample(SampleRequest) returns (SampleReply) {}
 | 
			
		||||
  rpc Retrieve(RetrieveRequest) returns (RetrieveReply) {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SampleRequest contains the blob to sample (by batch and blob index) and required sample times
 | 
			
		||||
message SampleRequest {
 | 
			
		||||
  bytes stream_id = 1;
 | 
			
		||||
  bytes batch_header_hash = 2;
 | 
			
		||||
  uint32 blob_index = 3;
 | 
			
		||||
  uint32 times = 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SampleReply contains the sample result
 | 
			
		||||
message SampleReply {
 | 
			
		||||
  bool success = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message RetrieveRequest {
 | 
			
		||||
  bytes batch_header_hash = 1;
 | 
			
		||||
  uint32 blob_index = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message RetrieveReply {
 | 
			
		||||
  bool status = 1;
 | 
			
		||||
  bytes data = 2;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										186
									
								
								helper/da/service/handler.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								helper/da/service/handler.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,186 @@
 | 
			
		||||
package service
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-evmos/helper/da/client"
 | 
			
		||||
	"github.com/0glabs/0g-evmos/helper/da/types"
 | 
			
		||||
	"github.com/0glabs/0g-evmos/helper/da/utils/sizedw8grp"
 | 
			
		||||
 | 
			
		||||
	jsoniter "github.com/json-iterator/go"
 | 
			
		||||
	"github.com/lesismal/nbio/nbhttp/websocket"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"github.com/rs/zerolog/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	defaultClientInstance = 10
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var rpcClient client.DaLightRpcClient
 | 
			
		||||
 | 
			
		||||
func OnMessage(ctx context.Context, c *websocket.Conn, messageType websocket.MessageType, data []byte) {
 | 
			
		||||
	if messageType == websocket.TextMessage {
 | 
			
		||||
		rawMsg := unwrapJsonRpc(data)
 | 
			
		||||
		if verifyQuery(rawMsg) {
 | 
			
		||||
			eventStr := jsoniter.Get(rawMsg, "events").ToString()
 | 
			
		||||
			events := map[string][]string{}
 | 
			
		||||
			if err := jsoniter.UnmarshalFromString(eventStr, &events); err == nil {
 | 
			
		||||
				dasRequestMap := make(map[string]string, 4)
 | 
			
		||||
				for key, val := range events {
 | 
			
		||||
					if strings.HasPrefix(key, "das_request.") {
 | 
			
		||||
						dasRequestMap[strings.ReplaceAll(key, "das_request.", "")] = val[0]
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if len(dasRequestMap) == 4 {
 | 
			
		||||
					rid, _ := strconv.ParseUint(dasRequestMap["request_id"], 10, 64)
 | 
			
		||||
					numBlobs, _ := strconv.ParseUint(dasRequestMap["num_blobs"], 10, 64)
 | 
			
		||||
					req := types.DASRequest{
 | 
			
		||||
						RequestId:       rid,
 | 
			
		||||
						StreamId:        dasRequestMap["stream_id"],
 | 
			
		||||
						BatchHeaderHash: dasRequestMap["batch_header_hash"],
 | 
			
		||||
						NumBlobs:        numBlobs,
 | 
			
		||||
					}
 | 
			
		||||
					err := handleDasRequest(ctx, req)
 | 
			
		||||
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						log.Err(err).Msgf("failed to handle das request: %v, %v", req, err)
 | 
			
		||||
					} else {
 | 
			
		||||
						log.Info().Msgf("successfully handled das request: %v", req)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		// TODO: handle other message
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func OnClose() {
 | 
			
		||||
	if rpcClient != nil {
 | 
			
		||||
		rpcClient.Destroy()
 | 
			
		||||
		rpcClient = nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func unwrapJsonRpc(data []byte) []byte {
 | 
			
		||||
	result := jsoniter.Get(data, "result")
 | 
			
		||||
	if 0 < len(result.Keys()) {
 | 
			
		||||
		return []byte(result.ToString())
 | 
			
		||||
	}
 | 
			
		||||
	return []byte{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func verifyQuery(data []byte) bool {
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		return jsoniter.Get(data, "query").ToString() == "tm.event='Tx'"
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func min(a, b int) int {
 | 
			
		||||
	if a < b {
 | 
			
		||||
		return a
 | 
			
		||||
	}
 | 
			
		||||
	return b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func handleDasRequest(ctx context.Context, request types.DASRequest) error {
 | 
			
		||||
	if rpcClient == nil {
 | 
			
		||||
		addrVal := ctx.Value(types.DA_RPC_ADDRESS)
 | 
			
		||||
		if addrVal == nil {
 | 
			
		||||
			return errors.New("da light service address not found in context")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		limit := ctx.Value(types.INSTANCE_LIMIT)
 | 
			
		||||
		if limit == nil {
 | 
			
		||||
			limit = defaultClientInstance
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		rpcClient = client.NewDaLightClient(addrVal.(string), limit.(int))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	streamID, err := hex.DecodeString(request.StreamId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	batchHeaderHash, err := hex.DecodeString(request.BatchHeaderHash)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result := make(chan bool, request.NumBlobs)
 | 
			
		||||
	taskCnt := min(rpcClient.GetInstanceCount(), int(request.NumBlobs))
 | 
			
		||||
	wg := sizedw8grp.New(taskCnt)
 | 
			
		||||
 | 
			
		||||
	for i := uint64(0); i < request.NumBlobs; i++ {
 | 
			
		||||
		wg.Add()
 | 
			
		||||
		go func(idx uint64) {
 | 
			
		||||
			defer wg.Done()
 | 
			
		||||
			ret, err := rpcClient.Sample(ctx, streamID, batchHeaderHash, uint32(idx), 1)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Err(err).Msgf("failed to sample data availability with blob index %d", idx)
 | 
			
		||||
				result <- false
 | 
			
		||||
			} else {
 | 
			
		||||
				log.Info().Msgf("sample result for blob index %d: %v", idx, ret)
 | 
			
		||||
				result <- ret
 | 
			
		||||
			}
 | 
			
		||||
		}(i)
 | 
			
		||||
	}
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
	close(result)
 | 
			
		||||
 | 
			
		||||
	finalResult := true
 | 
			
		||||
	for val := range result {
 | 
			
		||||
		if !val {
 | 
			
		||||
			finalResult = false
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return runEvmosdCliReportDasResult(ctx, request.RequestId, finalResult)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runEvmosdCliReportDasResult(ctx context.Context, requestId uint64, result bool) error {
 | 
			
		||||
	relativePath := ctx.Value(types.NODE_CLI_RELATIVE_PATH)
 | 
			
		||||
	if relativePath == nil {
 | 
			
		||||
		return errors.New("relativePath not found in context")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	account := ctx.Value(types.NODE_CLI_EXEC_ACCOUNT)
 | 
			
		||||
	if account == nil {
 | 
			
		||||
		return errors.New("account not found in context")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	args := []string{
 | 
			
		||||
		"tx",
 | 
			
		||||
		"das",
 | 
			
		||||
		"report-das-result",
 | 
			
		||||
		strconv.FormatUint(requestId, 10),
 | 
			
		||||
		strconv.FormatBool(result),
 | 
			
		||||
		"--from", account.(string),
 | 
			
		||||
		"--gas-prices", "767812500aevmos", // TODO:  use args to set gas prices
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	homePath := ctx.Value(types.NODE_HOME_PATH)
 | 
			
		||||
	if homePath != nil {
 | 
			
		||||
		args = append(args, "--home", homePath.(string))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	keyring := ctx.Value(types.NODE_CLI_EXEC_KEYRING)
 | 
			
		||||
	if keyring != nil {
 | 
			
		||||
		args = append(args, "--keyring-backend", keyring.(string))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cmdStr := relativePath.(string) + "evmosd"
 | 
			
		||||
	cmd := exec.Command(cmdStr, append(args, "-y")...)
 | 
			
		||||
	cmd.Stdout = os.Stdout
 | 
			
		||||
	cmd.Stderr = os.Stderr
 | 
			
		||||
	return cmd.Run()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								helper/da/types/dasreq.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								helper/da/types/dasreq.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
type DASRequest struct {
 | 
			
		||||
	RequestId       uint64 `json:"request_id"`
 | 
			
		||||
	StreamId        string `json:"stream_id"`
 | 
			
		||||
	BatchHeaderHash string `json:"batch_header_hash"`
 | 
			
		||||
	NumBlobs        uint64 `json:"num_blobs"`
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								helper/da/types/keys.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								helper/da/types/keys.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	DA_RPC_ADDRESS         = "rpc_address"
 | 
			
		||||
	INSTANCE_LIMIT         = "instance_limit"
 | 
			
		||||
	NODE_CLI_RELATIVE_PATH = "relative_path"
 | 
			
		||||
	NODE_CLI_EXEC_ACCOUNT  = "node_exec_account"
 | 
			
		||||
	NODE_CLI_EXEC_KEYRING  = "node_exec_keyring"
 | 
			
		||||
	NODE_HOME_PATH         = "home_path"
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										51
									
								
								helper/da/utils/sizedw8grp/sizedw8grp.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								helper/da/utils/sizedw8grp/sizedw8grp.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
package sizedw8grp
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SizedWaitGroup struct {
 | 
			
		||||
	Size int
 | 
			
		||||
 | 
			
		||||
	current chan struct{}
 | 
			
		||||
	wg      sync.WaitGroup
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func New(limit int) SizedWaitGroup {
 | 
			
		||||
	size := math.MaxInt32
 | 
			
		||||
	if limit > 0 {
 | 
			
		||||
		size = limit
 | 
			
		||||
	}
 | 
			
		||||
	return SizedWaitGroup{
 | 
			
		||||
		Size: size,
 | 
			
		||||
 | 
			
		||||
		current: make(chan struct{}, size),
 | 
			
		||||
		wg:      sync.WaitGroup{},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *SizedWaitGroup) Add() {
 | 
			
		||||
	_ = s.AddWithContext(context.Background())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *SizedWaitGroup) AddWithContext(ctx context.Context) error {
 | 
			
		||||
	select {
 | 
			
		||||
	case <-ctx.Done():
 | 
			
		||||
		return ctx.Err()
 | 
			
		||||
	case s.current <- struct{}{}:
 | 
			
		||||
		break
 | 
			
		||||
	}
 | 
			
		||||
	s.wg.Add(1)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *SizedWaitGroup) Done() {
 | 
			
		||||
	<-s.current
 | 
			
		||||
	s.wg.Done()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *SizedWaitGroup) Wait() {
 | 
			
		||||
	s.wg.Wait()
 | 
			
		||||
}
 | 
			
		||||
@ -5,7 +5,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	// communitytypes "github.com/kava-labs/kava/x/community/types"
 | 
			
		||||
	// communitytypes "github.com/0glabs/0g-chain/x/community/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// func (suite *IntegrationTestSuite) TestCommunityUpdateParams_NonAuthority() {
 | 
			
		||||
 | 
			
		||||
@ -12,9 +12,9 @@ import (
 | 
			
		||||
 | 
			
		||||
	ethtypes "github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/tests/e2e/testutil"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/e2e/testutil"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
	evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const initialCosmosCoinConversionDenomFunds = int64(1e4)
 | 
			
		||||
 | 
			
		||||
@ -10,12 +10,12 @@ import (
 | 
			
		||||
	txtypes "github.com/cosmos/cosmos-sdk/types/tx"
 | 
			
		||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	// cdptypes "github.com/kava-labs/kava/x/cdp/types"
 | 
			
		||||
	// evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	// cdptypes "github.com/0glabs/0g-chain/x/cdp/types"
 | 
			
		||||
	// evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/tests/e2e/contracts/greeter"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/e2e/contracts/greeter"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (suite *IntegrationTestSuite) TestEthCallToGreeterContract() {
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ import (
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
			
		||||
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
	evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (suite *IntegrationTestSuite) TestGrpcClientQueryCosmosModule_Balance() {
 | 
			
		||||
 | 
			
		||||
@ -12,8 +12,8 @@ import (
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	ethtypes "github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (suite *IntegrationTestSuite) TestEthGasPriceReturnsMinFee() {
 | 
			
		||||
 | 
			
		||||
@ -18,9 +18,9 @@ import (
 | 
			
		||||
	ethtypes "github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	emtypes "github.com/evmos/ethermint/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/e2e/testutil"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/e2e/testutil"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/grpc/tmservice"
 | 
			
		||||
	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/client/grpc"
 | 
			
		||||
	"github.com/0glabs/0g-chain/client/grpc"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LiveNodeRunnerConfig implements NodeRunner.
 | 
			
		||||
 | 
			
		||||
@ -28,8 +28,8 @@ import (
 | 
			
		||||
	emtests "github.com/evmos/ethermint/tests"
 | 
			
		||||
	emtypes "github.com/evmos/ethermint/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SigningAccount wraps details about an account and its private keys.
 | 
			
		||||
 | 
			
		||||
@ -21,11 +21,11 @@ import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethclient"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	kavaparams "github.com/kava-labs/kava/app/params"
 | 
			
		||||
	"github.com/kava-labs/kava/client/grpc"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/e2e/runner"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	kavaparams "github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/client/grpc"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/e2e/runner"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Chain wraps query clients & accounts for a network
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ type SuiteConfig struct {
 | 
			
		||||
	IncludeIbcTests bool
 | 
			
		||||
 | 
			
		||||
	// The contract address of a deployed ERC-20 token
 | 
			
		||||
	KavaErc20Address string
 | 
			
		||||
	ZgchainERC20Address string
 | 
			
		||||
 | 
			
		||||
	// When true, the chains will remain running after tests complete (pass or fail)
 | 
			
		||||
	SkipShutdown bool
 | 
			
		||||
@ -66,7 +66,7 @@ func ParseSuiteConfig() SuiteConfig {
 | 
			
		||||
		// this mnemonic is expected to be a funded account that can seed the funds for all
 | 
			
		||||
		// new accounts created during tests. it will be available under Accounts["whale"]
 | 
			
		||||
		FundedAccountMnemonic: nonemptyStringEnv("E2E_KAVA_FUNDED_ACCOUNT_MNEMONIC"),
 | 
			
		||||
		KavaErc20Address:      nonemptyStringEnv("E2E_KAVA_ERC20_ADDRESS"),
 | 
			
		||||
		ZgchainERC20Address:   nonemptyStringEnv("E2E_KAVA_ERC20_ADDRESS"),
 | 
			
		||||
		IncludeIbcTests:       mustParseBool("E2E_INCLUDE_IBC_TESTS"),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,9 +7,9 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/tests/e2e/contracts/greeter"
 | 
			
		||||
	// "github.com/kava-labs/kava/x/cdp/types"
 | 
			
		||||
	evmutiltypes "github.com/kava-labs/kava/x/evmutil/types"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/e2e/contracts/greeter"
 | 
			
		||||
	// "github.com/0glabs/0g-chain/x/cdp/types"
 | 
			
		||||
	evmutiltypes "github.com/0glabs/0g-chain/x/evmutil/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// InitKavaEvmData is run after the chain is running, but before the tests are run.
 | 
			
		||||
@ -35,7 +35,7 @@ func (suite *E2eTestSuite) InitKavaEvmData() {
 | 
			
		||||
	found := false
 | 
			
		||||
	erc20Addr := suite.DeployedErc20.Address.Hex()
 | 
			
		||||
	for _, p := range params.Params.EnabledConversionPairs {
 | 
			
		||||
		if common.BytesToAddress(p.KavaERC20Address).Hex() == erc20Addr {
 | 
			
		||||
		if common.BytesToAddress(p.ZgchainERC20Address).Hex() == erc20Addr {
 | 
			
		||||
			found = true
 | 
			
		||||
			suite.DeployedErc20.CosmosDenom = p.Denom
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -10,9 +10,9 @@ import (
 | 
			
		||||
	sdkmath "cosmossdk.io/math"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/e2e/runner"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/e2e/runner"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@ -27,7 +27,7 @@ const (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DeployedErc20 is a type that wraps the details of the pre-deployed erc20 used by the e2e test suite.
 | 
			
		||||
// The Address comes from SuiteConfig.KavaErc20Address
 | 
			
		||||
// The Address comes from SuiteConfig.ZgchainERC20Address
 | 
			
		||||
// The CosmosDenom is fetched from the EnabledConversionPairs param of x/evmutil.
 | 
			
		||||
// The tests expect the following:
 | 
			
		||||
// - the funded account has a nonzero balance of the erc20
 | 
			
		||||
@ -90,7 +90,7 @@ func (suite *E2eTestSuite) SetupSuite() {
 | 
			
		||||
	suiteConfig := ParseSuiteConfig()
 | 
			
		||||
	suite.config = suiteConfig
 | 
			
		||||
	suite.DeployedErc20 = DeployedErc20{
 | 
			
		||||
		Address: common.HexToAddress(suiteConfig.KavaErc20Address),
 | 
			
		||||
		Address: common.HexToAddress(suiteConfig.ZgchainERC20Address),
 | 
			
		||||
		// Denom & CdpCollateralType are fetched in InitKavaEvmData()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,8 +8,8 @@ import (
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app"
 | 
			
		||||
	"github.com/0glabs/0g-chain/tests/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestAddressConversion(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app/params"
 | 
			
		||||
	"github.com/0glabs/0g-chain/app/params"
 | 
			
		||||
	"google.golang.org/grpc/codes"
 | 
			
		||||
	grpcstatus "google.golang.org/grpc/status"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										87
									
								
								x/committee/v1/client/cli/query.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								x/committee/v1/client/cli/query.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,87 @@
 | 
			
		||||
package cli
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/flags"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GetQueryCmd returns the cli query commands for the inflation module.
 | 
			
		||||
func GetQueryCmd() *cobra.Command {
 | 
			
		||||
	cmd := &cobra.Command{
 | 
			
		||||
		Use:                        types.ModuleName,
 | 
			
		||||
		Short:                      "Querying commands for the committee module",
 | 
			
		||||
		DisableFlagParsing:         true,
 | 
			
		||||
		SuggestionsMinimumDistance: 2,
 | 
			
		||||
		RunE:                       client.ValidateCmd,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cmd.AddCommand(
 | 
			
		||||
		GetCurrentCommitteeID(),
 | 
			
		||||
		GetRegisteredVoters(),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetCurrentCommitteeID() *cobra.Command {
 | 
			
		||||
	cmd := &cobra.Command{
 | 
			
		||||
		Use:   "current-committee-id",
 | 
			
		||||
		Short: "Query the current committee ID",
 | 
			
		||||
		Args:  cobra.NoArgs,
 | 
			
		||||
		RunE: func(cmd *cobra.Command, _ []string) error {
 | 
			
		||||
			clientCtx, err := client.GetClientQueryContext(cmd)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			queryClient := types.NewQueryClient(clientCtx)
 | 
			
		||||
 | 
			
		||||
			params := &types.QueryCurrentCommitteeIDRequest{}
 | 
			
		||||
			res, err := queryClient.CurrentCommitteeID(context.Background(), params)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return clientCtx.PrintString(fmt.Sprintf("%v\n", res.CurrentCommitteeID))
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	flags.AddQueryFlagsToCmd(cmd)
 | 
			
		||||
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetRegisteredVoters() *cobra.Command {
 | 
			
		||||
	cmd := &cobra.Command{
 | 
			
		||||
		Use:   "registered-voters",
 | 
			
		||||
		Short: "Query registered voters",
 | 
			
		||||
		Args:  cobra.NoArgs,
 | 
			
		||||
		RunE: func(cmd *cobra.Command, _ []string) error {
 | 
			
		||||
			clientCtx, err := client.GetClientQueryContext(cmd)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			queryClient := types.NewQueryClient(clientCtx)
 | 
			
		||||
 | 
			
		||||
			params := &types.QueryRegisteredVotersRequest{}
 | 
			
		||||
			res, err := queryClient.RegisteredVoters(context.Background(), params)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return clientCtx.PrintString(fmt.Sprintf("%v\n", strings.Join(res.Voters, ",")))
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	flags.AddQueryFlagsToCmd(cmd)
 | 
			
		||||
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										196
									
								
								x/committee/v1/client/cli/tx.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								x/committee/v1/client/cli/tx.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,196 @@
 | 
			
		||||
package cli
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	sdkmath "cosmossdk.io/math"
 | 
			
		||||
	"github.com/0glabs/0g-chain/crypto/vrf"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/flags"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/tx"
 | 
			
		||||
	sdkkr "github.com/cosmos/cosmos-sdk/crypto/keyring"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
 | 
			
		||||
 | 
			
		||||
	vrfalgo "github.com/coniks-sys/coniks-go/crypto/vrf"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client/input"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GetTxCmd returns the transaction commands for this module
 | 
			
		||||
func GetTxCmd() *cobra.Command {
 | 
			
		||||
	cmd := &cobra.Command{
 | 
			
		||||
		Use:                        types.ModuleName,
 | 
			
		||||
		Short:                      fmt.Sprintf("%s transactions subcommands", types.ModuleName),
 | 
			
		||||
		DisableFlagParsing:         true,
 | 
			
		||||
		SuggestionsMinimumDistance: 2,
 | 
			
		||||
		RunE:                       client.ValidateCmd,
 | 
			
		||||
	}
 | 
			
		||||
	cmd.AddCommand(
 | 
			
		||||
		NewRegisterCmd(),
 | 
			
		||||
		NewVoteCmd(),
 | 
			
		||||
	)
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewRegisterCmd() *cobra.Command {
 | 
			
		||||
	cmd := &cobra.Command{
 | 
			
		||||
		Use:   "register",
 | 
			
		||||
		Short: "Register a voter",
 | 
			
		||||
		Args:  cobra.NoArgs,
 | 
			
		||||
		RunE: func(cmd *cobra.Command, args []string) error {
 | 
			
		||||
			// bypass the restriction of set keyring options
 | 
			
		||||
			ctx := client.GetClientContextFromCmd(cmd).WithKeyringOptions(vrf.VrfOption())
 | 
			
		||||
			client.SetCmdClientContext(cmd, ctx)
 | 
			
		||||
			clientCtx, err := client.GetClientTxContext(cmd)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			kr := clientCtx.Keyring
 | 
			
		||||
			// get account name by address
 | 
			
		||||
			accAddr := clientCtx.GetFromAddress()
 | 
			
		||||
			accRecord, err := kr.KeyByAddress(accAddr)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				// not found record by address in keyring
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// check voter account record exists
 | 
			
		||||
			voterAccName := accRecord.Name + "-voter"
 | 
			
		||||
			_, err = kr.Key(voterAccName)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				// account exists, ask for user confirmation
 | 
			
		||||
				response, err2 := input.GetConfirmation(fmt.Sprintf("override the existing name %s", voterAccName), bufio.NewReader(clientCtx.Input), cmd.ErrOrStderr())
 | 
			
		||||
				if err2 != nil {
 | 
			
		||||
					return err2
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if !response {
 | 
			
		||||
					return errors.New("aborted")
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				err2 = kr.Delete(voterAccName)
 | 
			
		||||
				if err2 != nil {
 | 
			
		||||
					return err2
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			keyringAlgos, _ := kr.SupportedAlgorithms()
 | 
			
		||||
			algo, err := sdkkr.NewSigningAlgoFromString("vrf", keyringAlgos)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			newRecord, err := kr.NewAccount(voterAccName, "", "", "", algo)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			pubKey, err := newRecord.GetPubKey()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			valAddr, err := sdk.ValAddressFromHex(hex.EncodeToString(clientCtx.GetFromAddress().Bytes()))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			msg := &types.MsgRegister{
 | 
			
		||||
				Voter: valAddr.String(),
 | 
			
		||||
				Key:   pubKey.Bytes(),
 | 
			
		||||
			}
 | 
			
		||||
			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	flags.AddTxFlagsToCmd(cmd)
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewVoteCmd() *cobra.Command {
 | 
			
		||||
	cmd := &cobra.Command{
 | 
			
		||||
		Use:   "vote committee-id",
 | 
			
		||||
		Short: "Vote on a proposal",
 | 
			
		||||
		Args:  cobra.MinimumNArgs(1),
 | 
			
		||||
		RunE: func(cmd *cobra.Command, args []string) error {
 | 
			
		||||
			clientCtx, err := client.GetClientTxContext(cmd)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			kr := clientCtx.Keyring
 | 
			
		||||
 | 
			
		||||
			// get account name by address
 | 
			
		||||
			inAddr := clientCtx.GetFromAddress()
 | 
			
		||||
 | 
			
		||||
			valAddr, err := sdk.ValAddressFromHex(hex.EncodeToString(inAddr.Bytes()))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			inRecord, err := kr.KeyByAddress(inAddr)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				// not found record by address in keyring
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// check voter account record exists
 | 
			
		||||
			voterAccName := inRecord.Name + "-voter"
 | 
			
		||||
			voterRecord, err := kr.Key(voterAccName)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				// not found voter account
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			sk := vrfalgo.PrivateKey(voterRecord.GetLocal().PrivKey.Value)
 | 
			
		||||
 | 
			
		||||
			committeeID, err := strconv.ParseUint(args[0], 10, 64)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			votingStartHeight := types.DefaultVotingStartHeight + (committeeID-1)*types.DefaultVotingPeriod
 | 
			
		||||
 | 
			
		||||
			rsp, err := stakingtypes.NewQueryClient(clientCtx).HistoricalInfo(cmd.Context(), &stakingtypes.QueryHistoricalInfoRequest{Height: int64(votingStartHeight)})
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var tokens sdkmath.Int
 | 
			
		||||
			for _, val := range rsp.Hist.Valset {
 | 
			
		||||
				thisValAddr := val.GetOperator()
 | 
			
		||||
				if thisValAddr.Equals(valAddr) {
 | 
			
		||||
					tokens = val.GetTokens()
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// 1_000 0AGI token / vote
 | 
			
		||||
			numBallots := tokens.Quo(sdk.NewInt(1_000_000_000_000_000_000)).Quo(sdk.NewInt(1_000)).Uint64()
 | 
			
		||||
			ballots := make([]*types.Ballot, numBallots)
 | 
			
		||||
			for i := range ballots {
 | 
			
		||||
				ballotID := uint64(i)
 | 
			
		||||
				ballots[i] = &types.Ballot{
 | 
			
		||||
					ID:      ballotID,
 | 
			
		||||
					Content: sk.Compute(bytes.Join([][]byte{rsp.Hist.Header.LastCommitHash, types.Uint64ToBytes(ballotID)}, nil)),
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			msg := &types.MsgVote{
 | 
			
		||||
				CommitteeID: committeeID,
 | 
			
		||||
				Voter:       valAddr.String(),
 | 
			
		||||
				Ballots:     ballots,
 | 
			
		||||
			}
 | 
			
		||||
			return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	flags.AddTxFlagsToCmd(cmd)
 | 
			
		||||
	return cmd
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								x/committee/v1/genesis.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								x/committee/v1/genesis.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,56 @@
 | 
			
		||||
package committee
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	errorsmod "cosmossdk.io/errors"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/keeper"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// InitGenesis initializes the store state from a genesis state.
 | 
			
		||||
func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, gs types.GenesisState) {
 | 
			
		||||
	if err := gs.Validate(); err != nil {
 | 
			
		||||
		panic(fmt.Sprintf("failed to validate %s genesis state: %s", types.ModuleName, err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	params := gs.Params
 | 
			
		||||
	err := keeper.SetParams(ctx, params)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(errorsmod.Wrapf(err, "error setting params"))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	keeper.SetCurrentCommitteeID(ctx, gs.CurrentCommitteeID)
 | 
			
		||||
 | 
			
		||||
	for _, p := range gs.Committees {
 | 
			
		||||
		keeper.SetCommittee(ctx, p)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExportGenesis returns a GenesisState for a given context and keeper.
 | 
			
		||||
func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState {
 | 
			
		||||
	startHeight, err := keeper.GetVotingStartHeight(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	period, err := keeper.GetVotingPeriod(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	currentID, err := keeper.GetCurrentCommitteeID(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return types.NewGenesisState(
 | 
			
		||||
		keeper.GetParams(ctx),
 | 
			
		||||
		startHeight,
 | 
			
		||||
		period,
 | 
			
		||||
		currentID,
 | 
			
		||||
		keeper.GetCommittees(ctx),
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										72
									
								
								x/committee/v1/keeper/abci.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								x/committee/v1/keeper/abci.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,72 @@
 | 
			
		||||
package keeper
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sort"
 | 
			
		||||
 | 
			
		||||
	abci "github.com/cometbft/cometbft/abci/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Ballot struct {
 | 
			
		||||
	voter   sdk.ValAddress
 | 
			
		||||
	content string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *Keeper) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) {
 | 
			
		||||
	committeeID, err := k.GetCurrentCommitteeID(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// TODO: handle the case where committeeID is not available
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	committee, bz := k.GetCommittee(ctx, committeeID)
 | 
			
		||||
	if !bz {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ctx.BlockHeight() >= int64(committee.StartHeight) {
 | 
			
		||||
		// We are ready to accept votes for the next committee
 | 
			
		||||
		if err := k.StoreNewCommittee(ctx, committee.StartHeight); err != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ctx.BlockHeight() < int64(committee.EndHeight) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	k.IncrementCurrentCommitteeID(ctx)
 | 
			
		||||
	committee, bz = k.GetCommittee(ctx, committeeID+1)
 | 
			
		||||
	if !bz {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ballots := []Ballot{}
 | 
			
		||||
	seen := make(map[string]struct{})
 | 
			
		||||
	for _, vote := range committee.Votes {
 | 
			
		||||
		for _, ballot := range vote.Ballots {
 | 
			
		||||
			ballot := Ballot{
 | 
			
		||||
				voter:   vote.Voter,
 | 
			
		||||
				content: string(ballot.Content),
 | 
			
		||||
			}
 | 
			
		||||
			if _, ok := seen[ballot.content]; ok {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			ballots = append(ballots, ballot)
 | 
			
		||||
			seen[ballot.content] = struct{}{}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	sort.Slice(ballots, func(i, j int) bool {
 | 
			
		||||
		return ballots[i].content < ballots[j].content
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	committeeSize := k.GetParams(ctx).CommitteeSize
 | 
			
		||||
	committee.Members = make([]sdk.ValAddress, committeeSize)
 | 
			
		||||
	for i := 0; i < int(committeeSize); i = i + 1 {
 | 
			
		||||
		committee.Members[i] = ballots[i].voter
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	k.SetCommittee(ctx, committee)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *Keeper) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) {
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								x/committee/v1/keeper/grpc_query.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								x/committee/v1/keeper/grpc_query.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
package keeper
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ types.QueryServer = Keeper{}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) CurrentCommitteeID(
 | 
			
		||||
	c context.Context,
 | 
			
		||||
	_ *types.QueryCurrentCommitteeIDRequest,
 | 
			
		||||
) (*types.QueryCurrentCommitteeIDResponse, error) {
 | 
			
		||||
	ctx := sdk.UnwrapSDKContext(c)
 | 
			
		||||
	currentCommitteeID, err := k.GetCurrentCommitteeID(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &types.QueryCurrentCommitteeIDResponse{CurrentCommitteeID: currentCommitteeID}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) RegisteredVoters(
 | 
			
		||||
	c context.Context,
 | 
			
		||||
	_ *types.QueryRegisteredVotersRequest,
 | 
			
		||||
) (*types.QueryRegisteredVotersResponse, error) {
 | 
			
		||||
	ctx := sdk.UnwrapSDKContext(c)
 | 
			
		||||
	voterAddrs := k.GetVoters(ctx)
 | 
			
		||||
	voters := make([]string, len(voterAddrs))
 | 
			
		||||
	for i, voterAddr := range voterAddrs {
 | 
			
		||||
		voters[i] = voterAddr.String()
 | 
			
		||||
	}
 | 
			
		||||
	return &types.QueryRegisteredVotersResponse{Voters: voters}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										323
									
								
								x/committee/v1/keeper/keeper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										323
									
								
								x/committee/v1/keeper/keeper.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,323 @@
 | 
			
		||||
package keeper
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	errorsmod "cosmossdk.io/errors"
 | 
			
		||||
	"github.com/cometbft/cometbft/libs/log"
 | 
			
		||||
	"github.com/coniks-sys/coniks-go/crypto/vrf"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/store/prefix"
 | 
			
		||||
	storetypes "github.com/cosmos/cosmos-sdk/store/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Keeper of the inflation store
 | 
			
		||||
type Keeper struct {
 | 
			
		||||
	storeKey      storetypes.StoreKey
 | 
			
		||||
	cdc           codec.BinaryCodec
 | 
			
		||||
	stakingKeeper types.StakingKeeper
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewKeeper creates a new mint Keeper instance
 | 
			
		||||
func NewKeeper(
 | 
			
		||||
	storeKey storetypes.StoreKey,
 | 
			
		||||
	cdc codec.BinaryCodec,
 | 
			
		||||
	stakingKeeper types.StakingKeeper,
 | 
			
		||||
) Keeper {
 | 
			
		||||
	return Keeper{
 | 
			
		||||
		storeKey:      storeKey,
 | 
			
		||||
		cdc:           cdc,
 | 
			
		||||
		stakingKeeper: stakingKeeper,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Logger returns a module-specific logger.
 | 
			
		||||
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
 | 
			
		||||
	return ctx.Logger().With("module", "x/"+types.ModuleName)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
//				Committees
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
 | 
			
		||||
func (k Keeper) SetCurrentCommitteeID(ctx sdk.Context, id uint64) {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	store.Set(types.CurrentCommitteeIDKey, types.GetKeyFromID(id))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) GetCurrentCommitteeID(ctx sdk.Context) (uint64, error) {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	bz := store.Get(types.CurrentCommitteeIDKey)
 | 
			
		||||
	if bz == nil {
 | 
			
		||||
		return 0, errorsmod.Wrap(types.ErrInvalidGenesis, "current committee ID not set at genesis")
 | 
			
		||||
	}
 | 
			
		||||
	return types.Uint64FromBytes(bz), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) IncrementCurrentCommitteeID(ctx sdk.Context) error {
 | 
			
		||||
	id, err := k.GetCurrentCommitteeID(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	k.SetCurrentCommitteeID(ctx, id+1)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) SetVotingStartHeight(ctx sdk.Context, votingStartHeight uint64) {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	store.Set(types.VotingStartHeightKey, types.GetKeyFromID(votingStartHeight))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) GetVotingStartHeight(ctx sdk.Context) (uint64, error) {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	bz := store.Get(types.VotingStartHeightKey)
 | 
			
		||||
	if bz == nil {
 | 
			
		||||
		return 0, errorsmod.Wrap(types.ErrInvalidGenesis, "voting start height not set at genesis")
 | 
			
		||||
	}
 | 
			
		||||
	return types.Uint64FromBytes(bz), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) SetVotingPeriod(ctx sdk.Context, votingPeriod uint64) {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	store.Set(types.VotingPeriodKey, types.GetKeyFromID(votingPeriod))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) GetVotingPeriod(ctx sdk.Context) (uint64, error) {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	bz := store.Get(types.VotingPeriodKey)
 | 
			
		||||
	if bz == nil {
 | 
			
		||||
		return 0, errorsmod.Wrap(types.ErrInvalidGenesis, "voting period not set at genesis")
 | 
			
		||||
	}
 | 
			
		||||
	return types.Uint64FromBytes(bz), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StoreNewCommittee stores a committee, adding a new ID
 | 
			
		||||
func (k Keeper) StoreNewCommittee(ctx sdk.Context, votingStartHeight uint64) error {
 | 
			
		||||
	currentCommitteeID, err := k.GetCurrentCommitteeID(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	votingPeriod, err := k.GetVotingPeriod(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	com := types.Committee{
 | 
			
		||||
		ID:                currentCommitteeID + 1,
 | 
			
		||||
		VotingStartHeight: votingStartHeight,
 | 
			
		||||
		StartHeight:       votingStartHeight + votingPeriod,
 | 
			
		||||
		EndHeight:         votingStartHeight + votingPeriod*2,
 | 
			
		||||
		Votes:             []types.Vote{},
 | 
			
		||||
		Members:           []sdk.ValAddress{},
 | 
			
		||||
	}
 | 
			
		||||
	k.SetCommittee(ctx, com)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) GetCommittee(ctx sdk.Context, committeeID uint64) (types.Committee, bool) {
 | 
			
		||||
	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.CommitteeKeyPrefix)
 | 
			
		||||
	bz := store.Get(types.GetKeyFromID(committeeID))
 | 
			
		||||
	if bz == nil {
 | 
			
		||||
		return types.Committee{}, false
 | 
			
		||||
	}
 | 
			
		||||
	var com types.Committee
 | 
			
		||||
	k.cdc.MustUnmarshal(bz, &com)
 | 
			
		||||
	return com, true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetCommittee puts a committee into the store.
 | 
			
		||||
func (k Keeper) SetCommittee(ctx sdk.Context, committee types.Committee) {
 | 
			
		||||
	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.CommitteeKeyPrefix)
 | 
			
		||||
	bz := k.cdc.MustMarshal(&committee)
 | 
			
		||||
	store.Set(types.GetKeyFromID(committee.ID), bz)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// // DeleteProposal removes a proposal from the store.
 | 
			
		||||
// func (k Keeper) DeleteProposal(ctx sdk.Context, proposalID uint64) {
 | 
			
		||||
// 	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.ProposalKeyPrefix)
 | 
			
		||||
// 	store.Delete(types.GetKeyFromID(proposalID))
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// IterateProposals provides an iterator over all stored proposals.
 | 
			
		||||
// For each proposal, cb will be called. If cb returns true, the iterator will close and stop.
 | 
			
		||||
func (k Keeper) IterateCommittee(ctx sdk.Context, cb func(proposal types.Committee) (stop bool)) {
 | 
			
		||||
	iterator := sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), types.CommitteeKeyPrefix)
 | 
			
		||||
 | 
			
		||||
	defer iterator.Close()
 | 
			
		||||
	for ; iterator.Valid(); iterator.Next() {
 | 
			
		||||
		var committee types.Committee
 | 
			
		||||
		k.cdc.MustUnmarshal(iterator.Value(), &committee)
 | 
			
		||||
		if cb(committee) {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) GetCommittees(ctx sdk.Context) types.Committees {
 | 
			
		||||
	results := types.Committees{}
 | 
			
		||||
	k.IterateCommittee(ctx, func(prop types.Committee) bool {
 | 
			
		||||
		results = append(results, prop)
 | 
			
		||||
		return false
 | 
			
		||||
	})
 | 
			
		||||
	return results
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// // DeleteProposalAndVotes removes a proposal and its associated votes.
 | 
			
		||||
// func (k Keeper) DeleteProposalAndVotes(ctx sdk.Context, proposalID uint64) {
 | 
			
		||||
// 	votes := k.GetVotesByProposal(ctx, proposalID)
 | 
			
		||||
// 	k.DeleteProposal(ctx, proposalID)
 | 
			
		||||
// 	for _, v := range votes {
 | 
			
		||||
// 		k.DeleteVote(ctx, v.ProposalID, v.Voter)
 | 
			
		||||
// 	}
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
//				Votes
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
 | 
			
		||||
// GetVote gets a vote from the store.
 | 
			
		||||
func (k Keeper) GetVote(ctx sdk.Context, epochID uint64, voter sdk.ValAddress) (types.Vote, bool) {
 | 
			
		||||
	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.VoteKeyPrefix)
 | 
			
		||||
	bz := store.Get(types.GetVoteKey(epochID, voter))
 | 
			
		||||
	if bz == nil {
 | 
			
		||||
		return types.Vote{}, false
 | 
			
		||||
	}
 | 
			
		||||
	var vote types.Vote
 | 
			
		||||
	k.cdc.MustUnmarshal(bz, &vote)
 | 
			
		||||
	return vote, true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetVote puts a vote into the store.
 | 
			
		||||
func (k Keeper) SetVote(ctx sdk.Context, vote types.Vote) {
 | 
			
		||||
	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.VoteKeyPrefix)
 | 
			
		||||
	bz := k.cdc.MustMarshal(&vote)
 | 
			
		||||
	store.Set(types.GetVoteKey(vote.CommitteeID, vote.Voter), bz)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteVote removes a Vote from the store.
 | 
			
		||||
func (k Keeper) DeleteVote(ctx sdk.Context, committeeID uint64, voter sdk.ValAddress) {
 | 
			
		||||
	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.VoteKeyPrefix)
 | 
			
		||||
	store.Delete(types.GetVoteKey(committeeID, voter))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IterateVotes provides an iterator over all stored votes.
 | 
			
		||||
// For each vote, cb will be called. If cb returns true, the iterator will close and stop.
 | 
			
		||||
func (k Keeper) IterateVotes(ctx sdk.Context, cb func(vote types.Vote) (stop bool)) {
 | 
			
		||||
	iterator := sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), types.VoteKeyPrefix)
 | 
			
		||||
 | 
			
		||||
	defer iterator.Close()
 | 
			
		||||
	for ; iterator.Valid(); iterator.Next() {
 | 
			
		||||
		var vote types.Vote
 | 
			
		||||
		k.cdc.MustUnmarshal(iterator.Value(), &vote)
 | 
			
		||||
 | 
			
		||||
		if cb(vote) {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetVotes returns all stored votes.
 | 
			
		||||
func (k Keeper) GetVotes(ctx sdk.Context) []types.Vote {
 | 
			
		||||
	results := []types.Vote{}
 | 
			
		||||
	k.IterateVotes(ctx, func(vote types.Vote) bool {
 | 
			
		||||
		results = append(results, vote)
 | 
			
		||||
		return false
 | 
			
		||||
	})
 | 
			
		||||
	return results
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetVotesByProposal returns all votes for one proposal.
 | 
			
		||||
func (k Keeper) GetVotesByCommittee(ctx sdk.Context, committeeID uint64) []types.Vote {
 | 
			
		||||
	results := []types.Vote{}
 | 
			
		||||
	iterator := sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), append(types.VoteKeyPrefix, types.GetKeyFromID(committeeID)...))
 | 
			
		||||
 | 
			
		||||
	defer iterator.Close()
 | 
			
		||||
	for ; iterator.Valid(); iterator.Next() {
 | 
			
		||||
		var vote types.Vote
 | 
			
		||||
		k.cdc.MustUnmarshal(iterator.Value(), &vote)
 | 
			
		||||
		results = append(results, vote)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return results
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
//				Voters
 | 
			
		||||
// ------------------------------------------
 | 
			
		||||
 | 
			
		||||
func (k Keeper) SetVoter(ctx sdk.Context, voter sdk.ValAddress, pk vrf.PublicKey) {
 | 
			
		||||
	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.VoterKeyPrefix)
 | 
			
		||||
	store.Set(types.GetVoterKey(voter), pk)
 | 
			
		||||
	fmt.Printf("voterStoreKey: %v, publicKey: %v\n", types.GetVoterKey(voter), pk)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) IterateVoters(ctx sdk.Context, cb func(voter sdk.ValAddress, pk vrf.PublicKey) (stop bool)) {
 | 
			
		||||
	iterator := sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), types.VoterKeyPrefix)
 | 
			
		||||
 | 
			
		||||
	defer iterator.Close()
 | 
			
		||||
	for ; iterator.Valid(); iterator.Next() {
 | 
			
		||||
		if cb(sdk.ValAddress(iterator.Key()[1:]), vrf.PublicKey(iterator.Value())) {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetVotes returns all stored voters
 | 
			
		||||
func (k Keeper) GetVoters(ctx sdk.Context) []sdk.ValAddress {
 | 
			
		||||
	results := []sdk.ValAddress{}
 | 
			
		||||
	k.IterateVoters(ctx, func(voter sdk.ValAddress, _ vrf.PublicKey) bool {
 | 
			
		||||
		results = append(results, voter)
 | 
			
		||||
		return false
 | 
			
		||||
	})
 | 
			
		||||
	return results
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) AddVoter(ctx sdk.Context, voter sdk.ValAddress, key []byte) error {
 | 
			
		||||
	if len(key) != vrf.PublicKeySize {
 | 
			
		||||
		return types.ErrInvalidPublicKey
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	k.SetVoter(ctx, voter, vrf.PublicKey(key))
 | 
			
		||||
 | 
			
		||||
	ctx.EventManager().EmitEvent(
 | 
			
		||||
		sdk.NewEvent(
 | 
			
		||||
			types.EventTypeRegister,
 | 
			
		||||
			sdk.NewAttribute(types.AttributeKeyVoter, voter.String()),
 | 
			
		||||
			// TODO: types.AttributeKeyPublicKey
 | 
			
		||||
		),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) AddVote(ctx sdk.Context, committeeID uint64, voter sdk.ValAddress, ballots []*types.Ballot) error {
 | 
			
		||||
	// Validate
 | 
			
		||||
	com, found := k.GetCommittee(ctx, committeeID)
 | 
			
		||||
	if !found {
 | 
			
		||||
		return errorsmod.Wrapf(types.ErrUnknownCommittee, "%d", committeeID)
 | 
			
		||||
	}
 | 
			
		||||
	if com.HasVotingEndedBy(ctx.BlockHeight()) {
 | 
			
		||||
		return errorsmod.Wrapf(types.ErrProposalExpired, "%d ≥ %d", ctx.BlockHeight(), com.StartHeight)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: verify if the voter is registered
 | 
			
		||||
	// TODO: verify whether ballots are valid or not
 | 
			
		||||
 | 
			
		||||
	// Store vote, overwriting any prior vote
 | 
			
		||||
	k.SetVote(ctx, types.NewVote(committeeID, voter, ballots))
 | 
			
		||||
 | 
			
		||||
	ctx.EventManager().EmitEvent(
 | 
			
		||||
		sdk.NewEvent(
 | 
			
		||||
			types.EventTypeVote,
 | 
			
		||||
			sdk.NewAttribute(types.AttributeKeyCommitteeID, fmt.Sprintf("%d", com.ID)),
 | 
			
		||||
			sdk.NewAttribute(types.AttributeKeyVoter, voter.String()),
 | 
			
		||||
			// TODO: types.AttributeKeyBallots
 | 
			
		||||
		),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								x/committee/v1/keeper/msg_server.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								x/committee/v1/keeper/msg_server.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
// Copyright Tharsis Labs Ltd.(Evmos)
 | 
			
		||||
// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob/main/LICENSE)
 | 
			
		||||
 | 
			
		||||
package keeper
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ types.MsgServer = &Keeper{}
 | 
			
		||||
 | 
			
		||||
// Register handles MsgRegister messages
 | 
			
		||||
func (k Keeper) Register(goCtx context.Context, msg *types.MsgRegister) (*types.MsgRegisterResponse, error) {
 | 
			
		||||
	ctx := sdk.UnwrapSDKContext(goCtx)
 | 
			
		||||
 | 
			
		||||
	valAddr, err := sdk.ValAddressFromBech32(msg.Voter)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, found := k.stakingKeeper.GetValidator(ctx, valAddr)
 | 
			
		||||
	if !found {
 | 
			
		||||
		return nil, stakingtypes.ErrNoValidatorFound
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := k.AddVoter(ctx, valAddr, msg.Key); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &types.MsgRegisterResponse{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Vote handles MsgVote messages
 | 
			
		||||
func (k Keeper) Vote(goCtx context.Context, msg *types.MsgVote) (*types.MsgVoteResponse, error) {
 | 
			
		||||
	ctx := sdk.UnwrapSDKContext(goCtx)
 | 
			
		||||
 | 
			
		||||
	voter, err := sdk.ValAddressFromBech32(msg.Voter)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := k.AddVote(ctx, msg.CommitteeID, voter, msg.Ballots); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &types.MsgVoteResponse{}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								x/committee/v1/keeper/params.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								x/committee/v1/keeper/params.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
package keeper
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	bz := store.Get(types.ParamsKey)
 | 
			
		||||
	if len(bz) == 0 {
 | 
			
		||||
		return params
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	k.cdc.MustUnmarshal(bz, ¶ms)
 | 
			
		||||
	return params
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Keeper) SetParams(ctx sdk.Context, params types.Params) error {
 | 
			
		||||
	store := ctx.KVStore(k.storeKey)
 | 
			
		||||
	bz, err := k.cdc.Marshal(¶ms)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	store.Set(types.ParamsKey, bz)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										171
									
								
								x/committee/v1/module.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								x/committee/v1/module.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,171 @@
 | 
			
		||||
package committee
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	abci "github.com/cometbft/cometbft/abci/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/client"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/types/module"
 | 
			
		||||
	simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
 | 
			
		||||
	stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	"github.com/grpc-ecosystem/grpc-gateway/runtime"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/client/cli"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/keeper"
 | 
			
		||||
	"github.com/0glabs/0g-chain/x/committee/v1/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// consensusVersion defines the current x/committee module consensus version.
 | 
			
		||||
const consensusVersion = 1
 | 
			
		||||
 | 
			
		||||
// type check to ensure the interface is properly implemented
 | 
			
		||||
var (
 | 
			
		||||
	_ module.AppModule           = AppModule{}
 | 
			
		||||
	_ module.AppModuleBasic      = AppModuleBasic{}
 | 
			
		||||
	_ module.AppModuleSimulation = AppModule{}
 | 
			
		||||
	_ module.BeginBlockAppModule = AppModule{}
 | 
			
		||||
	_ module.EndBlockAppModule   = AppModule{}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// app module Basics object
 | 
			
		||||
type AppModuleBasic struct{}
 | 
			
		||||
 | 
			
		||||
// Name returns the inflation module's name.
 | 
			
		||||
func (AppModuleBasic) Name() string {
 | 
			
		||||
	return types.ModuleName
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterLegacyAminoCodec registers the inflation module's types on the given LegacyAmino codec.
 | 
			
		||||
func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {}
 | 
			
		||||
 | 
			
		||||
// ConsensusVersion returns the consensus state-breaking version for the module.
 | 
			
		||||
func (AppModuleBasic) ConsensusVersion() uint64 {
 | 
			
		||||
	return consensusVersion
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterInterfaces registers interfaces and implementations of the incentives
 | 
			
		||||
// module.
 | 
			
		||||
func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) {
 | 
			
		||||
	types.RegisterInterfaces(interfaceRegistry)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DefaultGenesis returns default genesis state as raw bytes for the incentives
 | 
			
		||||
// module.
 | 
			
		||||
func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
 | 
			
		||||
	return cdc.MustMarshalJSON(types.DefaultGenesisState())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidateGenesis performs genesis state validation for the inflation module.
 | 
			
		||||
func (b AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error {
 | 
			
		||||
	var genesisState types.GenesisState
 | 
			
		||||
	if err := cdc.UnmarshalJSON(bz, &genesisState); err != nil {
 | 
			
		||||
		return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return genesisState.Validate()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterRESTRoutes performs a no-op as the inflation module doesn't expose REST
 | 
			
		||||
// endpoints
 | 
			
		||||
func (AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) {}
 | 
			
		||||
 | 
			
		||||
// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the inflation module.
 | 
			
		||||
func (b AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *runtime.ServeMux) {
 | 
			
		||||
	if err := types.RegisterQueryHandlerClient(context.Background(), serveMux, types.NewQueryClient(c)); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetTxCmd returns the root tx command for the inflation module.
 | 
			
		||||
func (AppModuleBasic) GetTxCmd() *cobra.Command { return cli.GetTxCmd() }
 | 
			
		||||
 | 
			
		||||
// GetQueryCmd returns no root query command for the inflation module.
 | 
			
		||||
func (AppModuleBasic) GetQueryCmd() *cobra.Command {
 | 
			
		||||
	return cli.GetQueryCmd()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ___________________________________________________________________________
 | 
			
		||||
 | 
			
		||||
// AppModule implements an application module for the inflation module.
 | 
			
		||||
type AppModule struct {
 | 
			
		||||
	AppModuleBasic
 | 
			
		||||
	keeper keeper.Keeper
 | 
			
		||||
	sk     *stakingkeeper.Keeper
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewAppModule creates a new AppModule Object
 | 
			
		||||
func NewAppModule(
 | 
			
		||||
	k keeper.Keeper,
 | 
			
		||||
	sk *stakingkeeper.Keeper,
 | 
			
		||||
) AppModule {
 | 
			
		||||
	return AppModule{
 | 
			
		||||
		AppModuleBasic: AppModuleBasic{},
 | 
			
		||||
		keeper:         k,
 | 
			
		||||
		sk:             sk,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Name returns the inflation module's name.
 | 
			
		||||
func (AppModule) Name() string {
 | 
			
		||||
	return types.ModuleName
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterInvariants registers the inflation module invariants.
 | 
			
		||||
func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {}
 | 
			
		||||
 | 
			
		||||
// RegisterServices registers a gRPC query service to respond to the
 | 
			
		||||
// module-specific gRPC queries.
 | 
			
		||||
func (am AppModule) RegisterServices(cfg module.Configurator) {
 | 
			
		||||
	types.RegisterMsgServer(cfg.MsgServer(), am.keeper)
 | 
			
		||||
	types.RegisterQueryServer(cfg.QueryServer(), am.keeper)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) {
 | 
			
		||||
	am.keeper.BeginBlock(ctx, req)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.ValidatorUpdate {
 | 
			
		||||
	am.keeper.EndBlock(ctx, req)
 | 
			
		||||
	return []abci.ValidatorUpdate{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// InitGenesis performs genesis initialization for the inflation module. It returns
 | 
			
		||||
// no validator updates.
 | 
			
		||||
func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate {
 | 
			
		||||
	var genesisState types.GenesisState
 | 
			
		||||
 | 
			
		||||
	cdc.MustUnmarshalJSON(data, &genesisState)
 | 
			
		||||
	InitGenesis(ctx, am.keeper, genesisState)
 | 
			
		||||
	return []abci.ValidatorUpdate{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExportGenesis returns the exported genesis state as raw bytes for the inflation
 | 
			
		||||
// module.
 | 
			
		||||
func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage {
 | 
			
		||||
	gs := ExportGenesis(ctx, am.keeper)
 | 
			
		||||
	return cdc.MustMarshalJSON(gs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ___________________________________________________________________________
 | 
			
		||||
 | 
			
		||||
// AppModuleSimulation functions
 | 
			
		||||
 | 
			
		||||
// GenerateGenesisState creates a randomized GenState of the inflation module.
 | 
			
		||||
func (am AppModule) GenerateGenesisState(_ *module.SimulationState) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterStoreDecoder registers a decoder for inflation module's types.
 | 
			
		||||
func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WeightedOperations doesn't return any inflation module operation.
 | 
			
		||||
func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation {
 | 
			
		||||
	return []simtypes.WeightedOperation{}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								x/committee/v1/types/codec.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								x/committee/v1/types/codec.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/0glabs/0g-chain/crypto/vrf"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/types/msgservice"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	amino = codec.NewLegacyAmino()
 | 
			
		||||
	// ModuleCdc references the global evm module codec. Note, the codec should
 | 
			
		||||
	// ONLY be used in certain instances of tests and for JSON encoding.
 | 
			
		||||
	ModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry())
 | 
			
		||||
 | 
			
		||||
	// AminoCdc is a amino codec created to support amino JSON compatible msgs.
 | 
			
		||||
	AminoCdc = codec.NewAminoCodec(amino)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Amino names
 | 
			
		||||
	registerName = "evmos/committee/MsgRegister"
 | 
			
		||||
	voteName     = "evmos/committee/MsgVote"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NOTE: This is required for the GetSignBytes function
 | 
			
		||||
func init() {
 | 
			
		||||
	RegisterLegacyAminoCodec(amino)
 | 
			
		||||
	amino.Seal()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterInterfaces register implementations
 | 
			
		||||
func RegisterInterfaces(registry codectypes.InterfaceRegistry) {
 | 
			
		||||
	registry.RegisterImplementations(
 | 
			
		||||
		(*sdk.Msg)(nil),
 | 
			
		||||
		&MsgRegister{},
 | 
			
		||||
		&MsgVote{},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &vrf.PubKey{})
 | 
			
		||||
	registry.RegisterImplementations((*cryptotypes.PrivKey)(nil), &vrf.PrivKey{})
 | 
			
		||||
 | 
			
		||||
	msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterLegacyAminoCodec required for EIP-712
 | 
			
		||||
func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
 | 
			
		||||
	cdc.RegisterConcrete(&MsgRegister{}, registerName, nil)
 | 
			
		||||
	cdc.RegisterConcrete(&MsgVote{}, voteName, nil)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								x/committee/v1/types/council.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								x/committee/v1/types/council.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Committees []Committee
 | 
			
		||||
type Votes []Vote
 | 
			
		||||
 | 
			
		||||
func (c Committee) HasVotingEndedBy(height int64) bool {
 | 
			
		||||
	return height >= int64(c.StartHeight)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewVote instantiates a new instance of Vote
 | 
			
		||||
func NewVote(committeeID uint64, voter sdk.ValAddress, ballots []*Ballot) Vote {
 | 
			
		||||
	return Vote{
 | 
			
		||||
		CommitteeID: committeeID,
 | 
			
		||||
		Voter:       voter,
 | 
			
		||||
		Ballots:     ballots,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								x/committee/v1/types/epoch.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								x/committee/v1/types/epoch.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
type Epoch struct{}
 | 
			
		||||
							
								
								
									
										19
									
								
								x/committee/v1/types/errors.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								x/committee/v1/types/errors.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import errorsmod "cosmossdk.io/errors"
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrUnknownCommittee        = errorsmod.Register(ModuleName, 2, "committee not found")
 | 
			
		||||
	ErrInvalidCommittee        = errorsmod.Register(ModuleName, 3, "invalid committee")
 | 
			
		||||
	ErrUnknownProposal         = errorsmod.Register(ModuleName, 4, "proposal not found")
 | 
			
		||||
	ErrProposalExpired         = errorsmod.Register(ModuleName, 5, "proposal expired")
 | 
			
		||||
	ErrInvalidPubProposal      = errorsmod.Register(ModuleName, 6, "invalid pubproposal")
 | 
			
		||||
	ErrUnknownVote             = errorsmod.Register(ModuleName, 7, "vote not found")
 | 
			
		||||
	ErrInvalidGenesis          = errorsmod.Register(ModuleName, 8, "invalid genesis")
 | 
			
		||||
	ErrNoProposalHandlerExists = errorsmod.Register(ModuleName, 9, "pubproposal has no corresponding handler")
 | 
			
		||||
	ErrUnknownSubspace         = errorsmod.Register(ModuleName, 10, "subspace not found")
 | 
			
		||||
	ErrInvalidVoteType         = errorsmod.Register(ModuleName, 11, "invalid vote type")
 | 
			
		||||
	ErrNotFoundProposalTally   = errorsmod.Register(ModuleName, 12, "proposal tally not found")
 | 
			
		||||
	ErrInvalidPublicKey        = errorsmod.Register(ModuleName, 13, "invalid public key")
 | 
			
		||||
	ErrInvalidValidatorAddress = errorsmod.Register(ModuleName, 14, "invalid validator address")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										19
									
								
								x/committee/v1/types/events.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								x/committee/v1/types/events.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
// Module event types
 | 
			
		||||
const (
 | 
			
		||||
	EventTypeRegister = "register"
 | 
			
		||||
	EventTypeVote     = "vote"
 | 
			
		||||
 | 
			
		||||
	AttributeValueCategory          = "committee"
 | 
			
		||||
	AttributeKeyCommitteeID         = "committee_id"
 | 
			
		||||
	AttributeKeyProposalID          = "proposal_id"
 | 
			
		||||
	AttributeKeyVotingStartHeight   = "voting_start_height"
 | 
			
		||||
	AttributeKeyVotingEndHeight     = "voting_end_height"
 | 
			
		||||
	AttributeKeyProposalCloseStatus = "status"
 | 
			
		||||
	AttributeKeyVoter               = "voter"
 | 
			
		||||
	AttributeKeyBallots             = "ballots"
 | 
			
		||||
	AttributeKeyPublicKey           = "public_key"
 | 
			
		||||
	AttributeKeyProposalOutcome     = "proposal_outcome"
 | 
			
		||||
	AttributeKeyProposalTally       = "proposal_tally"
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										42
									
								
								x/committee/v1/types/genesis.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								x/committee/v1/types/genesis.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	DefaultVotingStartHeight = 1
 | 
			
		||||
	DefaultVotingPeriod      = 200
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewGenesisState returns a new genesis state object for the module.
 | 
			
		||||
func NewGenesisState(params Params, votingStartHeight uint64, votingPeriod uint64, currentCommitteeID uint64, committees Committees) *GenesisState {
 | 
			
		||||
	return &GenesisState{
 | 
			
		||||
		Params:             params,
 | 
			
		||||
		VotingStartHeight:  votingStartHeight,
 | 
			
		||||
		VotingPeriod:       votingPeriod,
 | 
			
		||||
		CurrentCommitteeID: currentCommitteeID,
 | 
			
		||||
		Committees:         committees,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DefaultGenesisState returns the default genesis state for the module.
 | 
			
		||||
func DefaultGenesisState() *GenesisState {
 | 
			
		||||
	return NewGenesisState(
 | 
			
		||||
		Params{
 | 
			
		||||
			CommitteeSize: 1,
 | 
			
		||||
		},
 | 
			
		||||
		DefaultVotingStartHeight,
 | 
			
		||||
		DefaultVotingPeriod,
 | 
			
		||||
		1,
 | 
			
		||||
		[]Committee{
 | 
			
		||||
			{
 | 
			
		||||
				ID:                1,
 | 
			
		||||
				VotingStartHeight: DefaultVotingStartHeight,
 | 
			
		||||
				StartHeight:       DefaultVotingStartHeight + DefaultVotingPeriod,
 | 
			
		||||
				EndHeight:         DefaultVotingStartHeight + DefaultVotingPeriod*2,
 | 
			
		||||
				Votes:             Votes{},
 | 
			
		||||
			}},
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Validate performs basic validation of genesis data.
 | 
			
		||||
func (gs GenesisState) Validate() error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1467
									
								
								x/committee/v1/types/genesis.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1467
									
								
								x/committee/v1/types/genesis.pb.go
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										23
									
								
								x/committee/v1/types/interfaces.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								x/committee/v1/types/interfaces.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// AccountKeeper defines the expected account keeper
 | 
			
		||||
type AccountKeeper interface {
 | 
			
		||||
	GetAccount(sdk.Context, sdk.AccAddress) authtypes.AccountI
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BankKeeper defines the expected bank keeper interface
 | 
			
		||||
type BankKeeper interface {
 | 
			
		||||
	GetSupply(ctx sdk.Context, denom string) sdk.Coin
 | 
			
		||||
	GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type StakingKeeper interface {
 | 
			
		||||
	BondDenom(ctx sdk.Context) (res string)
 | 
			
		||||
	GetValidator(ctx sdk.Context, addr sdk.ValAddress) (validator stakingtypes.Validator, found bool)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								x/committee/v1/types/keys.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								x/committee/v1/types/keys.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// ModuleName The name that will be used throughout the module
 | 
			
		||||
	ModuleName = "committee"
 | 
			
		||||
 | 
			
		||||
	// StoreKey Top level store key where all module items will be stored
 | 
			
		||||
	StoreKey = ModuleName
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Key prefixes
 | 
			
		||||
var (
 | 
			
		||||
	CommitteeKeyPrefix = []byte{0x00} // prefix for keys that store committees
 | 
			
		||||
	VoteKeyPrefix      = []byte{0x01} // prefix for keys that store votes
 | 
			
		||||
	VoterKeyPrefix     = []byte{0x02} // prefix for keys that store voters
 | 
			
		||||
 | 
			
		||||
	ParamsKey             = []byte{0x03}
 | 
			
		||||
	VotingStartHeightKey  = []byte{0x04}
 | 
			
		||||
	VotingPeriodKey       = []byte{0x05}
 | 
			
		||||
	CurrentCommitteeIDKey = []byte{0x06}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GetKeyFromID returns the bytes to use as a key for a uint64 id
 | 
			
		||||
func GetKeyFromID(id uint64) []byte {
 | 
			
		||||
	return Uint64ToBytes(id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetVoteKey(committeeID uint64, voter sdk.ValAddress) []byte {
 | 
			
		||||
	return append(GetKeyFromID(committeeID), voter.Bytes()...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetVoterKey(voter sdk.ValAddress) []byte {
 | 
			
		||||
	return voter.Bytes()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Uint64ToBytes converts a uint64 into fixed length bytes for use in store keys.
 | 
			
		||||
func Uint64ToBytes(id uint64) []byte {
 | 
			
		||||
	bz := make([]byte, 8)
 | 
			
		||||
	binary.BigEndian.PutUint64(bz, uint64(id))
 | 
			
		||||
	return bz
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Uint64FromBytes converts some fixed length bytes back into a uint64.
 | 
			
		||||
func Uint64FromBytes(bz []byte) uint64 {
 | 
			
		||||
	return binary.BigEndian.Uint64(bz)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										65
									
								
								x/committee/v1/types/msg.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								x/committee/v1/types/msg.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
 | 
			
		||||
	"github.com/coniks-sys/coniks-go/crypto/vrf"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _, _ sdk.Msg = &MsgRegister{}, &MsgVote{}
 | 
			
		||||
 | 
			
		||||
// GetSigners returns the expected signers for a MsgRegister message.
 | 
			
		||||
func (msg *MsgRegister) GetSigners() []sdk.AccAddress {
 | 
			
		||||
	valAddr, err := sdk.ValAddressFromBech32(msg.Voter)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	accAddr, err := sdk.AccAddressFromHexUnsafe(hex.EncodeToString(valAddr.Bytes()))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	return []sdk.AccAddress{accAddr}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidateBasic does a sanity check of the provided data
 | 
			
		||||
func (msg *MsgRegister) ValidateBasic() error {
 | 
			
		||||
	if _, err := sdk.ValAddressFromBech32(msg.Voter); err != nil {
 | 
			
		||||
		return ErrInvalidValidatorAddress
 | 
			
		||||
	}
 | 
			
		||||
	if len(msg.Key) != vrf.PublicKeySize {
 | 
			
		||||
		return ErrInvalidPublicKey
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSignBytes implements the LegacyMsg interface.
 | 
			
		||||
func (msg MsgRegister) GetSignBytes() []byte {
 | 
			
		||||
	return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&msg))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSigners returns the expected signers for a MsgVote message.
 | 
			
		||||
func (msg *MsgVote) GetSigners() []sdk.AccAddress {
 | 
			
		||||
	valAddr, err := sdk.ValAddressFromBech32(msg.Voter)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	accAddr, err := sdk.AccAddressFromHexUnsafe(hex.EncodeToString(valAddr.Bytes()))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	return []sdk.AccAddress{accAddr}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidateBasic does a sanity check of the provided data
 | 
			
		||||
func (msg *MsgVote) ValidateBasic() error {
 | 
			
		||||
	if _, err := sdk.ValAddressFromBech32(msg.Voter); err != nil {
 | 
			
		||||
		return ErrInvalidValidatorAddress
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSignBytes implements the LegacyMsg interface.
 | 
			
		||||
func (msg MsgVote) GetSignBytes() []byte {
 | 
			
		||||
	return sdk.MustSortJSON(AminoCdc.MustMarshalJSON(&msg))
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user