[wip] nitro server
This commit is contained in:
parent
01204261b7
commit
64d1a6d283
@ -20,6 +20,7 @@ import (
|
|||||||
slashingkeeper "cosmossdk.io/x/slashing/keeper"
|
slashingkeeper "cosmossdk.io/x/slashing/keeper"
|
||||||
stakingkeeper "cosmossdk.io/x/staking/keeper"
|
stakingkeeper "cosmossdk.io/x/staking/keeper"
|
||||||
"git.vdb.to/cerc-io/laconicd/server/distsig"
|
"git.vdb.to/cerc-io/laconicd/server/distsig"
|
||||||
|
"git.vdb.to/cerc-io/laconicd/server/nitro"
|
||||||
"git.vdb.to/cerc-io/laconicd/utils"
|
"git.vdb.to/cerc-io/laconicd/utils"
|
||||||
auctionkeeper "git.vdb.to/cerc-io/laconicd/x/auction/keeper"
|
auctionkeeper "git.vdb.to/cerc-io/laconicd/x/auction/keeper"
|
||||||
bondkeeper "git.vdb.to/cerc-io/laconicd/x/bond/keeper"
|
bondkeeper "git.vdb.to/cerc-io/laconicd/x/bond/keeper"
|
||||||
@ -74,8 +75,7 @@ type LaconicApp[T Tx] struct {
|
|||||||
txConfig client.TxConfig
|
txConfig client.TxConfig
|
||||||
interfaceRegistry codectypes.InterfaceRegistry
|
interfaceRegistry codectypes.InterfaceRegistry
|
||||||
store store.RootStore
|
store store.RootStore
|
||||||
|
distsigManager *distsig.Manager
|
||||||
distsigManager *distsig.Manager
|
|
||||||
|
|
||||||
// basic keepers
|
// basic keepers
|
||||||
AccountKeeper authkeeper.AccountKeeper
|
AccountKeeper authkeeper.AccountKeeper
|
||||||
@ -147,6 +147,7 @@ func NewLaconicApp[T Tx](
|
|||||||
&app.txConfig,
|
&app.txConfig,
|
||||||
&app.interfaceRegistry,
|
&app.interfaceRegistry,
|
||||||
&app.distsigManager,
|
&app.distsigManager,
|
||||||
|
// modules
|
||||||
&app.StakingKeeper,
|
&app.StakingKeeper,
|
||||||
&app.AccountKeeper,
|
&app.AccountKeeper,
|
||||||
&app.BankKeeper,
|
&app.BankKeeper,
|
||||||
|
@ -50,6 +50,7 @@ type CommandDependencies[T app.Tx] struct {
|
|||||||
ConsensusServer *cometbft.CometBFTServer[T]
|
ConsensusServer *cometbft.CometBFTServer[T]
|
||||||
ClientContext client.Context
|
ClientContext client.Context
|
||||||
DistSigManager *distsig.Manager
|
DistSigManager *distsig.Manager
|
||||||
|
NitroServer *nitro.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitRootCmd[T app.Tx](
|
func InitRootCmd[T app.Tx](
|
||||||
@ -158,10 +159,6 @@ func InitRootCmd[T app.Tx](
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
nitroServer, err := nitro.NewServer(logger, deps.GlobalConfig, deps.ClientContext.Keyring)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// wire server commands
|
// wire server commands
|
||||||
return serverv2.AddCommands[T](
|
return serverv2.AddCommands[T](
|
||||||
@ -176,7 +173,7 @@ func InitRootCmd[T app.Tx](
|
|||||||
telemetryServer,
|
telemetryServer,
|
||||||
restServer,
|
restServer,
|
||||||
gqlServer,
|
gqlServer,
|
||||||
nitroServer,
|
deps.NitroServer,
|
||||||
deps.DistSigManager,
|
deps.DistSigManager,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ import (
|
|||||||
|
|
||||||
"git.vdb.to/cerc-io/laconicd/app"
|
"git.vdb.to/cerc-io/laconicd/app"
|
||||||
"git.vdb.to/cerc-io/laconicd/server/distsig"
|
"git.vdb.to/cerc-io/laconicd/server/distsig"
|
||||||
|
"git.vdb.to/cerc-io/laconicd/server/nitro"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -76,6 +77,7 @@ func NewRootCmd[T app.Tx](
|
|||||||
clientCtx client.Context
|
clientCtx client.Context
|
||||||
laconic *app.LaconicApp[T]
|
laconic *app.LaconicApp[T]
|
||||||
dsManager *distsig.Manager
|
dsManager *distsig.Manager
|
||||||
|
nitroServer *nitro.Server
|
||||||
depinjectConfig = depinject.Configs(
|
depinjectConfig = depinject.Configs(
|
||||||
depinject.Supply(logger, runtime.GlobalConfig(configMap)),
|
depinject.Supply(logger, runtime.GlobalConfig(configMap)),
|
||||||
depinject.Provide(
|
depinject.Provide(
|
||||||
@ -88,7 +90,7 @@ func NewRootCmd[T app.Tx](
|
|||||||
// server construction
|
// server construction
|
||||||
laconic, err = app.NewLaconicApp[T](
|
laconic, err = app.NewLaconicApp[T](
|
||||||
depinjectConfig,
|
depinjectConfig,
|
||||||
&autoCliOpts, &moduleManager, &clientCtx, &dsManager,
|
&autoCliOpts, &moduleManager, &clientCtx, &dsManager, &nitroServer,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -100,7 +102,7 @@ func NewRootCmd[T app.Tx](
|
|||||||
app.AppConfig(),
|
app.AppConfig(),
|
||||||
depinjectConfig,
|
depinjectConfig,
|
||||||
),
|
),
|
||||||
&autoCliOpts, &moduleManager, &clientCtx, &dsManager,
|
&autoCliOpts, &moduleManager, &clientCtx, &dsManager, &nitroServer,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -112,6 +114,7 @@ func NewRootCmd[T app.Tx](
|
|||||||
LaconicApp: laconic,
|
LaconicApp: laconic,
|
||||||
ClientContext: clientCtx,
|
ClientContext: clientCtx,
|
||||||
DistSigManager: dsManager,
|
DistSigManager: dsManager,
|
||||||
|
NitroServer: nitroServer,
|
||||||
}
|
}
|
||||||
rootCommand = &cobra.Command{
|
rootCommand = &cobra.Command{
|
||||||
Use: "laconicd",
|
Use: "laconicd",
|
||||||
|
70
server/nitro/commands.go
Normal file
70
server/nitro/commands.go
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
package nitro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"github.com/statechannels/go-nitro/channel/state/outcome"
|
||||||
|
gonitrotypes "github.com/statechannels/go-nitro/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
FlagAssetAddress = "asset"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *Server) OpenChannel() *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "open-channel <amount>", // TODO: doc args?
|
||||||
|
Short: "Open a payment channel with the Laconic custodian",
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
// clientCtx, err := client.GetClientTxContext(cmd)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// use Coin types for eth and tokens?
|
||||||
|
// how do we map denoms to addresses?
|
||||||
|
amount, ok := new(big.Int).SetString(args[1], 10)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid amount: %s", args[1])
|
||||||
|
}
|
||||||
|
assetStr, err := cmd.Flags().GetString(FlagAssetAddress)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var asset common.Address // 0 address mean ETH
|
||||||
|
if assetStr != "" {
|
||||||
|
asset = common.HexToAddress(assetStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
destination := LaconicCustodianAddress
|
||||||
|
exit := outcome.Exit{
|
||||||
|
outcome.SingleAssetExit{
|
||||||
|
Asset: asset,
|
||||||
|
Allocations: []outcome.Allocation{
|
||||||
|
{ // TODO: what should initial allocation be?
|
||||||
|
Destination: gonitrotypes.AddressToDestination(s.EthAddress),
|
||||||
|
Amount: amount,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
r, err := s.CreateLedgerChannel(destination, 0, exit)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cmd.Println("objective response:", r)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
cmd.Flags().String(FlagAssetAddress, "", "The address of the asset to fund the channel with")
|
||||||
|
addClientFlags(cmd.Flags())
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
@ -4,7 +4,7 @@ type Config struct {
|
|||||||
// TODO: use keyring
|
// TODO: use keyring
|
||||||
Pk string `mapstructure:"pk" toml:"pk" comment:"The private key used by the Nitro node."`
|
Pk string `mapstructure:"pk" toml:"pk" comment:"The private key used by the Nitro node."`
|
||||||
|
|
||||||
// EthPk string `mapstructure:"eth-pk" toml:"eth-pk" comment:"eth-pk specifies the private key to use when interacting with the Ethereum chain."`
|
EthPk string `mapstructure:"eth-pk" toml:"eth-pk" comment:"The private key used when interacting with the Ethereum chain."`
|
||||||
EthUrl string `mapstructure:"eth-url" toml:"eth-url" comment:"The URL of the Ethereum node to connect to."`
|
EthUrl string `mapstructure:"eth-url" toml:"eth-url" comment:"The URL of the Ethereum node to connect to."`
|
||||||
EthAuthToken string `mapstructure:"eth-auth-token" toml:"eth-auth-token" comment:"The bearer token used for auth in requests to the Ethereum chain's RPC endpoint."`
|
EthAuthToken string `mapstructure:"eth-auth-token" toml:"eth-auth-token" comment:"The bearer token used for auth in requests to the Ethereum chain's RPC endpoint."`
|
||||||
EthStartBlock uint64 `mapstructure:"eth-start-block" toml:"eth-start-block" comment:"Ethereum block number to start listening for Nitro Adjudicator events."`
|
EthStartBlock uint64 `mapstructure:"eth-start-block" toml:"eth-start-block" comment:"Ethereum block number to start listening for Nitro Adjudicator events."`
|
||||||
|
23
server/nitro/dev_account.go
Normal file
23
server/nitro/dev_account.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package nitro
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// (DEV) EOA placeholder for consensus-controlled smart contract account
|
||||||
|
LaconicCustodianAddress common.Address
|
||||||
|
LaconicCustodianPrivKey = secp256k1.PrivKey{Key: crypto.Keccak256([]byte("laconic-custodian"))}
|
||||||
|
// LaconicCustodianPrivKey *ecdsa.PrivateKey
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
ecdsaPrivKey, err := crypto.ToECDSA(LaconicCustodianPrivKey.Key)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
LaconicCustodianAddress = crypto.PubkeyToAddress(ecdsaPrivKey.PublicKey)
|
||||||
|
}
|
@ -14,7 +14,7 @@ func prefix(f string) string {
|
|||||||
var (
|
var (
|
||||||
flag_pk = prefix("pk") // "pk"
|
flag_pk = prefix("pk") // "pk"
|
||||||
|
|
||||||
// flag_eth_pk = prefix("eth-pk") // "chainpk"
|
flag_eth_pk = prefix("eth-pk") // "chainpk"
|
||||||
flag_eth_url = prefix("eth-url") // "chainurl"
|
flag_eth_url = prefix("eth-url") // "chainurl"
|
||||||
flag_eth_start_block = prefix("eth-start-block") // "chainstartblock"
|
flag_eth_start_block = prefix("eth-start-block") // "chainstartblock"
|
||||||
flag_eth_auth_token = prefix("eth-auth-token") // "chainauthtoken"
|
flag_eth_auth_token = prefix("eth-auth-token") // "chainauthtoken"
|
||||||
@ -34,7 +34,7 @@ var (
|
|||||||
// flag_gui_port = prefix("gui-port") // "guiport"
|
// flag_gui_port = prefix("gui-port") // "guiport"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AddNitroFlags(flags *pflag.FlagSet) {
|
func addServerFlags(flags *pflag.FlagSet) {
|
||||||
flags.String(flag_pk, "",
|
flags.String(flag_pk, "",
|
||||||
"name of private key used by the Nitro node",
|
"name of private key used by the Nitro node",
|
||||||
// EnvVars: []string{"SC_PK"},
|
// EnvVars: []string{"SC_PK"},
|
||||||
@ -47,10 +47,6 @@ func AddNitroFlags(flags *pflag.FlagSet) {
|
|||||||
"bearer token used for auth in requests to the Ethereum chain's RPC endpoint",
|
"bearer token used for auth in requests to the Ethereum chain's RPC endpoint",
|
||||||
// EnvVars: []string{"CHAIN_AUTH_TOKEN"},
|
// EnvVars: []string{"CHAIN_AUTH_TOKEN"},
|
||||||
)
|
)
|
||||||
// flags.String(flag_eth_pk, "",
|
|
||||||
// "name of private key to use when interacting with the Ethereum chain",
|
|
||||||
// // EnvVars: []string{"CHAIN_PK"},
|
|
||||||
// )
|
|
||||||
flags.Uint64(flag_eth_start_block, 0,
|
flags.Uint64(flag_eth_start_block, 0,
|
||||||
"Ethereum block number to start listening for Nitro Adjudicator events",
|
"Ethereum block number to start listening for Nitro Adjudicator events",
|
||||||
// EnvVars: []string{"CHAIN_START_BLOCK"},
|
// EnvVars: []string{"CHAIN_START_BLOCK"},
|
||||||
@ -96,3 +92,12 @@ func AddNitroFlags(flags *pflag.FlagSet) {
|
|||||||
"filepath to the TLS private key; if not specified, TLS will not be used with the RPC transport",
|
"filepath to the TLS private key; if not specified, TLS will not be used with the RPC transport",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addClientFlags(flags *pflag.FlagSet) {
|
||||||
|
// TODO: this is only used by "client" (user) nodes
|
||||||
|
flags.String(flag_eth_pk, "",
|
||||||
|
"name of private key to use when interacting with the Ethereum chain",
|
||||||
|
// EnvVars: []string{"CHAIN_PK"},
|
||||||
|
)
|
||||||
|
addServerFlags(flags)
|
||||||
|
}
|
||||||
|
@ -3,16 +3,15 @@ package nitro
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
"github.com/statechannels/go-nitro/crypto"
|
|
||||||
"github.com/statechannels/go-nitro/node"
|
"github.com/statechannels/go-nitro/node"
|
||||||
"github.com/statechannels/go-nitro/node/engine"
|
"github.com/statechannels/go-nitro/node/engine"
|
||||||
"github.com/statechannels/go-nitro/node/engine/chainservice"
|
"github.com/statechannels/go-nitro/node/engine/chainservice"
|
||||||
@ -20,11 +19,12 @@ import (
|
|||||||
"github.com/statechannels/go-nitro/node/engine/store"
|
"github.com/statechannels/go-nitro/node/engine/store"
|
||||||
nitrotypes "github.com/statechannels/go-nitro/types"
|
nitrotypes "github.com/statechannels/go-nitro/types"
|
||||||
|
|
||||||
"cosmossdk.io/core/server"
|
|
||||||
"cosmossdk.io/core/transaction"
|
"cosmossdk.io/core/transaction"
|
||||||
"cosmossdk.io/log"
|
"cosmossdk.io/log"
|
||||||
|
"cosmossdk.io/runtime/v2"
|
||||||
serverv2 "cosmossdk.io/server/v2"
|
serverv2 "cosmossdk.io/server/v2"
|
||||||
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||||
|
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||||
|
|
||||||
"git.vdb.to/cerc-io/laconicd/utils"
|
"git.vdb.to/cerc-io/laconicd/utils"
|
||||||
)
|
)
|
||||||
@ -53,45 +53,46 @@ type Server struct {
|
|||||||
logger log.Logger
|
logger log.Logger
|
||||||
config *Config
|
config *Config
|
||||||
|
|
||||||
// name of Ethereum private key used for chain txs
|
|
||||||
EthKey string
|
|
||||||
// path to Nitro store directory
|
// path to Nitro store directory
|
||||||
storeDir string
|
storeDir string
|
||||||
|
|
||||||
// EthAddress common.Address
|
EthAddress common.Address
|
||||||
StateChannelAddress nitrotypes.PartyAddress
|
StateChannelAddress nitrotypes.PartyAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServer(logger log.Logger, cfg server.ConfigMap, kr keyring.Keyring) (*Server, error) {
|
func NewServer(logger log.Logger, cfg *Config, kr keyring.Keyring, storeDir string) (*Server, error) {
|
||||||
home, _ := cfg[serverv2.FlagHome].(string)
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
storeDir: filepath.Join(home, "nitro"),
|
storeDir: storeDir,
|
||||||
|
config: cfg,
|
||||||
}
|
}
|
||||||
s.logger = logger.With(log.ModuleKey, s.Name())
|
s.logger = logger.With(log.ModuleKey, s.Name())
|
||||||
|
|
||||||
s.config = s.Config().(*Config)
|
|
||||||
if len(cfg) > 0 {
|
|
||||||
if err := serverv2.UnmarshalSubConfig(cfg, s.Name(), s.config); err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to unmarshal config: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s, s.init(kr)
|
return s, s.init(kr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) init(kr keyring.Keyring) error {
|
func (s *Server) init(kr keyring.Keyring) error {
|
||||||
|
var err error
|
||||||
c := s.config
|
c := s.config
|
||||||
|
|
||||||
|
var ethkey cryptotypes.PrivKey
|
||||||
|
if c.EthPk != "" {
|
||||||
|
ethkey, err = utils.ExtractPrivateKey(kr, c.EthPk)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// TODO for server, inject signer or callback into nitro node instead of naked privkey
|
||||||
|
// client case is simple signature
|
||||||
|
// for validator, multisignatures can be negotiated over abci txs, then loaded into signer
|
||||||
|
// Sign(message) only passes once validator's signature is prepared
|
||||||
|
s.logger.Warn("(DEV) using fake Laconic custodian Ethereum private key")
|
||||||
|
ethkey = &LaconicCustodianPrivKey
|
||||||
|
}
|
||||||
|
|
||||||
sckey, err := utils.ExtractPrivateKey(kr, c.Pk)
|
sckey, err := utils.ExtractPrivateKey(kr, c.Pk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO inject signer or callback into nitro node instead of naked privkey
|
|
||||||
// signer.Sign(message)
|
|
||||||
// client case is simple signature
|
|
||||||
// for validator, multisignatures can be negotiated over abci txs, then loaded into signer
|
|
||||||
// Sign(message) only passes once validator's signature is prepared
|
|
||||||
|
|
||||||
storeOpts := store.StoreOpts{
|
storeOpts := store.StoreOpts{
|
||||||
PkBytes: sckey.Bytes(),
|
PkBytes: sckey.Bytes(),
|
||||||
UseDurableStore: true,
|
UseDurableStore: true,
|
||||||
@ -114,7 +115,7 @@ func (s *Server) init(kr keyring.Keyring) error {
|
|||||||
ChainStartBlockNum: c.EthStartBlock,
|
ChainStartBlockNum: c.EthStartBlock,
|
||||||
ChainAuthToken: c.EthAuthToken,
|
ChainAuthToken: c.EthAuthToken,
|
||||||
// TODO delegation to distsig
|
// TODO delegation to distsig
|
||||||
// ChainPk: hex.EncodeToString(ethkey),
|
ChainPk: hex.EncodeToString(ethkey.Bytes()),
|
||||||
NaAddress: common.HexToAddress(c.EthNaAddress),
|
NaAddress: common.HexToAddress(c.EthNaAddress),
|
||||||
VpaAddress: common.HexToAddress(c.EthVpaAddress),
|
VpaAddress: common.HexToAddress(c.EthVpaAddress),
|
||||||
CaAddress: common.HexToAddress(c.EthCaAddress),
|
CaAddress: common.HexToAddress(c.EthCaAddress),
|
||||||
@ -122,7 +123,7 @@ func (s *Server) init(kr keyring.Keyring) error {
|
|||||||
// Inject SDK logger into slog, which Nitro uses
|
// Inject SDK logger into slog, which Nitro uses
|
||||||
loggerImpl, ok := s.logger.Impl().(*slog.Logger)
|
loggerImpl, ok := s.logger.Impl().(*slog.Logger)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("logger does not have slog implementation")
|
s.logger.Warn("logger does not have slog implementation")
|
||||||
}
|
}
|
||||||
slog.SetDefault(loggerImpl)
|
slog.SetDefault(loggerImpl)
|
||||||
|
|
||||||
@ -130,8 +131,13 @@ func (s *Server) init(kr keyring.Keyring) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// note: utils.EthAddressFromPubKey only works with uncompressed keys
|
||||||
|
ethPubkey, err := crypto.DecompressPubkey(ethkey.PubKey().Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
s.Node = node
|
s.Node = node
|
||||||
// s.EthAddress = crypto.GetAddressFromSecretKeyBytes(ethkey)
|
s.EthAddress = crypto.PubkeyToAddress(*ethPubkey)
|
||||||
s.StateChannelAddress = *store.GetAddress()
|
s.StateChannelAddress = *store.GetAddress()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -210,7 +216,7 @@ func (s *Server) Config() any {
|
|||||||
|
|
||||||
func (s *Server) StartCmdFlags() *pflag.FlagSet {
|
func (s *Server) StartCmdFlags() *pflag.FlagSet {
|
||||||
flags := pflag.NewFlagSet(s.Name(), pflag.ExitOnError)
|
flags := pflag.NewFlagSet(s.Name(), pflag.ExitOnError)
|
||||||
AddNitroFlags(flags)
|
addServerFlags(flags)
|
||||||
return flags
|
return flags
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,3 +231,20 @@ func (s *Server) CLICommands() serverv2.CLIConfig {
|
|||||||
// Queries: []*cobra.Command{},
|
// Queries: []*cobra.Command{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func UnmarshalConfig(cfg map[string]any) (*Config, error) {
|
||||||
|
config := DefaultConfig()
|
||||||
|
if err := serverv2.UnmarshalSubConfig(cfg, serverName, config); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to unmarshal %T: %w", config, err)
|
||||||
|
}
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProvideServer(logger log.Logger, globalConfig runtime.GlobalConfig, kr keyring.Keyring) (*Server, error) {
|
||||||
|
home, _ := globalConfig[serverv2.FlagHome].(string)
|
||||||
|
config, err := UnmarshalConfig(globalConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewServer(logger, config, kr, filepath.Join(home, "nitro"))
|
||||||
|
}
|
||||||
|
@ -2,16 +2,51 @@ package keeper
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"cosmossdk.io/collections"
|
||||||
|
"cosmossdk.io/core/address"
|
||||||
appmodule "cosmossdk.io/core/appmodule/v2"
|
appmodule "cosmossdk.io/core/appmodule/v2"
|
||||||
banktypes "cosmossdk.io/x/bank/types"
|
banktypes "cosmossdk.io/x/bank/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
|
||||||
|
"git.vdb.to/cerc-io/laconicd/server/distsig"
|
||||||
|
"git.vdb.to/cerc-io/laconicd/x/nitrobank"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Keeper struct {
|
type Keeper struct {
|
||||||
appmodule.Environment
|
appmodule.Environment
|
||||||
|
addressCodec address.Codec
|
||||||
|
// logger log.Logger
|
||||||
|
|
||||||
// use interface from bank module
|
// use interface from bank module
|
||||||
acctKeeper banktypes.AccountKeeper
|
accountKeeper banktypes.AccountKeeper
|
||||||
|
distsigManager *distsig.Manager
|
||||||
|
|
||||||
|
ChannelProposals collections.Map[string, nitrobank.MsgProposeChannel]
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewKeeper(
|
||||||
|
cdc codec.BinaryCodec,
|
||||||
|
env appmodule.Environment,
|
||||||
|
addressCodec address.Codec,
|
||||||
|
accountKeeper banktypes.AccountKeeper,
|
||||||
|
distsigManager *distsig.Manager,
|
||||||
|
) Keeper {
|
||||||
|
sb := collections.NewSchemaBuilder(env.KVStoreService)
|
||||||
|
return Keeper{
|
||||||
|
Environment: env,
|
||||||
|
addressCodec: addressCodec,
|
||||||
|
accountKeeper: accountKeeper,
|
||||||
|
distsigManager: distsigManager,
|
||||||
|
ChannelProposals: collections.NewMap(
|
||||||
|
sb, nitrobank.ChannelProposalsPrefix, "channel_proposals",
|
||||||
|
collections.StringKey, codec.CollValue[nitrobank.MsgProposeChannel](cdc),
|
||||||
|
),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// func (k Keeper) EnsurePaymentChannel(from, to sdk.AccAddress, amount sdk.Coins) error {
|
// func (k Keeper) EnsurePaymentChannel(from, to sdk.AccAddress, amount sdk.Coins) error {
|
||||||
@ -20,4 +55,36 @@ func (k Keeper) EnsurePaymentChannel(from sdk.AccAddress, to string, amount sdk.
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k Keeper) ProposeChannel(ctx context.Context) {}
|
func (k Keeper) ProposeChannel(ctx context.Context, req *nitrobank.MsgProposeChannel) error {
|
||||||
|
from, err := k.addressCodec.StringToBytes(req.FromAddress)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
account := k.accountKeeper.GetAccount(ctx, from)
|
||||||
|
proposalId := proposalID{
|
||||||
|
from: from,
|
||||||
|
accnum: account.GetAccountNumber(),
|
||||||
|
seqnum: account.GetSequence(),
|
||||||
|
}.generate(k.addressCodec)
|
||||||
|
// if err := k.distsigManager.StartSignature(); err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
return k.ChannelProposals.Set(ctx, proposalId, *req)
|
||||||
|
}
|
||||||
|
|
||||||
|
type proposalID struct {
|
||||||
|
from sdk.AccAddress
|
||||||
|
accnum uint64
|
||||||
|
seqnum uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (id proposalID) generate(ac address.Codec) string {
|
||||||
|
hasher := sha256.New()
|
||||||
|
addrStr, err := ac.BytesToString(id.from.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
str := fmt.Sprintf("%s:%d:%d", addrStr, id.accnum, id.seqnum)
|
||||||
|
hasher.Write([]byte(str))
|
||||||
|
return hex.EncodeToString(hasher.Sum(nil))
|
||||||
|
}
|
||||||
|
33
x/nitrobank/keeper/msg_server.go
Normal file
33
x/nitrobank/keeper/msg_server.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package keeper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"cosmossdk.io/core/event"
|
||||||
|
"git.vdb.to/cerc-io/laconicd/x/nitrobank"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewMsgServer(k Keeper) *msgServer {
|
||||||
|
return &msgServer{k}
|
||||||
|
}
|
||||||
|
|
||||||
|
type msgServer struct {
|
||||||
|
k Keeper
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m msgServer) ProposeChannel(ctx context.Context, req *nitrobank.MsgProposeChannel) (*nitrobank.MsgProposeChannelResponse, error) {
|
||||||
|
if err := m.k.ProposeChannel(ctx, req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
eventManager := m.k.EventService.EventManager(ctx)
|
||||||
|
if err := eventManager.EmitKV(
|
||||||
|
"channel_proposal",
|
||||||
|
event.NewAttribute("from", req.FromAddress),
|
||||||
|
// event.NewAttribute("to", req.ToAddress),
|
||||||
|
event.NewAttribute("funds", req.Funds.String()),
|
||||||
|
); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &nitrobank.MsgProposeChannelResponse{}, nil
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package nitrobank
|
package nitrobank
|
||||||
|
|
||||||
// import "cosmossdk.io/collections"
|
import "cosmossdk.io/collections"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ModuleName = "nitrobank"
|
ModuleName = "nitrobank"
|
||||||
@ -11,5 +11,7 @@ const (
|
|||||||
|
|
||||||
// Store prefixes
|
// Store prefixes
|
||||||
var (
|
var (
|
||||||
// ParamsPrefix = collections.NewPrefix(0)
|
ParamsPrefix = collections.NewPrefix(0)
|
||||||
|
|
||||||
|
ChannelProposalsPrefix = collections.NewPrefix(1)
|
||||||
)
|
)
|
||||||
|
@ -6,6 +6,8 @@ package nitrobank
|
|||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
fmt "fmt"
|
fmt "fmt"
|
||||||
|
github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
types "github.com/cosmos/cosmos-sdk/types"
|
||||||
_ "github.com/cosmos/cosmos-sdk/types/msgservice"
|
_ "github.com/cosmos/cosmos-sdk/types/msgservice"
|
||||||
_ "github.com/cosmos/gogoproto/gogoproto"
|
_ "github.com/cosmos/gogoproto/gogoproto"
|
||||||
grpc1 "github.com/cosmos/gogoproto/grpc"
|
grpc1 "github.com/cosmos/gogoproto/grpc"
|
||||||
@ -215,10 +217,9 @@ var xxx_messageInfo_MsgOpenChannelResponse proto.InternalMessageInfo
|
|||||||
type MsgProposeChannel struct {
|
type MsgProposeChannel struct {
|
||||||
// Nitro address of sending party (payer)
|
// Nitro address of sending party (payer)
|
||||||
FromAddress string `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"`
|
FromAddress string `protobuf:"bytes,1,opt,name=from_address,json=fromAddress,proto3" json:"from_address,omitempty"`
|
||||||
// Nitro address of counterparty
|
|
||||||
ToAddress string `protobuf:"bytes,2,opt,name=to_address,json=toAddress,proto3" json:"to_address,omitempty"`
|
|
||||||
// Simplified outcome just includes the funding amount from payer
|
// Simplified outcome just includes the funding amount from payer
|
||||||
Amount string `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount,omitempty"`
|
// TODO: review use of coins to represent ETH/ERC20
|
||||||
|
Funds github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=funds,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"funds"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MsgProposeChannel) Reset() { *m = MsgProposeChannel{} }
|
func (m *MsgProposeChannel) Reset() { *m = MsgProposeChannel{} }
|
||||||
@ -261,18 +262,11 @@ func (m *MsgProposeChannel) GetFromAddress() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MsgProposeChannel) GetToAddress() string {
|
func (m *MsgProposeChannel) GetFunds() github_com_cosmos_cosmos_sdk_types.Coins {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.ToAddress
|
return m.Funds
|
||||||
}
|
}
|
||||||
return ""
|
return nil
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MsgProposeChannel) GetAmount() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Amount
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type MsgProposeChannelResponse struct {
|
type MsgProposeChannelResponse struct {
|
||||||
@ -323,32 +317,38 @@ func init() {
|
|||||||
func init() { proto.RegisterFile("cerc/nitrobank/v1/tx.proto", fileDescriptor_7647fae54567b5bd) }
|
func init() { proto.RegisterFile("cerc/nitrobank/v1/tx.proto", fileDescriptor_7647fae54567b5bd) }
|
||||||
|
|
||||||
var fileDescriptor_7647fae54567b5bd = []byte{
|
var fileDescriptor_7647fae54567b5bd = []byte{
|
||||||
// 400 bytes of a gzipped FileDescriptorProto
|
// 481 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x92, 0xc1, 0x6a, 0x1a, 0x41,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x4f, 0x4f, 0x13, 0x41,
|
||||||
0x18, 0xc7, 0x1d, 0xa5, 0x82, 0x53, 0x2b, 0xb8, 0x14, 0x6b, 0xb7, 0xed, 0x52, 0xb7, 0x42, 0x8b,
|
0x14, 0xef, 0xd0, 0x40, 0xc2, 0x80, 0x24, 0xdd, 0x18, 0x2c, 0x55, 0x17, 0x59, 0x49, 0x6c, 0x1a,
|
||||||
0xb4, 0x3b, 0xd8, 0xd2, 0x4b, 0x6f, 0xb6, 0xa7, 0x1e, 0xa4, 0xc5, 0x63, 0x2f, 0x32, 0xce, 0x4e,
|
0x99, 0xb1, 0x18, 0x2f, 0xde, 0x0a, 0x27, 0x0f, 0x8d, 0xa6, 0x47, 0x2f, 0x64, 0x76, 0x76, 0x18,
|
||||||
0x27, 0x4b, 0xdc, 0xf9, 0x96, 0x9d, 0x89, 0x78, 0x09, 0x88, 0x4f, 0x20, 0xe4, 0x01, 0xf2, 0x0a,
|
0x26, 0x74, 0xe7, 0x6d, 0x76, 0xa6, 0x0d, 0x1e, 0x4c, 0x0c, 0x9f, 0x80, 0xc4, 0x0f, 0xe0, 0xdd,
|
||||||
0x3e, 0x46, 0x8e, 0x42, 0x2e, 0x39, 0x06, 0x0d, 0xf8, 0x1a, 0x61, 0xc7, 0x55, 0xa3, 0x7b, 0xc9,
|
0x78, 0xe0, 0x63, 0x70, 0x24, 0xf1, 0xe2, 0x49, 0x4d, 0x6b, 0xc2, 0xd7, 0x30, 0x3b, 0x3b, 0xb4,
|
||||||
0x2d, 0xb7, 0xd9, 0xef, 0xff, 0xff, 0x7e, 0xff, 0x3f, 0xcb, 0x87, 0x6d, 0xc6, 0x63, 0x46, 0x64,
|
0xc2, 0x7a, 0xd0, 0xd3, 0xce, 0xbe, 0xdf, 0x7b, 0xbf, 0xdf, 0xef, 0xfd, 0xc1, 0x2d, 0x2e, 0x72,
|
||||||
0xa0, 0x63, 0x18, 0x50, 0x79, 0x4a, 0x46, 0x6d, 0xa2, 0xc7, 0x5e, 0x14, 0x83, 0x06, 0xab, 0x9a,
|
0x4e, 0xb5, 0xb2, 0x39, 0xc4, 0x4c, 0x1f, 0xd3, 0x71, 0x97, 0xda, 0x13, 0x92, 0xe5, 0x60, 0x21,
|
||||||
0x68, 0xde, 0x4e, 0xf3, 0x46, 0x6d, 0xfb, 0x15, 0x03, 0x15, 0x82, 0x22, 0xa1, 0x12, 0x89, 0x35,
|
0x68, 0x14, 0x18, 0x99, 0x61, 0x64, 0xdc, 0x6d, 0x3d, 0x90, 0x00, 0x72, 0x28, 0x28, 0xcb, 0x14,
|
||||||
0x54, 0x62, 0xe3, 0xb5, 0x5f, 0x0a, 0x10, 0x60, 0x9e, 0x24, 0x79, 0xa5, 0xd3, 0xb7, 0x02, 0x40,
|
0x65, 0x5a, 0x83, 0x65, 0x56, 0x81, 0x36, 0x65, 0x41, 0xeb, 0xae, 0x04, 0x09, 0xee, 0x49, 0x8b,
|
||||||
0x0c, 0x39, 0xa1, 0x51, 0x40, 0xa8, 0x94, 0xa0, 0xa9, 0x0e, 0x40, 0xaa, 0x54, 0x6d, 0x64, 0xb3,
|
0x97, 0x8f, 0x86, 0x1c, 0x4c, 0x0a, 0x86, 0xc6, 0xcc, 0x08, 0x3a, 0xee, 0xc6, 0xc2, 0xb2, 0x2e,
|
||||||
0xf7, 0x61, 0xc6, 0xe2, 0x7e, 0xc7, 0x95, 0xae, 0x12, 0xbf, 0x65, 0xa0, 0x3b, 0x8c, 0xc1, 0x99,
|
0xe5, 0xa0, 0xb4, 0xc7, 0xef, 0x79, 0x3c, 0x35, 0xb2, 0x90, 0x4f, 0x8d, 0xf4, 0xc0, 0x56, 0xd5,
|
||||||
0xd4, 0xd6, 0x07, 0xfc, 0xc2, 0x98, 0xfa, 0xd4, 0xf7, 0x63, 0xae, 0x54, 0x1d, 0xbd, 0x47, 0x9f,
|
0xdb, 0xdc, 0x8c, 0x4b, 0x89, 0x5e, 0xe0, 0xb5, 0xbe, 0x91, 0xaf, 0xb4, 0xb2, 0x3d, 0xce, 0x61,
|
||||||
0x4a, 0xbd, 0xb2, 0x19, 0x76, 0x36, 0x33, 0xb7, 0x8e, 0x6b, 0x87, 0x6b, 0x3d, 0xae, 0x22, 0x90,
|
0xa4, 0x6d, 0xf0, 0x18, 0xdf, 0x71, 0x49, 0x07, 0x2c, 0x49, 0x72, 0x61, 0x4c, 0x13, 0x3d, 0x42,
|
||||||
0x8a, 0xbb, 0xe7, 0x06, 0xf8, 0x27, 0xe2, 0xf2, 0xd7, 0x09, 0x95, 0x92, 0x0f, 0xad, 0x06, 0x2e,
|
0xed, 0xe5, 0xc1, 0xaa, 0x0b, 0xf6, 0xca, 0x58, 0xd4, 0xc4, 0xeb, 0x37, 0xcb, 0x06, 0xc2, 0x64,
|
||||||
0xff, 0x8f, 0x21, 0x3c, 0xe2, 0x3d, 0x4f, 0x66, 0x29, 0xce, 0x7a, 0x87, 0xb1, 0xde, 0x07, 0xe6,
|
0xa0, 0x8d, 0x88, 0xde, 0x3b, 0xc2, 0xd7, 0x99, 0xd0, 0xfb, 0x47, 0x4c, 0x6b, 0x31, 0x0c, 0xb6,
|
||||||
0x8d, 0xa1, 0xa4, 0xb7, 0x69, 0x56, 0x0d, 0x17, 0x69, 0x98, 0xa4, 0xd4, 0x0b, 0x46, 0x4a, 0xbf,
|
0xf0, 0xea, 0x61, 0x0e, 0xe9, 0x2d, 0xbe, 0x95, 0x22, 0xe6, 0xe9, 0x82, 0x87, 0x18, 0xdb, 0xb9,
|
||||||
0x7e, 0x54, 0xa7, 0xeb, 0x79, 0xeb, 0x00, 0x9e, 0x16, 0x7b, 0x10, 0xbf, 0x2b, 0x36, 0x41, 0xb8,
|
0xe0, 0x82, 0x4b, 0x58, 0xb6, 0xd7, 0x6a, 0xc1, 0x3a, 0x5e, 0x62, 0x69, 0xa1, 0xd2, 0xac, 0x3b,
|
||||||
0xda, 0x55, 0xe2, 0x6f, 0x0c, 0x11, 0x28, 0xfe, 0x24, 0xe5, 0xde, 0xe0, 0xd7, 0x99, 0x06, 0xdb,
|
0xc8, 0xff, 0xbd, 0x6c, 0x9c, 0x5e, 0x9d, 0x77, 0x6e, 0x90, 0x7b, 0x63, 0x7f, 0xc8, 0xcf, 0x8c,
|
||||||
0x7e, 0x5f, 0x2f, 0x11, 0x2e, 0x74, 0x95, 0xb0, 0x66, 0x08, 0x57, 0x8e, 0x4a, 0x36, 0xbd, 0xcc,
|
0x7d, 0x41, 0xb8, 0xd1, 0x37, 0xf2, 0x4d, 0x0e, 0x19, 0x18, 0xf1, 0x1f, 0xe6, 0x18, 0x5e, 0x3c,
|
||||||
0xa1, 0x78, 0x19, 0x90, 0xfd, 0xf9, 0x31, 0xae, 0xdd, 0xef, 0x68, 0x4d, 0xaf, 0xef, 0x2e, 0xf2,
|
0x1c, 0xe9, 0xa4, 0xf0, 0x55, 0x6f, 0xaf, 0xec, 0x6e, 0x90, 0x72, 0xdc, 0xa4, 0x58, 0x07, 0xf1,
|
||||||
0x4d, 0xd7, 0x25, 0xd9, 0x23, 0x89, 0x36, 0x2b, 0x7d, 0x96, 0x92, 0x9f, 0x4d, 0xd6, 0xf3, 0x16,
|
0xeb, 0x20, 0xfb, 0xa0, 0xf4, 0xde, 0xb3, 0x8b, 0xef, 0x9b, 0xb5, 0xcf, 0x3f, 0x36, 0xdb, 0x52,
|
||||||
0xfa, 0xd9, 0xb9, 0x5a, 0x3a, 0x68, 0xb1, 0x74, 0xd0, 0xed, 0xd2, 0x41, 0xb3, 0x95, 0x93, 0x5b,
|
0xd9, 0xa3, 0x51, 0x4c, 0x38, 0xa4, 0xd4, 0xef, 0xa6, 0xfc, 0xec, 0x98, 0xe4, 0x98, 0xda, 0x77,
|
||||||
0xac, 0x9c, 0xdc, 0xcd, 0xca, 0xc9, 0xfd, 0xfb, 0x28, 0x02, 0xed, 0x8d, 0xfc, 0x81, 0xa7, 0xc1,
|
0x99, 0x30, 0xae, 0xc0, 0x0c, 0x4a, 0xe6, 0xbf, 0x35, 0x72, 0x1f, 0x6f, 0x54, 0xdc, 0x5e, 0xf7,
|
||||||
0xe0, 0xbe, 0x04, 0x40, 0x86, 0x94, 0x81, 0x0c, 0x98, 0x4f, 0xc6, 0x7b, 0xf8, 0xa0, 0x68, 0xae,
|
0xb2, 0xfb, 0x09, 0xe1, 0x7a, 0xdf, 0xc8, 0xe0, 0x0c, 0xe1, 0xb5, 0x5b, 0x0d, 0x6d, 0x93, 0xca,
|
||||||
0xee, 0xdb, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x95, 0xda, 0x82, 0x16, 0x03, 0x00, 0x00,
|
0xd1, 0x91, 0x0a, 0x51, 0xeb, 0xe9, 0xbf, 0x64, 0xcd, 0x46, 0xd7, 0x39, 0xfd, 0xfa, 0xeb, 0xe3,
|
||||||
|
0xc2, 0x76, 0x14, 0xd1, 0xea, 0x41, 0x65, 0x65, 0xc9, 0x01, 0xf7, 0xcc, 0x8b, 0x1f, 0xae, 0xce,
|
||||||
|
0x3b, 0x68, 0xaf, 0x77, 0x31, 0x09, 0xd1, 0xe5, 0x24, 0x44, 0x3f, 0x27, 0x21, 0x3a, 0x9b, 0x86,
|
||||||
|
0xb5, 0xcb, 0x69, 0x58, 0xfb, 0x36, 0x0d, 0x6b, 0x6f, 0x9f, 0x48, 0x65, 0xc9, 0x38, 0x89, 0x89,
|
||||||
|
0x05, 0x47, 0xb7, 0xa3, 0x80, 0x0e, 0x19, 0x07, 0xad, 0x78, 0x42, 0x4f, 0xe6, 0xe4, 0xf1, 0x92,
|
||||||
|
0xbb, 0xd0, 0xe7, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x95, 0xea, 0x36, 0x46, 0x62, 0x03, 0x00,
|
||||||
|
0x00,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
@ -572,19 +572,19 @@ func (m *MsgProposeChannel) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||||||
_ = i
|
_ = i
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
if len(m.Amount) > 0 {
|
if len(m.Funds) > 0 {
|
||||||
i -= len(m.Amount)
|
for iNdEx := len(m.Funds) - 1; iNdEx >= 0; iNdEx-- {
|
||||||
copy(dAtA[i:], m.Amount)
|
{
|
||||||
i = encodeVarintTx(dAtA, i, uint64(len(m.Amount)))
|
size, err := m.Funds[iNdEx].MarshalToSizedBuffer(dAtA[:i])
|
||||||
i--
|
if err != nil {
|
||||||
dAtA[i] = 0x1a
|
return 0, err
|
||||||
}
|
}
|
||||||
if len(m.ToAddress) > 0 {
|
i -= size
|
||||||
i -= len(m.ToAddress)
|
i = encodeVarintTx(dAtA, i, uint64(size))
|
||||||
copy(dAtA[i:], m.ToAddress)
|
}
|
||||||
i = encodeVarintTx(dAtA, i, uint64(len(m.ToAddress)))
|
i--
|
||||||
i--
|
dAtA[i] = 0x12
|
||||||
dAtA[i] = 0x12
|
}
|
||||||
}
|
}
|
||||||
if len(m.FromAddress) > 0 {
|
if len(m.FromAddress) > 0 {
|
||||||
i -= len(m.FromAddress)
|
i -= len(m.FromAddress)
|
||||||
@ -692,13 +692,11 @@ func (m *MsgProposeChannel) Size() (n int) {
|
|||||||
if l > 0 {
|
if l > 0 {
|
||||||
n += 1 + l + sovTx(uint64(l))
|
n += 1 + l + sovTx(uint64(l))
|
||||||
}
|
}
|
||||||
l = len(m.ToAddress)
|
if len(m.Funds) > 0 {
|
||||||
if l > 0 {
|
for _, e := range m.Funds {
|
||||||
n += 1 + l + sovTx(uint64(l))
|
l = e.Size()
|
||||||
}
|
n += 1 + l + sovTx(uint64(l))
|
||||||
l = len(m.Amount)
|
}
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovTx(uint64(l))
|
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
@ -1109,9 +1107,9 @@ func (m *MsgProposeChannel) Unmarshal(dAtA []byte) error {
|
|||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
case 2:
|
case 2:
|
||||||
if wireType != 2 {
|
if wireType != 2 {
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field ToAddress", wireType)
|
return fmt.Errorf("proto: wrong wireType = %d for field Funds", wireType)
|
||||||
}
|
}
|
||||||
var stringLen uint64
|
var msglen int
|
||||||
for shift := uint(0); ; shift += 7 {
|
for shift := uint(0); ; shift += 7 {
|
||||||
if shift >= 64 {
|
if shift >= 64 {
|
||||||
return ErrIntOverflowTx
|
return ErrIntOverflowTx
|
||||||
@ -1121,55 +1119,25 @@ func (m *MsgProposeChannel) Unmarshal(dAtA []byte) error {
|
|||||||
}
|
}
|
||||||
b := dAtA[iNdEx]
|
b := dAtA[iNdEx]
|
||||||
iNdEx++
|
iNdEx++
|
||||||
stringLen |= uint64(b&0x7F) << shift
|
msglen |= int(b&0x7F) << shift
|
||||||
if b < 0x80 {
|
if b < 0x80 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
intStringLen := int(stringLen)
|
if msglen < 0 {
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthTx
|
return ErrInvalidLengthTx
|
||||||
}
|
}
|
||||||
postIndex := iNdEx + intStringLen
|
postIndex := iNdEx + msglen
|
||||||
if postIndex < 0 {
|
if postIndex < 0 {
|
||||||
return ErrInvalidLengthTx
|
return ErrInvalidLengthTx
|
||||||
}
|
}
|
||||||
if postIndex > l {
|
if postIndex > l {
|
||||||
return io.ErrUnexpectedEOF
|
return io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
m.ToAddress = string(dAtA[iNdEx:postIndex])
|
m.Funds = append(m.Funds, types.Coin{})
|
||||||
iNdEx = postIndex
|
if err := m.Funds[len(m.Funds)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
case 3:
|
return err
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType)
|
|
||||||
}
|
}
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowTx
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= uint64(b&0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthTx
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex < 0 {
|
|
||||||
return ErrInvalidLengthTx
|
|
||||||
}
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Amount = string(dAtA[iNdEx:postIndex])
|
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
default:
|
default:
|
||||||
iNdEx = preIndex
|
iNdEx = preIndex
|
||||||
|
Loading…
Reference in New Issue
Block a user