Setup hooks wiring between auction and registry modules with depinject
This commit is contained in:
parent
0c529ee1f7
commit
590a060221
@ -76,7 +76,7 @@ type LaconicApp struct {
|
|||||||
ConsensusParamsKeeper consensuskeeper.Keeper
|
ConsensusParamsKeeper consensuskeeper.Keeper
|
||||||
|
|
||||||
// laconic keepers
|
// laconic keepers
|
||||||
AuctionKeeper auctionkeeper.Keeper
|
AuctionKeeper *auctionkeeper.Keeper // (Use * as per ProvideModule implementation)
|
||||||
BondKeeper bondkeeper.Keeper
|
BondKeeper bondkeeper.Keeper
|
||||||
RegistryKeeper registrykeeper.Keeper
|
RegistryKeeper registrykeeper.Keeper
|
||||||
// RegistryRecordKeeper registrykeeper.RecordKeeper
|
// RegistryRecordKeeper registrykeeper.RecordKeeper
|
||||||
|
23
x/auction/expected_keepers.go
Normal file
23
x/auction/expected_keepers.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package auction
|
||||||
|
|
||||||
|
import (
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AuctionUsageKeeper keep track of auction usage in other modules.
|
||||||
|
// Used to, for example, prevent deletion of a auction that's in use.
|
||||||
|
type AuctionUsageKeeper interface {
|
||||||
|
ModuleName() string
|
||||||
|
UsesAuction(ctx sdk.Context, auctionID string) bool
|
||||||
|
|
||||||
|
OnAuction(ctx sdk.Context, auctionID string)
|
||||||
|
OnAuctionBid(ctx sdk.Context, auctionID string, bidderAddress string)
|
||||||
|
OnAuctionWinnerSelected(ctx sdk.Context, auctionID string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AuctionHooksWrapper is a wrapper for modules to inject AuctionUsageKeeper using depinject.
|
||||||
|
// Reference: https://github.com/cosmos/cosmos-sdk/tree/v0.50.3/core/appmodule#resolving-circular-dependencies
|
||||||
|
type AuctionHooksWrapper struct{ AuctionUsageKeeper }
|
||||||
|
|
||||||
|
// IsOnePerModuleType implements the depinject.OnePerModuleType interface.
|
||||||
|
func (AuctionHooksWrapper) IsOnePerModuleType() {}
|
@ -73,7 +73,7 @@ type Keeper struct {
|
|||||||
bankKeeper bank.Keeper
|
bankKeeper bank.Keeper
|
||||||
|
|
||||||
// Track auction usage in other cosmos-sdk modules (more like a usage tracker).
|
// Track auction usage in other cosmos-sdk modules (more like a usage tracker).
|
||||||
// usageKeepers []types.AuctionUsageKeeper
|
usageKeepers []auctiontypes.AuctionUsageKeeper
|
||||||
|
|
||||||
// state management
|
// state management
|
||||||
Schema collections.Schema
|
Schema collections.Schema
|
||||||
@ -88,7 +88,7 @@ func NewKeeper(
|
|||||||
storeService storetypes.KVStoreService,
|
storeService storetypes.KVStoreService,
|
||||||
accountKeeper auth.AccountKeeper,
|
accountKeeper auth.AccountKeeper,
|
||||||
bankKeeper bank.Keeper,
|
bankKeeper bank.Keeper,
|
||||||
) Keeper {
|
) *Keeper {
|
||||||
sb := collections.NewSchemaBuilder(storeService)
|
sb := collections.NewSchemaBuilder(storeService)
|
||||||
k := Keeper{
|
k := Keeper{
|
||||||
cdc: cdc,
|
cdc: cdc,
|
||||||
@ -97,7 +97,7 @@ func NewKeeper(
|
|||||||
Params: collections.NewItem(sb, auctiontypes.ParamsPrefix, "params", codec.CollValue[auctiontypes.Params](cdc)),
|
Params: collections.NewItem(sb, auctiontypes.ParamsPrefix, "params", codec.CollValue[auctiontypes.Params](cdc)),
|
||||||
Auctions: collections.NewIndexedMap(sb, auctiontypes.AuctionsPrefix, "auctions", collections.StringKey, codec.CollValue[auctiontypes.Auction](cdc), newAuctionIndexes(sb)),
|
Auctions: collections.NewIndexedMap(sb, auctiontypes.AuctionsPrefix, "auctions", collections.StringKey, codec.CollValue[auctiontypes.Auction](cdc), newAuctionIndexes(sb)),
|
||||||
Bids: collections.NewIndexedMap(sb, auctiontypes.BidsPrefix, "bids", collections.PairKeyCodec(collections.StringKey, collections.StringKey), codec.CollValue[auctiontypes.Bid](cdc), newBidsIndexes(sb)),
|
Bids: collections.NewIndexedMap(sb, auctiontypes.BidsPrefix, "bids", collections.PairKeyCodec(collections.StringKey, collections.StringKey), codec.CollValue[auctiontypes.Bid](cdc), newBidsIndexes(sb)),
|
||||||
// usageKeepers: usageKeepers,
|
usageKeepers: nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
schema, err := sb.Build()
|
schema, err := sb.Build()
|
||||||
@ -107,12 +107,16 @@ func NewKeeper(
|
|||||||
|
|
||||||
k.Schema = schema
|
k.Schema = schema
|
||||||
|
|
||||||
return k
|
return &k
|
||||||
}
|
}
|
||||||
|
|
||||||
// func (k *Keeper) SetUsageKeepers(usageKeepers []types.AuctionUsageKeeper) {
|
func (k *Keeper) SetUsageKeepers(usageKeepers []auctiontypes.AuctionUsageKeeper) {
|
||||||
// k.usageKeepers = usageKeepers
|
if k.usageKeepers != nil {
|
||||||
// }
|
panic("cannot set auction hooks twice")
|
||||||
|
}
|
||||||
|
|
||||||
|
k.usageKeepers = usageKeepers
|
||||||
|
}
|
||||||
|
|
||||||
// SaveAuction - saves a auction to the store.
|
// SaveAuction - saves a auction to the store.
|
||||||
func (k Keeper) SaveAuction(ctx sdk.Context, auction *auctiontypes.Auction) error {
|
func (k Keeper) SaveAuction(ctx sdk.Context, auction *auctiontypes.Auction) error {
|
||||||
|
@ -10,11 +10,11 @@ import (
|
|||||||
var _ auctiontypes.MsgServer = msgServer{}
|
var _ auctiontypes.MsgServer = msgServer{}
|
||||||
|
|
||||||
type msgServer struct {
|
type msgServer struct {
|
||||||
k Keeper
|
k *Keeper
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMsgServerImpl returns an implementation of the module MsgServer interface.
|
// NewMsgServerImpl returns an implementation of the module MsgServer interface.
|
||||||
func NewMsgServerImpl(keeper Keeper) auctiontypes.MsgServer {
|
func NewMsgServerImpl(keeper *Keeper) auctiontypes.MsgServer {
|
||||||
return &msgServer{k: keeper}
|
return &msgServer{k: keeper}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,11 +13,11 @@ import (
|
|||||||
var _ auctiontypes.QueryServer = queryServer{}
|
var _ auctiontypes.QueryServer = queryServer{}
|
||||||
|
|
||||||
type queryServer struct {
|
type queryServer struct {
|
||||||
k Keeper
|
k *Keeper
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewQueryServerImpl returns an implementation of the module QueryServer.
|
// NewQueryServerImpl returns an implementation of the module QueryServer.
|
||||||
func NewQueryServerImpl(k Keeper) auctiontypes.QueryServer {
|
func NewQueryServerImpl(k *Keeper) auctiontypes.QueryServer {
|
||||||
return queryServer{k}
|
return queryServer{k}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// EndBlocker is called every block
|
// EndBlocker is called every block
|
||||||
func EndBlocker(ctx context.Context, k keeper.Keeper) error {
|
func EndBlocker(ctx context.Context, k *keeper.Keeper) error {
|
||||||
sdkCtx := sdk.UnwrapSDKContext(ctx)
|
sdkCtx := sdk.UnwrapSDKContext(ctx)
|
||||||
|
|
||||||
return k.EndBlockerProcessAuctions(sdkCtx)
|
return k.EndBlockerProcessAuctions(sdkCtx)
|
||||||
|
@ -4,12 +4,14 @@ import (
|
|||||||
"cosmossdk.io/core/appmodule"
|
"cosmossdk.io/core/appmodule"
|
||||||
"cosmossdk.io/core/store"
|
"cosmossdk.io/core/store"
|
||||||
"cosmossdk.io/depinject"
|
"cosmossdk.io/depinject"
|
||||||
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
auth "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
auth "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||||
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||||
|
|
||||||
modulev1 "git.vdb.to/cerc-io/laconic2d/api/cerc/auction/module/v1"
|
modulev1 "git.vdb.to/cerc-io/laconic2d/api/cerc/auction/module/v1"
|
||||||
|
"git.vdb.to/cerc-io/laconic2d/x/auction"
|
||||||
"git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
"git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -25,6 +27,7 @@ func init() {
|
|||||||
appmodule.Register(
|
appmodule.Register(
|
||||||
&modulev1.Module{},
|
&modulev1.Module{},
|
||||||
appmodule.Provide(ProvideModule),
|
appmodule.Provide(ProvideModule),
|
||||||
|
appmodule.Invoke(InvokeSetAuctionHooks),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +44,11 @@ type ModuleInputs struct {
|
|||||||
type ModuleOutputs struct {
|
type ModuleOutputs struct {
|
||||||
depinject.Out
|
depinject.Out
|
||||||
|
|
||||||
Keeper keeper.Keeper
|
// Use * as required by InvokeSetAuctionHooks
|
||||||
|
// https://github.com/cosmos/cosmos-sdk/tree/v0.50.3/core/appmodule#invoker-invocation-details
|
||||||
|
// https://github.com/cosmos/cosmos-sdk/tree/v0.50.3/core/appmodule#regular-golang-types
|
||||||
|
Keeper *keeper.Keeper
|
||||||
|
|
||||||
Module appmodule.AppModule
|
Module appmodule.AppModule
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,3 +58,25 @@ func ProvideModule(in ModuleInputs) ModuleOutputs {
|
|||||||
|
|
||||||
return ModuleOutputs{Module: m, Keeper: k}
|
return ModuleOutputs{Module: m, Keeper: k}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func InvokeSetAuctionHooks(
|
||||||
|
config *modulev1.Module,
|
||||||
|
keeper *keeper.Keeper,
|
||||||
|
auctionHooks map[string]auction.AuctionHooksWrapper,
|
||||||
|
) error {
|
||||||
|
// all arguments to invokers are optional
|
||||||
|
if keeper == nil || config == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var usageKeepers []auction.AuctionUsageKeeper
|
||||||
|
|
||||||
|
for _, modName := range maps.Keys(auctionHooks) {
|
||||||
|
hook := auctionHooks[modName]
|
||||||
|
usageKeepers = append(usageKeepers, hook)
|
||||||
|
}
|
||||||
|
|
||||||
|
keeper.SetUsageKeepers(usageKeepers)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -36,11 +36,11 @@ const ConsensusVersion = 1
|
|||||||
|
|
||||||
type AppModule struct {
|
type AppModule struct {
|
||||||
cdc codec.Codec
|
cdc codec.Codec
|
||||||
keeper keeper.Keeper
|
keeper *keeper.Keeper
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewAppModule creates a new AppModule object
|
// NewAppModule creates a new AppModule object
|
||||||
func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule {
|
func NewAppModule(cdc codec.Codec, keeper *keeper.Keeper) AppModule {
|
||||||
return AppModule{
|
return AppModule{
|
||||||
cdc: cdc,
|
cdc: cdc,
|
||||||
keeper: keeper,
|
keeper: keeper,
|
||||||
|
@ -89,7 +89,7 @@ type Keeper struct {
|
|||||||
bankKeeper bank.Keeper
|
bankKeeper bank.Keeper
|
||||||
recordKeeper RecordKeeper
|
recordKeeper RecordKeeper
|
||||||
bondKeeper bondkeeper.Keeper
|
bondKeeper bondkeeper.Keeper
|
||||||
auctionKeeper auctionkeeper.Keeper
|
auctionKeeper *auctionkeeper.Keeper
|
||||||
|
|
||||||
// state management
|
// state management
|
||||||
Schema collections.Schema
|
Schema collections.Schema
|
||||||
@ -109,7 +109,7 @@ func NewKeeper(
|
|||||||
bankKeeper bank.Keeper,
|
bankKeeper bank.Keeper,
|
||||||
recordKeeper RecordKeeper,
|
recordKeeper RecordKeeper,
|
||||||
bondKeeper bondkeeper.Keeper,
|
bondKeeper bondkeeper.Keeper,
|
||||||
auctionKeeper auctionkeeper.Keeper,
|
auctionKeeper *auctionkeeper.Keeper,
|
||||||
) Keeper {
|
) Keeper {
|
||||||
sb := collections.NewSchemaBuilder(storeService)
|
sb := collections.NewSchemaBuilder(storeService)
|
||||||
k := Keeper{
|
k := Keeper{
|
||||||
|
@ -8,19 +8,55 @@ import (
|
|||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||||
|
|
||||||
|
auctiontypes "git.vdb.to/cerc-io/laconic2d/x/auction"
|
||||||
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
||||||
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: Add methods
|
// TODO: Add methods
|
||||||
|
|
||||||
|
// Record keeper implements the bond usage keeper interface.
|
||||||
|
var (
|
||||||
|
_ auctiontypes.AuctionUsageKeeper = RecordKeeper{}
|
||||||
|
// _ bondtypes.BondUsageKeeper = (*RecordKeeper)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
// RecordKeeper exposes the bare minimal read-only API for other modules.
|
// RecordKeeper exposes the bare minimal read-only API for other modules.
|
||||||
type RecordKeeper struct {
|
type RecordKeeper struct {
|
||||||
cdc codec.BinaryCodec // The wire codec for binary encoding/decoding.
|
cdc codec.BinaryCodec // The wire codec for binary encoding/decoding.
|
||||||
auctionKeeper auctionkeeper.Keeper
|
auctionKeeper *auctionkeeper.Keeper
|
||||||
// storeKey storetypes.StoreKey // Unexposed key to access store from sdk.Context
|
// storeKey storetypes.StoreKey // Unexposed key to access store from sdk.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewRecordKeeper creates new instances of the registry RecordKeeper
|
||||||
|
func NewRecordKeeper(cdc codec.BinaryCodec, auctionKeeper *auctionkeeper.Keeper) RecordKeeper {
|
||||||
|
return RecordKeeper{
|
||||||
|
auctionKeeper: auctionKeeper,
|
||||||
|
cdc: cdc,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ModuleName returns the module name.
|
||||||
|
func (k RecordKeeper) ModuleName() string {
|
||||||
|
return registrytypes.ModuleName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k RecordKeeper) UsesAuction(ctx sdk.Context, auctionID string) bool {
|
||||||
|
panic("unimplemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k RecordKeeper) OnAuction(ctx sdk.Context, auctionID string) {
|
||||||
|
panic("unimplemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k RecordKeeper) OnAuctionBid(ctx sdk.Context, auctionID string, bidderAddress string) {
|
||||||
|
panic("unimplemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k RecordKeeper) OnAuctionWinnerSelected(ctx sdk.Context, auctionID string) {
|
||||||
|
panic("unimplemented")
|
||||||
|
}
|
||||||
|
|
||||||
// RenewRecord renews a record.
|
// RenewRecord renews a record.
|
||||||
func (k Keeper) RenewRecord(ctx sdk.Context, msg registrytypes.MsgRenewRecord) error {
|
func (k Keeper) RenewRecord(ctx sdk.Context, msg registrytypes.MsgRenewRecord) error {
|
||||||
if has, err := k.HasRecord(ctx, msg.RecordId); !has {
|
if has, err := k.HasRecord(ctx, msg.RecordId); !has {
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||||
|
|
||||||
modulev1 "git.vdb.to/cerc-io/laconic2d/api/cerc/registry/module/v1"
|
modulev1 "git.vdb.to/cerc-io/laconic2d/api/cerc/registry/module/v1"
|
||||||
|
auction "git.vdb.to/cerc-io/laconic2d/x/auction"
|
||||||
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
||||||
bondkeeper "git.vdb.to/cerc-io/laconic2d/x/bond/keeper"
|
bondkeeper "git.vdb.to/cerc-io/laconic2d/x/bond/keeper"
|
||||||
"git.vdb.to/cerc-io/laconic2d/x/registry/keeper"
|
"git.vdb.to/cerc-io/laconic2d/x/registry/keeper"
|
||||||
@ -40,7 +41,7 @@ type ModuleInputs struct {
|
|||||||
BankKeeper bank.Keeper
|
BankKeeper bank.Keeper
|
||||||
|
|
||||||
BondKeeper bondkeeper.Keeper
|
BondKeeper bondkeeper.Keeper
|
||||||
AuctionKeeper auctionkeeper.Keeper
|
AuctionKeeper *auctionkeeper.Keeper
|
||||||
}
|
}
|
||||||
|
|
||||||
type ModuleOutputs struct {
|
type ModuleOutputs struct {
|
||||||
@ -48,19 +49,23 @@ type ModuleOutputs struct {
|
|||||||
|
|
||||||
Keeper keeper.Keeper
|
Keeper keeper.Keeper
|
||||||
Module appmodule.AppModule
|
Module appmodule.AppModule
|
||||||
|
|
||||||
|
AuctionHooks auction.AuctionHooksWrapper
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProvideModule(in ModuleInputs) ModuleOutputs {
|
func ProvideModule(in ModuleInputs) ModuleOutputs {
|
||||||
|
recordKeeper := keeper.NewRecordKeeper(in.Cdc, in.AuctionKeeper)
|
||||||
|
|
||||||
k := keeper.NewKeeper(
|
k := keeper.NewKeeper(
|
||||||
in.Cdc,
|
in.Cdc,
|
||||||
in.StoreService,
|
in.StoreService,
|
||||||
in.AccountKeeper,
|
in.AccountKeeper,
|
||||||
in.BankKeeper,
|
in.BankKeeper,
|
||||||
keeper.RecordKeeper{},
|
recordKeeper,
|
||||||
in.BondKeeper,
|
in.BondKeeper,
|
||||||
in.AuctionKeeper,
|
in.AuctionKeeper,
|
||||||
)
|
)
|
||||||
m := NewAppModule(in.Cdc, k)
|
m := NewAppModule(in.Cdc, k)
|
||||||
|
|
||||||
return ModuleOutputs{Module: m, Keeper: k}
|
return ModuleOutputs{Module: m, Keeper: k, AuctionHooks: auction.AuctionHooksWrapper{AuctionUsageKeeper: recordKeeper}}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user