diff --git a/.env.example b/.env.example index 082f5cc4..00a5dea0 100644 --- a/.env.example +++ b/.env.example @@ -3,17 +3,21 @@ RELAYER_NEUTRON_CHAIN_RPC_ADDR=tcp://host.docker.internal:16657 RELAYER_NEUTRON_CHAIN_REST_ADDR=http://host.docker.internal:1316 RELAYER_NEUTRON_CHAIN_HOME_DIR=/data/test-1 -RELAYER_NEUTRON_CHAIN_SIGN_KEY_NAME=demowallet1 RELAYER_NEUTRON_CHAIN_TIMEOUT=10s RELAYER_NEUTRON_CHAIN_GAS_PRICES=0.5stake RELAYER_NEUTRON_CHAIN_GAS_LIMIT=10000000 RELAYER_NEUTRON_CHAIN_GAS_ADJUSTMENT=2.0 RELAYER_NEUTRON_CHAIN_CONNECTION_ID=connection-0 RELAYER_NEUTRON_CHAIN_DEBUG=true -RELAYER_NEUTRON_CHAIN_KEYRING_BACKEND=test RELAYER_NEUTRON_CHAIN_OUTPUT_FORMAT=json RELAYER_NEUTRON_CHAIN_SIGN_MODE_STR=direct +RELAYER_KEYRING_BACKEND=test +RELAYER_KEYRING_KEY_NAME=demowallet1 +#RELAYER_KEYRING_PASSWORD=P@ssw0rd1 +#RELAYER_KEYRING_KEY_SEED="mnemonic" +#RELAYER_KEYRING_KEY_HD_PATH="m/44'/118'/0'/0/0" + RELAYER_TARGET_CHAIN_RPC_ADDR=tcp://host.docker.internal:26657 RELAYER_TARGET_CHAIN_ACCOUNT_PREFIX=neutron RELAYER_TARGET_CHAIN_VALIDATOR_ACCOUNT_PREFIX=neutrondeveloper diff --git a/.env.example.dev b/.env.example.dev index 25b19330..1f67e762 100644 --- a/.env.example.dev +++ b/.env.example.dev @@ -3,12 +3,12 @@ RELAYER_NEUTRON_CHAIN_RPC_ADDR=tcp://127.0.0.1:16657 RELAYER_NEUTRON_CHAIN_REST_ADDR=http://127.0.0.1:1316 RELAYER_NEUTRON_CHAIN_HOME_DIR=../neutron/data/test-1 -RELAYER_NEUTRON_CHAIN_SIGN_KEY_NAME=demowallet1 +RELAYER_KEYRING_KEY_NAME=demowallet1 RELAYER_NEUTRON_CHAIN_GAS_PRICES=0.5stake RELAYER_NEUTRON_CHAIN_GAS_LIMIT=10000000 RELAYER_NEUTRON_CHAIN_GAS_ADJUSTMENT=2.0 RELAYER_NEUTRON_CHAIN_CONNECTION_ID=connection-0 -RELAYER_NEUTRON_CHAIN_KEYRING_BACKEND=test +RELAYER_KEYRING_BACKEND=test RELAYER_TARGET_CHAIN_RPC_ADDR=tcp://127.0.0.1:26657 RELAYER_TARGET_CHAIN_ACCOUNT_PREFIX=neutron diff --git a/Makefile b/Makefile index b92626b0..ba3279a7 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ COMMIT := $(shell git log -1 --format='%H') ldflags = -X github.com/neutron-org/neutron-query-relayer/internal/app.Version=$(VERSION) \ -X github.com/neutron-org/neutron-query-relayer/internal/app.Commit=$(COMMIT) +RELAYER_IMAGE_NAME ?= neutron-org/neutron-query-relayer + dev: clean go run ./cmd/neutron_query_relayer/ start @@ -19,7 +21,7 @@ build: go build -ldflags '$(ldflags)' -a -o build/neutron_query_relayer ./cmd/neutron_query_relayer/*.go build-docker: - docker build --build-arg LDFLAGS='$(ldflags)' . -t neutron-org/neutron-query-relayer + docker build --build-arg LDFLAGS='$(ldflags)' . -t $(RELAYER_IMAGE_NAME) generate-openapi: @cd ./internal/subscriber/querier ; swagger generate client -f openapi.yml diff --git a/README.md b/README.md index eedb7053..1a5ff860 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Clone the following repositories to the same folder where the neutron-query-rela 1. copy `.env.example` and rename the copy to `.env` 2. set env from env list via way you prefer and run relayer: -`export $(grep -v '^#' .env | xargs) && make dev` +`./run_dev.sh` ### Testing via docker @@ -85,16 +85,19 @@ Relayer: | `RELAYER_NEUTRON_CHAIN_RPC_ADDR` | `string` | rpc address of neutron chain | required | | `RELAYER_NEUTRON_CHAIN_REST_ADDR` | `string` | rest address of neutron chain | required | | `RELAYER_NEUTRON_CHAIN_HOME_DIR ` | `string` | path to keys directory | required | -| `RELAYER_NEUTRON_CHAIN_SIGN_KEY_NAME` | `string` | key name | required | | `RELAYER_NEUTRON_CHAIN_TIMEOUT ` | `time` | timeout of neutron chain provider | optional | | `RELAYER_NEUTRON_CHAIN_GAS_PRICES` | `string` | specifies how much the user is willing to pay per unit of gas, which can be one or multiple denominations of token | required | | `RELAYER_NEUTRON_CHAIN_GAS_LIMIT` | `string` | the maximum price a relayer user is willing to pay for relayer's paid blockchain actions | required | | `RELAYER_NEUTRON_CHAIN_GAS_ADJUSTMENT` | `float` | used to scale gas up in order to avoid underestimating. For example, users can specify their gas adjustment as 1.5 to use 1.5 times the estimated gas | required | | `RELAYER_NEUTRON_CHAIN_CONNECTION_ID` | `string` | neutron chain connection ID | required | | `RELAYER_NEUTRON_CHAIN_DEBUG ` | `bool` | flag to run neutron chain provider in debug mode | optional | -| `RELAYER_NEUTRON_CHAIN_KEYRING_BACKEND` | `string` | [see](https://docs.cosmos.network/master/run-node/keyring.html#the-kwallet-backend) | required | | `RELAYER_NEUTRON_CHAIN_OUTPUT_FORMAT` | `json` OR `yaml` | neutron chain provider output format | required | | `RELAYER_NEUTRON_CHAIN_SIGN_MODE_STR ` | `string` | [see](https://docs.cosmos.network/master/core/transactions.html#signing-transactions) also consider use short variation, e.g. `direct` | optional | +| `RELAYER_KEYRING_BACKEND` | `string` | keyring backend where the Neutron key for ICQ relayer is stored | required | +| `RELAYER_KEYRING_PASSWORD` | `string` | password for keyring backend (required for `os`, `file`, `pass`, `kwallet`; ignored for `memory` and `test`) | optional | +| `RELAYER_KEYRING_KEY_NAME` | `string` | key name (required for any backend type but `memory`) | optional | +| `RELAYER_KEYRING_KEY_SEED` | `string` | key seed (required for `memory` backend, ignored for any other type) | optional | +| `RELAYER_KEYRING_KEY_HD_PATH` | `string` | key HD path (optional for `memory` backend, ignored for any other type) | optional | | `RELAYER_TARGET_CHAIN_RPC_ADDR` | `string` | rpc address of target chain | required | | `RELAYER_TARGET_CHAIN_ACCOUNT_PREFIX ` | `string` | target chain account prefix | required | | `RELAYER_TARGET_CHAIN_VALIDATOR_ACCOUNT_PREFIX ` | `string` | target chain validator account prefix | required | diff --git a/cmd/neutron_query_relayer/cmd/start.go b/cmd/neutron_query_relayer/cmd/start.go index a0454478..a3e05c3d 100644 --- a/cmd/neutron_query_relayer/cmd/start.go +++ b/cmd/neutron_query_relayer/cmd/start.go @@ -79,7 +79,7 @@ func startRelayer() { wg := &sync.WaitGroup{} // The storage has to be shared because of the LevelDB single process restriction. - storage, err := app.NewDefaultStorage(cfg, logger) + storage, err := app.NewDefaultStorage(cfg) if err != nil { logger.Fatal("Failed to create NewDefaultStorage", zap.Error(err)) } diff --git a/internal/app/app.go b/internal/app/app.go index a9ca9daf..24d264cc 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -6,12 +6,15 @@ import ( "time" "github.com/avast/retry-go/v4" + sdkkeyring "github.com/cosmos/cosmos-sdk/crypto/keyring" cosmosrelayer "github.com/cosmos/relayer/v2/relayer" + "github.com/cosmos/relayer/v2/relayer/provider/cosmos" rpcclienthttp "github.com/tendermint/tendermint/rpc/client/http" "go.uber.org/zap" nlogger "github.com/neutron-org/neutron-logger" "github.com/neutron-org/neutron-query-relayer/internal/config" + "github.com/neutron-org/neutron-query-relayer/internal/keyring" "github.com/neutron-org/neutron-query-relayer/internal/kvprocessor" "github.com/neutron-org/neutron-query-relayer/internal/raw" "github.com/neutron-org/neutron-query-relayer/internal/registry" @@ -105,6 +108,8 @@ func NewDefaultRelayer( globalCfg := neutronapp.GetDefaultConfig() globalCfg.Seal() + logger := logRegistry.Get(AppContext) + targetClient, err := raw.NewRPCClient(cfg.TargetChain.RPCAddr, cfg.TargetChain.Timeout) if err != nil { return nil, fmt.Errorf("could not initialize target rpc client: %w", err) @@ -127,19 +132,32 @@ func NewDefaultRelayer( } codec := raw.MakeCodecDefault() - keybase, err := submit.TestKeybase(connParams.neutronChainID, cfg.NeutronChain.HomeDir) + keybase, keyName, err := keyring.InitializeKeyring( + cfg.Keyring.Backend, + cfg.Keyring.Password, + cfg.NeutronChain.HomeDir, + cfg.Keyring.KeyName, + cfg.Keyring.KeySeed, + cfg.Keyring.KeyHdPath, + ) if err != nil { return nil, fmt.Errorf("cannot initialize keybase: %w", err) } + logger.Debug("keyring initialized", zap.String("keyring_backend", cfg.Keyring.Backend)) - txSender, err := submit.NewTxSender(ctx, neutronClient, codec.Marshaller, keybase, *cfg.NeutronChain, logRegistry.Get(TxSenderContext), connParams.neutronChainID) + txSender, err := submit.NewTxSender(ctx, neutronClient, codec.Marshaller, *cfg.NeutronChain, keybase, keyName, logRegistry.Get(TxSenderContext), connParams.neutronChainID) if err != nil { return nil, fmt.Errorf("cannot create tx sender: %w", err) } - neutronChain, targetChain, err := loadChains(cfg, logRegistry, connParams) + neutronChain, err := loadNeutronChain(cfg, keybase, keyName, logRegistry, connParams) + if err != nil { + return nil, fmt.Errorf("failed to load Neutron chain: %w", err) + } + + targetChain, err := loadTargetChain(cfg, logRegistry, connParams) if err != nil { - return nil, fmt.Errorf("failed to loadChains: %w", err) + return nil, fmt.Errorf("failed to load target chain: %w", err) } var ( @@ -171,7 +189,7 @@ func NewDefaultRelayer( return relayer, nil } -func NewDefaultStorage(cfg config.NeutronQueryRelayerConfig, logger *zap.Logger) (relay.Storage, error) { +func NewDefaultStorage(cfg config.NeutronQueryRelayerConfig) (relay.Storage, error) { var ( err error leveldbStorage relay.Storage @@ -185,38 +203,51 @@ func NewDefaultStorage(cfg config.NeutronQueryRelayerConfig, logger *zap.Logger) return leveldbStorage, nil } -func loadChains( - cfg config.NeutronQueryRelayerConfig, - logRegistry *nlogger.Registry, - connParams *connectionParams, -) (neutronChain *cosmosrelayer.Chain, targetChain *cosmosrelayer.Chain, err error) { - targetChain, err = relay.GetTargetChain(logRegistry.Get(TargetChainProviderContext), cfg.TargetChain, connParams.targetChainID) +func loadNeutronChain(cfg config.NeutronQueryRelayerConfig, + keybase sdkkeyring.Keyring, keyName string, logRegistry *nlogger.Registry, connParams *connectionParams, +) (neutronChain *cosmosrelayer.Chain, err error) { + neutronChain, err = relay.GetNeutronChain(logRegistry.Get(NeutronChainProviderContext), cfg.NeutronChain, connParams.neutronChainID, keyName) + if err != nil { - return nil, nil, fmt.Errorf("failed to load target chain from env: %w", err) + return nil, fmt.Errorf("failed to load neutron chain from env: %w", err) } - if err := targetChain.AddPath(connParams.targetClientID, connParams.targetConnectionID); err != nil { - return nil, nil, fmt.Errorf("failed to AddPath to source chain: %w", err) + if err := neutronChain.AddPath(connParams.neutronClientID, cfg.NeutronChain.ConnectionID); err != nil { + return nil, fmt.Errorf("failed to AddPath to destination chain: %w", err) } - if err := targetChain.ChainProvider.Init(); err != nil { - return nil, nil, fmt.Errorf("failed to Init source chain provider: %w", err) + if err := neutronChain.ChainProvider.Init(); err != nil { + return nil, fmt.Errorf("failed to Init source chain provider: %w", err) + } + + // Workaround to have more flexibility in keyring configuration + // Unfortunately, ChainProvider interface doesn't allow configuring keyring properly or passing existing one + provConcrete, ok := neutronChain.ChainProvider.(*cosmos.CosmosProvider) + if !ok { + return nil, fmt.Errorf("failed to cast neutron chain provider to *cosmos.CosmosProvider: got %T", neutronChain.ChainProvider) } + provConcrete.Keybase = keybase + + return neutronChain, nil +} - neutronChain, err = relay.GetNeutronChain(logRegistry.Get(NeutronChainProviderContext), cfg.NeutronChain, connParams.neutronChainID) +func loadTargetChain(cfg config.NeutronQueryRelayerConfig, + logRegistry *nlogger.Registry, connParams *connectionParams, +) (targetChain *cosmosrelayer.Chain, err error) { + targetChain, err = relay.GetTargetChain(logRegistry.Get(TargetChainProviderContext), cfg.TargetChain, connParams.targetChainID) if err != nil { - return nil, nil, fmt.Errorf("failed to load neutron chain from env: %w", err) + return nil, fmt.Errorf("failed to load target chain from env: %w", err) } - if err := neutronChain.AddPath(connParams.neutronClientID, cfg.NeutronChain.ConnectionID); err != nil { - return nil, nil, fmt.Errorf("failed to AddPath to destination chain: %w", err) + if err := targetChain.AddPath(connParams.targetClientID, connParams.targetConnectionID); err != nil { + return nil, fmt.Errorf("failed to AddPath to source chain: %w", err) } - if err := neutronChain.ChainProvider.Init(); err != nil { - return nil, nil, fmt.Errorf("failed to Init source chain provider: %w", err) + if err := targetChain.ChainProvider.Init(); err != nil { + return nil, fmt.Errorf("failed to Init source chain provider: %w", err) } - return neutronChain, targetChain, nil + return targetChain, nil } type connectionParams struct { diff --git a/internal/config/config.go b/internal/config/config.go index 8176b7fd..b821f563 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -19,6 +19,7 @@ import ( type NeutronQueryRelayerConfig struct { NeutronChain *NeutronChainConfig `split_words:"true"` TargetChain *TargetChainConfig `split_words:"true"` + Keyring *KeyringConfig `split_words:"true"` Registry *registry.RegistryConfig `split_words:"true"` AllowTxQueries bool `required:"true" split_words:"true"` AllowKVCallbacks bool `required:"true" split_words:"true"` @@ -32,20 +33,27 @@ type NeutronQueryRelayerConfig struct { const EnvPrefix string = "RELAYER" +// NeutronChainConfig TODO: research if HomeDir parameter is needed for something but keys (so it might be optional and ignored for memory keyring) type NeutronChainConfig struct { - RPCAddr string `required:"true" split_words:"true"` - RESTAddr string `required:"true" split_words:"true"` - HomeDir string `required:"true" split_words:"true"` - SignKeyName string `required:"true" split_words:"true"` - Timeout time.Duration `split_words:"true" default:"10s"` - GasPrices string `required:"true" split_words:"true"` - GasLimit uint64 `split_words:"true" default:"0"` - GasAdjustment float64 `required:"true" split_words:"true"` - ConnectionID string `required:"true" split_words:"true"` - Debug bool `split_words:"true" default:"false"` - KeyringBackend string `required:"true" split_words:"true"` - OutputFormat string `split_words:"true" default:"json"` - SignModeStr string `split_words:"true" default:"direct"` + RPCAddr string `required:"true" split_words:"true"` + RESTAddr string `required:"true" split_words:"true"` + HomeDir string `required:"true" split_words:"true"` + Timeout time.Duration `split_words:"true" default:"10s"` + GasPrices string `required:"true" split_words:"true"` + GasLimit uint64 `split_words:"true" default:"0"` + GasAdjustment float64 `required:"true" split_words:"true"` + ConnectionID string `required:"true" split_words:"true"` + Debug bool `split_words:"true" default:"false"` + OutputFormat string `split_words:"true" default:"json"` + SignModeStr string `split_words:"true" default:"direct"` +} + +type KeyringConfig struct { + KeyName string `split_words:"true"` + KeySeed string `split_words:"true"` + KeyHdPath string `split_words:"true"` + Backend string `required:"true" split_words:"true"` + Password string `split_words:"true"` } type TargetChainConfig struct { diff --git a/internal/keyring/keyring.go b/internal/keyring/keyring.go new file mode 100644 index 00000000..a63b1c34 --- /dev/null +++ b/internal/keyring/keyring.go @@ -0,0 +1,36 @@ +package keyring + +import ( + "fmt" + "strings" + + "github.com/cosmos/cosmos-sdk/crypto/hd" + sdkkeyring "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdk "github.com/cosmos/cosmos-sdk/types" + + neutronapp "github.com/neutron-org/neutron/app" +) + +func InitializeKeyring(keyringBackend, keyringPassword, homeDir, keyName, keySeed, hdPath string) (sdkkeyring.Keyring, string, error) { + passReader := strings.NewReader(keyringPassword) + + keybase, err := sdkkeyring.New(neutronapp.Bech32MainPrefix, keyringBackend, homeDir, passReader) + if err != nil { + return nil, "", fmt.Errorf("error creating keybase of type %s and keyringRootDir=%s: %w", keyringBackend, homeDir, err) + } + + // If the keybase is set to "memory" then we expect the seed to be passed via environment variable and we need to + // add the key to the in-memory keybase + if keyringBackend == sdkkeyring.BackendMemory { + // For in-memory key we ignore the name provided by user (so it might be (and actually should be) left empty) + keyName = "sign_key" + if len(hdPath) == 0 { + hdPath = hd.CreateHDPath(sdk.CoinType, 0, 0).String() + } + _, err := keybase.NewAccount(keyName, keySeed, "", hdPath, hd.Secp256k1) + if err != nil { + return nil, "", err + } + } + return keybase, keyName, nil +} diff --git a/internal/relay/config.go b/internal/relay/config.go index 8cc2ddc5..5eca86e5 100644 --- a/internal/relay/config.go +++ b/internal/relay/config.go @@ -3,6 +3,7 @@ package relay import ( "fmt" + sdkkeyring "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/relayer/v2/relayer" "github.com/cosmos/relayer/v2/relayer/provider/cosmos" "go.uber.org/zap" @@ -11,13 +12,14 @@ import ( neutronapp "github.com/neutron-org/neutron/app" ) -func GetNeutronChain(logger *zap.Logger, cfg *config.NeutronChainConfig, chainID string) (*relayer.Chain, error) { +func GetNeutronChain(logger *zap.Logger, cfg *config.NeutronChainConfig, chainID string, keyName string) (*relayer.Chain, error) { provCfg := cosmos.CosmosProviderConfig{ - Key: cfg.SignKeyName, - ChainID: chainID, - RPCAddr: cfg.RPCAddr, - AccountPrefix: neutronapp.Bech32MainPrefix, - KeyringBackend: cfg.KeyringBackend, + Key: keyName, + ChainID: chainID, + RPCAddr: cfg.RPCAddr, + AccountPrefix: neutronapp.Bech32MainPrefix, + // we ignore provided keyring here since we're to substitute it later after initialization + KeyringBackend: sdkkeyring.BackendMemory, GasAdjustment: cfg.GasAdjustment, GasPrices: cfg.GasPrices, Debug: cfg.Debug, @@ -35,19 +37,13 @@ func GetNeutronChain(logger *zap.Logger, cfg *config.NeutronChainConfig, chainID func GetTargetChain(logger *zap.Logger, cfg *config.TargetChainConfig, chainID string) (*relayer.Chain, error) { provCfg := cosmos.CosmosProviderConfig{ - Key: "", - ChainID: chainID, - RPCAddr: cfg.RPCAddr, - AccountPrefix: cfg.AccountPrefix, - // we don't have any needs in keys for target chain - // but since "KeyringBackend" can't be an empty string we explicitly set it to "test" value to avoid errors - KeyringBackend: "test", - GasAdjustment: 0.0, - GasPrices: "", + ChainID: chainID, + RPCAddr: cfg.RPCAddr, + AccountPrefix: cfg.AccountPrefix, + KeyringBackend: sdkkeyring.BackendMemory, Debug: cfg.Debug, Timeout: cfg.Timeout.String(), OutputFormat: cfg.OutputFormat, - SignModeStr: "", } chain, err := getChain(logger, provCfg, "", cfg.Debug) if err != nil { @@ -68,12 +64,5 @@ func getChain(logger *zap.Logger, cfg cosmos.CosmosProviderConfig, homepath stri return nil, fmt.Errorf("failed to build ChainProvider for %w", err) } - // Without this hack it doesn't want to work with normal home dir layout for some reason. - provConcrete, ok := prov.(*cosmos.CosmosProvider) - if !ok { - return nil, fmt.Errorf("failed to patch CosmosProvider config (type cast failed)") - } - provConcrete.Config.KeyDirectory = homepath - return relayer.NewChain(logger, prov, debug), nil } diff --git a/internal/storage/leveldb.go b/internal/storage/leveldb.go index 52f88b9a..040216fb 100644 --- a/internal/storage/leveldb.go +++ b/internal/storage/leveldb.go @@ -72,10 +72,11 @@ func (s *LevelDBStorage) GetLastQueryHeight(queryID uint64) (block uint64, found // SetTxStatus sets status for given tx // queryID + hash can be one of 4 statuses: -// 1) Error while submitting tx - relay.ErrorOnSubmit -// 2) tx submitted successfully (temporary status, should be updated after neutron tx committed into the block) - relay.Submitted -// 2.a) failed to commit tx into the block - relay.ErrorOnCommit -// 2.b) tx successfully committed - relay.Committed +// 1. Error while submitting tx - relay.ErrorOnSubmit +// 2. tx submitted successfully (temporary status, should be updated after neutron tx committed into the block) - relay.Submitted +// 2.a) failed to commit tx into the block - relay.ErrorOnCommit +// 2.b) tx successfully committed - relay.Committed +// // To convert status from "2" to either "2.a" or "2.b" we use additional SubmittedTxStatusPrefix storage to track txs func (s *LevelDBStorage) SetTxStatus(queryID uint64, hash string, neutronHash string, status relay.SubmittedTxInfo) (err error) { s.Lock() diff --git a/internal/submit/tx_sender.go b/internal/submit/tx_sender.go index bce53887..4a784d76 100644 --- a/internal/submit/tx_sender.go +++ b/internal/submit/tx_sender.go @@ -14,7 +14,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keyring" + sdkkeyring "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" txtypes "github.com/cosmos/cosmos-sdk/types/tx" @@ -36,7 +36,7 @@ type TxSender struct { lock sync.Mutex sequence uint64 accountNumber uint64 - keybase keyring.Keyring + keybase sdkkeyring.Keyring baseTxf tx.Factory txConfig client.TxConfig rpcClient rpcclient.Client @@ -47,25 +47,18 @@ type TxSender struct { logger *zap.Logger } -func TestKeybase(chainID string, keyringRootDir string) (keyring.Keyring, error) { - keybase, err := keyring.New(chainID, "test", keyringRootDir, nil) - if err != nil { - return keybase, fmt.Errorf("error creating keybase for chainId=%s and keyringRootDir=%s: %w", chainID, keyringRootDir, err) - } - - return keybase, nil -} - func NewTxSender( ctx context.Context, rpcClient rpcclient.Client, marshaller codec.ProtoCodecMarshaler, - keybase keyring.Keyring, cfg config.NeutronChainConfig, + keybase sdkkeyring.Keyring, + keyName string, logger *zap.Logger, neutronChainID string, ) (*TxSender, error) { txConfig := authtxtypes.NewTxConfig(marshaller, authtxtypes.DefaultSignModes) + baseTxf := tx.Factory{}. WithKeybase(keybase). WithSignMode(signing.SignMode_SIGN_MODE_DIRECT). @@ -81,7 +74,7 @@ func NewTxSender( baseTxf: baseTxf, rpcClient: rpcClient, chainID: neutronChainID, - signKeyName: cfg.SignKeyName, + signKeyName: keyName, gasPrices: cfg.GasPrices, gasLimit: cfg.GasLimit, logger: logger, diff --git a/run_dev.sh b/run_dev.sh new file mode 100755 index 00000000..e45cc3f9 --- /dev/null +++ b/run_dev.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -x + +ENV_FILE=${1:-.env} + +while IFS="" read p +do + eval export $p +done < <(grep -v '^#' "$ENV_FILE" | grep -v '^$') + +make dev