[wip] nitro server

This commit is contained in:
Roy Crihfield 2025-02-08 20:49:48 +08:00
parent 01204261b7
commit 64d1a6d283
12 changed files with 335 additions and 143 deletions

View File

@ -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,

View File

@ -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,
) )
} }

View File

@ -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
View 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
}

View File

@ -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."`

View 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)
}

View File

@ -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)
}

View File

@ -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"))
}

View File

@ -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))
}

View 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
}

View File

@ -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)
) )

View File

@ -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