Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
ffac0a1
reduced runTx results
pompon0 Apr 30, 2026
4e7a82d
removed sender
pompon0 Apr 30, 2026
0f5af37
Merge remote-tracking branch 'origin/main' into gprusak-rpc-sharding3
pompon0 Apr 30, 2026
ed35c51
out-of-process configs deprecated
pompon0 Apr 30, 2026
93cd15f
Merge remote-tracking branch 'origin/main' into gprusak-rpc-sharding5
pompon0 May 1, 2026
3086a71
generic client context
pompon0 May 1, 2026
1141f9f
registrations for local node
pompon0 May 1, 2026
c7ce3a0
reordered defers in startInProcess
pompon0 May 1, 2026
956b0e5
compilation fix
pompon0 May 1, 2026
eb2c2c7
removed cast to NodeService
pompon0 May 1, 2026
b04b46f
LocalContext + test fix
pompon0 May 1, 2026
7bba698
depth 1
pompon0 May 4, 2026
9df91b7
fmt
pompon0 May 4, 2026
46faae0
test fix
pompon0 May 4, 2026
ad576ab
tx service is local
pompon0 May 4, 2026
149f9c8
test fix
pompon0 May 4, 2026
3ec92c0
simplified stuff
pompon0 May 4, 2026
a92bad2
simplified block access
pompon0 May 4, 2026
7744232
WIP
pompon0 May 4, 2026
caf7a9a
constrained servers
pompon0 May 4, 2026
a0d0a18
fully local evmrpc
pompon0 May 4, 2026
2c18b75
Re-run checks
pompon0 May 4, 2026
5034212
Merge remote-tracking branch 'origin/main' into gprusak-rpc-sharding7
pompon0 May 4, 2026
d5a44f6
test fix
pompon0 May 4, 2026
24bded4
test fix
pompon0 May 4, 2026
4f45db2
reverted generic context
pompon0 May 5, 2026
ad1280d
compilation fix
pompon0 May 5, 2026
4d86336
reduced boiledplate
pompon0 May 5, 2026
f8d4d59
EvmNextPendingNonce
pompon0 May 5, 2026
f455ccf
duplicated evm nonce management
pompon0 May 5, 2026
7e86151
rewritten nonce management
pompon0 May 6, 2026
661dada
codex fixes
pompon0 May 6, 2026
2dd645f
Merge remote-tracking branch 'origin/main' into gprusak-rpc-sharding7
pompon0 May 6, 2026
c342b5c
codex
pompon0 May 6, 2026
51981c0
codex
pompon0 May 6, 2026
c136a19
removed callbacks
pompon0 May 6, 2026
655d393
grouped evm data in WrappedTx, needs more work
pompon0 May 6, 2026
d60cf36
fixes
pompon0 May 7, 2026
8cac6bc
common.Address
pompon0 May 7, 2026
307c709
expiration index is out
pompon0 May 7, 2026
af313d9
removed unused args
pompon0 May 8, 2026
5dd0813
inline cleanupTx
pompon0 May 8, 2026
641c0da
Merge remote-tracking branch 'origin/main' into gprusak-rpc-sharding8
pompon0 May 8, 2026
9beb38f
lint
pompon0 May 8, 2026
2b05133
EvmBalance fix
pompon0 May 8, 2026
0dbb903
snapshot
pompon0 May 8, 2026
eaa2ed9
balance handling fix
pompon0 May 8, 2026
b25b31c
test fix
pompon0 May 8, 2026
bbee25c
deflake port reservation
pompon0 May 8, 2026
e345b59
added a TODO
pompon0 May 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 22 additions & 13 deletions app/abci.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,17 @@ package app
import (
"context"
"crypto/sha256"
"math/big"
"time"

"github.com/ethereum/go-ethereum/common"
"github.com/sei-protocol/sei-chain/app/legacyabci"
"github.com/sei-protocol/sei-chain/sei-cosmos/tasks"
"github.com/sei-protocol/sei-chain/sei-cosmos/telemetry"
sdk "github.com/sei-protocol/sei-chain/sei-cosmos/types"
sdkerrors "github.com/sei-protocol/sei-chain/sei-cosmos/types/errors"
"github.com/sei-protocol/sei-chain/sei-cosmos/types/legacytm"
abci "github.com/sei-protocol/sei-chain/sei-tendermint/abci/types"
"github.com/sei-protocol/sei-chain/sei-tendermint/libs/utils"
"github.com/sei-protocol/sei-chain/utils/metrics"
)

Expand Down Expand Up @@ -104,22 +105,30 @@ func (app *App) CheckTx(ctx context.Context, req *abci.RequestCheckTxV2) *abci.R
Priority: txCtx.Priority(),
GasEstimated: int64(gInfo.GasEstimate), //nolint:gosec
},
CheckTxCallback: txCtx.CheckTxCallback(),
EVMNonce: txCtx.EVMNonce(),
EVMSenderAddress: txCtx.EVMSenderAddress(),
IsEVM: txCtx.IsEVM(),
Priority: txCtx.Priority(),
}
if txCtx.PendingTxChecker() != nil {
res.IsPending = utils.Some(txCtx.PendingTxChecker())
}
if txCtx.ExpireTxHandler() != nil {
res.ExpireTxHandler = utils.Some(txCtx.ExpireTxHandler())
EVMNonce: txCtx.EVMNonce(),
EVMSenderAddress: txCtx.EVMSenderAddress(),
SeiSenderAddress: txCtx.SeiSenderAddress(),
IsEVM: txCtx.IsEVM(),
EVMRequiredBalance: txCtx.EVMRequiredBalance(),
}

return res
}

func (app *App) EvmNonce(evmAddr common.Address) uint64 {
return app.EvmKeeper.GetNonce(app.GetCheckCtx(), evmAddr)
}

func (app *App) EvmBalance(evmAddr common.Address, seiAddrBz []byte) *big.Int {
ctx := app.GetCheckCtx()
balance := app.EvmKeeper.GetBalance(ctx, evmAddr[:])
seiAddr := sdk.AccAddress(seiAddrBz)
if !seiAddr.Equals(sdk.AccAddress(evmAddr[:])) {
balance = new(big.Int).Add(balance, app.EvmKeeper.GetBalance(ctx, seiAddr))
}
return balance
}

func (app *App) DeliverTx(ctx sdk.Context, req abci.RequestDeliverTxV2, tx sdk.Tx, checksum [32]byte) abci.ResponseDeliverTx {
defer metrics.MeasureDeliverTxDuration(time.Now())
// ensure we carry the initial context from tracer here
Expand Down Expand Up @@ -159,7 +168,7 @@ func (app *App) DeliverTx(ctx sdk.Context, req abci.RequestDeliverTxV2, tx sdk.T
}
if resCtx.IsEVM() {
res.EvmTxInfo = &abci.EvmTxInfo{
SenderAddress: resCtx.EVMSenderAddress(),
SenderAddress: resCtx.EVMSenderAddress().Hex(),
Nonce: resCtx.EVMNonce(),
TxHash: resCtx.EVMTxHash(),
VmError: result.EvmError,
Expand Down
65 changes: 7 additions & 58 deletions app/ante/evm_checktx.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,12 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/params"
"github.com/sei-protocol/sei-chain/app/antedecorators"
"github.com/sei-protocol/sei-chain/sei-cosmos/client"
cryptotypes "github.com/sei-protocol/sei-chain/sei-cosmos/crypto/types"
sdk "github.com/sei-protocol/sei-chain/sei-cosmos/types"
sdkerrors "github.com/sei-protocol/sei-chain/sei-cosmos/types/errors"
upgradekeeper "github.com/sei-protocol/sei-chain/sei-cosmos/x/upgrade/keeper"
abci "github.com/sei-protocol/sei-chain/sei-tendermint/abci/types"
tmtypes "github.com/sei-protocol/sei-chain/sei-tendermint/types"
"github.com/sei-protocol/sei-chain/utils"
"github.com/sei-protocol/sei-chain/utils/helpers"
"github.com/sei-protocol/sei-chain/utils/metrics"
evmante "github.com/sei-protocol/sei-chain/x/evm/ante"
"github.com/sei-protocol/sei-chain/x/evm/derived"
evmkeeper "github.com/sei-protocol/sei-chain/x/evm/keeper"
Expand All @@ -37,11 +33,9 @@ var logger = seilog.NewLogger("app", "ante")

func EvmCheckTxAnte(
ctx sdk.Context,
txConfig client.TxConfig,
tx sdk.Tx,
upgradeKeeper *upgradekeeper.Keeper,
ek *evmkeeper.Keeper,
latestCtxGetter func() sdk.Context,
) (returnCtx sdk.Context, returnErr error) {
chainID := ek.ChainID(ctx)
if err := EvmStatelessChecks(ctx, tx, chainID); err != nil {
Expand All @@ -66,12 +60,12 @@ func EvmCheckTxAnte(
return ctx, err
}

ctx, err = CheckNonce(ctx, latestCtxGetter, ek, etx, evmAddr, seiAddr)
ctx, err = CheckNonce(ctx, ek, etx, evmAddr)
if err != nil {
return ctx, err
}

return DecorateContext(ctx, ek, tx, txData, etx, evmAddr), nil
return DecorateContext(ctx, ek, tx, txData, etx, evmAddr, seiAddr), nil
}

func EvmStatelessChecks(ctx sdk.Context, tx sdk.Tx, chainID *big.Int) error {
Expand Down Expand Up @@ -158,13 +152,14 @@ func EvmStatelessChecks(ctx sdk.Context, tx sdk.Tx, chainID *big.Int) error {
return nil
}

func DecorateContext(ctx sdk.Context, ek *evmkeeper.Keeper, tx sdk.Tx, txData ethtx.TxData, etx *ethtypes.Transaction, sender common.Address) sdk.Context {
func DecorateContext(ctx sdk.Context, ek *evmkeeper.Keeper, tx sdk.Tx, txData ethtx.TxData, etx *ethtypes.Transaction, sender common.Address, seiSender sdk.AccAddress) sdk.Context {
ctx = ctx.WithPriority(CalculatePriority(ctx, txData, ek).Int64())

// set EVM properties
ctx = ctx.WithIsEVM(true)
ctx = ctx.WithEVMNonce(etx.Nonce())
ctx = ctx.WithEVMSenderAddress(sender.Hex())
ctx = ctx.WithEVMSenderAddress(sender)
ctx = ctx.WithSeiSenderAddress(seiSender)
ctx = ctx.WithEVMTxHash(etx.Hash().Hex())
adjustedGasLimit := ek.GetPriorityNormalizer(ctx).MulInt64(int64(txData.GetGas())) //nolint:gosec
gasMeter := sdk.NewGasMeterWithMultiplier(ctx, adjustedGasLimit.TruncateInt().Uint64())
Expand Down Expand Up @@ -283,7 +278,7 @@ func EvmCheckAndChargeFees(ctx sdk.Context, sender common.Address, ek *evmkeeper
return stateDB, nil
}

func CheckNonce(ctx sdk.Context, latestCtxGetter func() sdk.Context, ek *evmkeeper.Keeper, etx *ethtypes.Transaction, evmAddr common.Address, seiAddr sdk.AccAddress) (sdk.Context, error) {
func CheckNonce(ctx sdk.Context, ek *evmkeeper.Keeper, etx *ethtypes.Transaction, evmAddr common.Address) (sdk.Context, error) {
fee := new(big.Int).Mul(etx.GasPrice(), new(big.Int).SetUint64(etx.Gas()))
if etx.Value() != nil {
fee = new(big.Int).Add(fee, etx.Value())
Expand All @@ -294,53 +289,7 @@ func CheckNonce(ctx sdk.Context, latestCtxGetter func() sdk.Context, ek *evmkeep
if txNonce < nextNonce {
return ctx, sdkerrors.ErrWrongSequence
}
ctx = ctx.WithCheckTxCallback(func(priority int64) {
txHash := tmtypes.Tx(ctx.TxBytes()).Hash()
ek.AddPendingNonce(txHash, evmAddr, etx.Nonce(), priority)
metrics.IncrementPendingNonce("added")
})

// if the mempool expires a transaction, this handler is invoked
ctx = ctx.WithExpireTxHandler(func() {
txHash := tmtypes.Tx(ctx.TxBytes()).Hash()
ek.RemovePendingNonce(txHash)
metrics.IncrementPendingNonce("expired")
})

if txNonce > nextNonce {
// transaction shall be added to mempool as a pending transaction
ctx = ctx.WithPendingTxChecker(func() abci.PendingTxCheckerResponse {
latestCtx := latestCtxGetter()

// nextNonceToBeMined is the next nonce that will be mined
// geth calls SetNonce(n+1) after a transaction is mined
nextNonceToBeMined := ek.GetNonce(latestCtx, evmAddr)

// nextPendingNonce is the minimum nonce a user may send without stomping on an already-sent
// nonce, including non-mined or pending transactions
// If a user skips a nonce [1,2,4], then this will be the value of that hole (e.g., 3)
nextPendingNonce := ek.CalculateNextNonce(latestCtx, evmAddr, true)

if txNonce < nextNonceToBeMined {
// this nonce has already been mined, we cannot accept it again
metrics.IncrementPendingNonce("rejected")
return abci.Rejected
} else if txNonce < nextPendingNonce {
// check if the sender still has enough funds to pay for gas
balance := ek.GetBalance(latestCtx, seiAddr)
if balance.Cmp(fee) < 0 {
// not enough funds. Go back to pending as it may obtain sufficient funds later.
return abci.Pending
}
// this nonce is allowed to process as it is part of the
// consecutive nonces from nextNonceToBeMined to nextPendingNonce
// This logic allows multiple nonces from an account to be processed in a block.
metrics.IncrementPendingNonce("accepted")
return abci.Accepted
}
return abci.Pending
})
}
ctx = ctx.WithEVMRequiredBalance(fee)
return ctx, nil
}

Expand Down
12 changes: 6 additions & 6 deletions app/ante/evm_delivertx.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,24 +34,24 @@ func EvmDeliverTxAnte(
return HandleAssociateTx(ctx, ek, atx, false)
}
etx := ethtypes.NewTx(txData.AsEthereumData())
evmAddr, version, err := EvmDeliverHandleSignatures(ctx, ek, txData, chainID, msg)
evmAddr, seiAddr, version, err := EvmDeliverHandleSignatures(ctx, ek, txData, chainID, msg)
if err != nil {
return ctx, err
}
ctx = DecorateNonceCallback(ctx, ek, evmAddr, etx.Nonce())
if err := EvmDeliverChargeFees(ctx, ek, upgradeKeeper, txData, etx, msg, version, evmAddr); err != nil {
return ctx, err
}
return DecorateContext(ctx, ek, tx, txData, etx, evmAddr), nil
return DecorateContext(ctx, ek, tx, txData, etx, evmAddr, seiAddr), nil
}

func EvmDeliverHandleSignatures(ctx sdk.Context, ek *evmkeeper.Keeper, txData ethtx.TxData, chainID *big.Int, msg *evmtypes.MsgEVMTransaction) (common.Address, derived.SignerVersion, error) {
func EvmDeliverHandleSignatures(ctx sdk.Context, ek *evmkeeper.Keeper, txData ethtx.TxData, chainID *big.Int, msg *evmtypes.MsgEVMTransaction) (common.Address, sdk.AccAddress, derived.SignerVersion, error) {
evmAddr, seiAddr, seiPubkey, version, err := CheckAndDecodeSignature(ctx, txData, chainID, ek.EthBlockTestConfig.Enabled)
if err != nil {
return evmAddr, version, err
return evmAddr, seiAddr, version, err
}
if err := AssociateAddress(ctx, ek, evmAddr, seiAddr, seiPubkey); err != nil {
return evmAddr, version, err
return evmAddr, seiAddr, version, err
}
if ek.EthReplayConfig.Enabled {
ek.PrepareReplayedAddr(ctx, evmAddr)
Expand All @@ -63,7 +63,7 @@ func EvmDeliverHandleSignatures(ctx sdk.Context, ek *evmkeeper.Keeper, txData et
Version: version,
IsAssociate: false,
}
return evmAddr, version, nil
return evmAddr, seiAddr, version, nil
}

func EvmDeliverChargeFees(ctx sdk.Context, ek *evmkeeper.Keeper, upgradeKeeper *upgradekeeper.Keeper, txData ethtx.TxData, etx *ethtypes.Transaction, msg *evmtypes.MsgEVMTransaction, version derived.SignerVersion, evmAddr common.Address) error {
Expand Down
16 changes: 6 additions & 10 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -2402,11 +2402,6 @@ func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig

}

// RegisterTxService implements the Application.RegisterTxService method.
func (app *App) RegisterTxService(clientCtx client.Context) {
authtx.RegisterTxService(app.GRPCQueryRouter(), clientCtx, app.Simulate, app.interfaceRegistry)
}

func (app *App) RPCContextProvider(i int64) sdk.Context {
if i == evmrpc.LatestCtxHeight {
ctx := app.GetCheckCtx()
Expand All @@ -2431,9 +2426,10 @@ func (app *App) RPCContextProvider(i int64) sdk.Context {
return ctx.WithIsEVM(true).WithTraceMode(true).WithIsCheckTx(false)
}

// RegisterTendermintService implements the Application.RegisterTendermintService method.
func (app *App) RegisterTendermintService(clientCtx client.Context) {
tmservice.RegisterTendermintService(app.GRPCQueryRouter(), clientCtx, app.interfaceRegistry)
// RegisterTendermintService implements the Application.RegisterLocalServices method.
func (app *App) RegisterLocalServices(node client.LocalClient, txConfig client.TxConfig) {
authtx.RegisterTxService(app.GRPCQueryRouter(), node, txConfig, app.Simulate, app.interfaceRegistry)
tmservice.RegisterTendermintService(app.GRPCQueryRouter(), node, app.interfaceRegistry)
txConfigProvider := func(height int64) client.TxConfig {
if app.ChainID != "pacific-1" {
return app.encodingConfig.TxConfig
Expand All @@ -2446,7 +2442,7 @@ func (app *App) RegisterTendermintService(clientCtx client.Context) {
}

if app.evmRPCConfig.HTTPEnabled {
evmHTTPServer, err := evmrpc.NewEVMHTTPServer(app.evmRPCConfig, clientCtx.Client, &app.EvmKeeper, app.BeginBlockKeepers, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, DefaultNodeHome, app.GetStateStore(), nil)
evmHTTPServer, err := evmrpc.NewEVMHTTPServer(app.evmRPCConfig, node, &app.EvmKeeper, app.BeginBlockKeepers, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, DefaultNodeHome, app.GetStateStore(), nil)
if err != nil {
panic(err)
}
Expand All @@ -2459,7 +2455,7 @@ func (app *App) RegisterTendermintService(clientCtx client.Context) {
}

if app.evmRPCConfig.WSEnabled {
evmWSServer, err := evmrpc.NewEVMWebSocketServer(app.evmRPCConfig, clientCtx.Client, &app.EvmKeeper, app.BeginBlockKeepers, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, DefaultNodeHome, app.GetStateStore())
evmWSServer, err := evmrpc.NewEVMWebSocketServer(app.evmRPCConfig, node, &app.EvmKeeper, app.BeginBlockKeepers, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, DefaultNodeHome, app.GetStateStore())
if err != nil {
panic(err)
}
Expand Down
2 changes: 1 addition & 1 deletion app/legacyabci/check_tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ func CheckTx(
if isEVM, evmerr := evmante.IsEVMMessage(tx); evmerr != nil {
err = evmerr
} else if isEVM {
newCtx, err = ante.EvmCheckTxAnte(anteCtx, txConfig, tx, keepers.UpgradeKeeper, keepers.EvmKeeper, latestCtxGetter)
newCtx, err = ante.EvmCheckTxAnte(anteCtx, tx, keepers.UpgradeKeeper, keepers.EvmKeeper)
} else {
newCtx, err = ante.CosmosCheckTxAnte(anteCtx, txConfig, tx, keepers.ParamsKeeper, keepers.OracleKeeper, keepers.EvmKeeper, keepers.AccountKeeper, keepers.BankKeeper, keepers.FeeGrantKeeper, keepers.IBCKeeper)
}
Expand Down
2 changes: 1 addition & 1 deletion app/legacyabci/deliver_tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ func DeliverTx(
var evmTxInfo *abci.EvmTxInfo
if ctx.IsEVM() {
evmTxInfo = &abci.EvmTxInfo{
SenderAddress: ctx.EVMSenderAddress(),
SenderAddress: ctx.EVMSenderAddress().Hex(),
Nonce: ctx.EVMNonce(),
TxHash: ctx.EVMTxHash(),
VmError: result.EvmError,
Expand Down
46 changes: 38 additions & 8 deletions contracts/test/lib.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ const {ethers} = require("hardhat"); // Importing exec from child_process
const axios = require("axios");

const adminKeyName = "admin"
const seilocalSignerPrivateKeys = {
"0xf87a299e6bc7beba58dbbe5a5aa21d49bcd16d52": "57acb95d82739866a5c29e40b0aa2590742ae50425b7dd5b5d279a986370189e",
"0x70997970c51812dc3a010c7d01b50e0d17dc79c8": "59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d",
"0x817e1414b633948e50101df0b722dea5f8c29109": "888432482e2cbcf4e2b248a388f2a6d9fe7b59a11e9136fd615942d7421e89bf",
};

const ABI = {
ERC20: [
Expand Down Expand Up @@ -162,6 +167,25 @@ async function associateKey(keyName) {
}
}

async function associateSigner(signer) {
const evmAddress = (await signer.getAddress()).toLowerCase();
const privKey = seilocalSignerPrivateKeys[evmAddress];
if (!privKey) {
return null;
}
try {
await execute(`seid tx evm associate-address ${privKey} --from ${adminKeyName} -b block`)
await delay()
} catch (e) {
console.log("skipping signer association")
}
try {
return await getSeiAddress(evmAddress);
} catch (e) {
return null;
}
}

function getEventAttribute(response, type, attribute) {
if(!response.logs || response.logs.length === 0) {
throw new Error("logs not returned")
Expand Down Expand Up @@ -577,14 +601,20 @@ async function setupSigners(signers) {
const result = []
for(let signer of signers) {
const evmAddress = await signer.getAddress();
await fundAddress(evmAddress);
await delay()
const resp = await signer.sendTransaction({
to: evmAddress,
value: 0
});
await resp.wait()
const seiAddress = await getSeiAddress(evmAddress);
let seiAddress = await associateSigner(signer);
if (seiAddress) {
await fundSeiAddress(seiAddress);
await delay()
} else {
await fundAddress(evmAddress);
await delay()
const resp = await signer.sendTransaction({
to: evmAddress,
value: 0
});
await resp.wait()
seiAddress = await getSeiAddress(evmAddress);
}
result.push({
seiAddress,
evmAddress,
Expand Down
7 changes: 0 additions & 7 deletions docker/localnode/config/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@
### Main Base Config Options ###
#######################################################################

# TCP or UNIX socket address of the ABCI application,
# or the name of an ABCI application compiled in with the Tendermint binary
proxy-app = "tcp://127.0.0.1:26658"

# A custom human readable name for this node
moniker = "sei-node-0"

Expand Down Expand Up @@ -59,9 +55,6 @@ genesis-file = "config/genesis.json"
# Path to the JSON file containing the private key to use for node authentication in the p2p protocol
node-key-file = "config/node_key.json"

# Mechanism to connect to the ABCI application: socket | grpc
abci = "socket"

#######################################################
### Priv Validator Configuration ###
#######################################################
Expand Down
Loading
Loading