forked from cerc-io/laconicd
Add registry module commands to set and get records (#5)
Reviewed-on: deep-stack/laconic2d#5 Co-authored-by: Prathamesh Musale <prathamesh.musale0@gmail.com> Co-committed-by: Prathamesh Musale <prathamesh.musale0@gmail.com>
This commit is contained in:
+247
-4
@@ -1,19 +1,54 @@
|
||||
package keeper
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"cosmossdk.io/collections"
|
||||
"cosmossdk.io/collections/indexes"
|
||||
storetypes "cosmossdk.io/core/store"
|
||||
errorsmod "cosmossdk.io/errors"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
auth "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||
"github.com/gibson042/canonicaljson-go"
|
||||
"github.com/ipld/go-ipld-prime"
|
||||
"github.com/ipld/go-ipld-prime/codec/dagjson"
|
||||
"github.com/ipld/go-ipld-prime/node/basicnode"
|
||||
|
||||
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
||||
bondkeeper "git.vdb.to/cerc-io/laconic2d/x/bond/keeper"
|
||||
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
"git.vdb.to/cerc-io/laconic2d/x/registry/helpers"
|
||||
)
|
||||
|
||||
// TODO: Add required methods
|
||||
|
||||
type RecordsIndexes struct {
|
||||
BondId *indexes.Multi[string, string, registrytypes.Record]
|
||||
}
|
||||
|
||||
func (b RecordsIndexes) IndexesList() []collections.Index[string, registrytypes.Record] {
|
||||
return []collections.Index[string, registrytypes.Record]{b.BondId}
|
||||
}
|
||||
|
||||
func newRecordIndexes(sb *collections.SchemaBuilder) RecordsIndexes {
|
||||
return RecordsIndexes{
|
||||
BondId: indexes.NewMulti(
|
||||
sb, registrytypes.BondIdIndexPrefix, "records_by_bond_id",
|
||||
collections.StringKey, collections.StringKey,
|
||||
func(_ string, v registrytypes.Record) (string, error) {
|
||||
return v.BondId, nil
|
||||
},
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
type Keeper struct {
|
||||
cdc codec.BinaryCodec
|
||||
|
||||
@@ -24,8 +59,9 @@ type Keeper struct {
|
||||
auctionKeeper auctionkeeper.Keeper
|
||||
|
||||
// state management
|
||||
Schema collections.Schema
|
||||
Params collections.Item[registrytypes.Params]
|
||||
Schema collections.Schema
|
||||
Params collections.Item[registrytypes.Params]
|
||||
Records *collections.IndexedMap[string, registrytypes.Record, RecordsIndexes]
|
||||
}
|
||||
|
||||
// NewKeeper creates a new Keeper instance
|
||||
@@ -40,8 +76,14 @@ func NewKeeper(
|
||||
) Keeper {
|
||||
sb := collections.NewSchemaBuilder(storeService)
|
||||
k := Keeper{
|
||||
cdc: cdc,
|
||||
Params: collections.NewItem(sb, registrytypes.ParamsPrefix, "params", codec.CollValue[registrytypes.Params](cdc)),
|
||||
cdc: cdc,
|
||||
accountKeeper: accountKeeper,
|
||||
bankKeeper: bankKeeper,
|
||||
recordKeeper: recordKeeper,
|
||||
bondKeeper: bondKeeper,
|
||||
auctionKeeper: auctionKeeper,
|
||||
Params: collections.NewItem(sb, registrytypes.ParamsPrefix, "params", codec.CollValue[registrytypes.Params](cdc)),
|
||||
Records: collections.NewIndexedMap(sb, registrytypes.RecordsPrefix, "records", collections.StringKey, codec.CollValue[registrytypes.Record](cdc), newRecordIndexes(sb)),
|
||||
}
|
||||
|
||||
schema, err := sb.Build()
|
||||
@@ -53,3 +95,204 @@ func NewKeeper(
|
||||
|
||||
return k
|
||||
}
|
||||
|
||||
// HasRecord - checks if a record by the given id exists.
|
||||
func (k Keeper) HasRecord(ctx sdk.Context, id string) (bool, error) {
|
||||
has, err := k.Records.Has(ctx, id)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return has, nil
|
||||
}
|
||||
|
||||
// GetRecord - gets a record from the store.
|
||||
func (k Keeper) GetRecord(ctx sdk.Context, id string) (registrytypes.Record, error) {
|
||||
record, err := k.Records.Get(ctx, id)
|
||||
if err != nil {
|
||||
return registrytypes.Record{}, err
|
||||
}
|
||||
|
||||
return record, nil
|
||||
}
|
||||
|
||||
// ListRecords - get all records.
|
||||
func (k Keeper) ListRecords(ctx sdk.Context) ([]registrytypes.Record, error) {
|
||||
iter, err := k.Records.Iterate(ctx, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// TODO: Check if required
|
||||
// decodeRecordNames(store, &record)
|
||||
|
||||
return iter.Values()
|
||||
}
|
||||
|
||||
// RecordsFromAttributes gets a list of records whose attributes match all provided values
|
||||
func (k Keeper) RecordsFromAttributes(ctx sdk.Context, attributes []*registrytypes.QueryRecordsRequest_KeyValueInput, all bool) ([]registrytypes.Record, error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func (k Keeper) GetRecordExpiryQueue(ctx sdk.Context) []*registrytypes.ExpiryQueueRecord {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// PutRecord - saves a record to the store.
|
||||
func (k Keeper) SaveRecord(ctx sdk.Context, record registrytypes.Record) error {
|
||||
return k.Records.Set(ctx, record.Id, record)
|
||||
|
||||
// TODO
|
||||
// k.updateBlockChangeSetForRecord(ctx, record.Id)
|
||||
}
|
||||
|
||||
// ProcessSetRecord creates a record.
|
||||
func (k Keeper) SetRecord(ctx sdk.Context, msg registrytypes.MsgSetRecord) (*registrytypes.ReadableRecord, error) {
|
||||
payload := msg.Payload.ToReadablePayload()
|
||||
record := registrytypes.ReadableRecord{Attributes: payload.RecordAttributes, BondId: msg.BondId}
|
||||
|
||||
// Check signatures.
|
||||
resourceSignBytes, _ := record.GetSignBytes()
|
||||
cid, err := record.GetCid()
|
||||
if err != nil {
|
||||
return nil, errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "Invalid record JSON")
|
||||
}
|
||||
|
||||
record.Id = cid
|
||||
|
||||
has, err := k.HasRecord(ctx, record.Id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if has {
|
||||
// Immutable record already exists. No-op.
|
||||
return &record, nil
|
||||
}
|
||||
|
||||
record.Owners = []string{}
|
||||
for _, sig := range payload.Signatures {
|
||||
pubKey, err := legacy.PubKeyFromBytes(helpers.BytesFromBase64(sig.PubKey))
|
||||
if err != nil {
|
||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnauthorized, fmt.Sprint("Error decoding pubKey from bytes: ", err))
|
||||
}
|
||||
|
||||
sigOK := pubKey.VerifySignature(resourceSignBytes, helpers.BytesFromBase64(sig.Sig))
|
||||
if !sigOK {
|
||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnauthorized, fmt.Sprint("Signature mismatch: ", sig.PubKey))
|
||||
}
|
||||
record.Owners = append(record.Owners, pubKey.Address().String())
|
||||
}
|
||||
|
||||
// Sort owners list.
|
||||
sort.Strings(record.Owners)
|
||||
sdkErr := k.processRecord(ctx, &record, false)
|
||||
if sdkErr != nil {
|
||||
return nil, sdkErr
|
||||
}
|
||||
|
||||
return &record, nil
|
||||
}
|
||||
|
||||
func (k Keeper) processRecord(ctx sdk.Context, record *registrytypes.ReadableRecord, isRenewal bool) error {
|
||||
params, err := k.GetParams(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rent := params.RecordRent
|
||||
if err = k.bondKeeper.TransferCoinsToModuleAccount(
|
||||
ctx, record.BondId, registrytypes.RecordRentModuleAccountName, sdk.NewCoins(rent),
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
record.CreateTime = ctx.BlockHeader().Time.Format(time.RFC3339)
|
||||
record.ExpiryTime = ctx.BlockHeader().Time.Add(params.RecordRentDuration).Format(time.RFC3339)
|
||||
record.Deleted = false
|
||||
|
||||
recordObj, err := record.ToRecordObj()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Save record in store.
|
||||
if err = k.SaveRecord(ctx, recordObj); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO look up/validate record type here
|
||||
|
||||
if err := k.processAttributes(ctx, record.Attributes, record.Id, ""); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO
|
||||
// expiryTimeKey := GetAttributesIndexKey(ExpiryTimeAttributeName, []byte(record.ExpiryTime))
|
||||
// if err := k.SetAttributeMapping(ctx, expiryTimeKey, record.ID); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// k.InsertRecordExpiryQueue(ctx, recordObj)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k Keeper) processAttributes(ctx sdk.Context, attrs registrytypes.AttributeMap, id string, prefix string) error {
|
||||
np := basicnode.Prototype.Map
|
||||
nb := np.NewBuilder()
|
||||
encAttrs, err := canonicaljson.Marshal(attrs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(attrs) == 0 {
|
||||
encAttrs = []byte("{}")
|
||||
}
|
||||
err = dagjson.Decode(nb, bytes.NewReader(encAttrs))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to decode attributes: %w", err)
|
||||
}
|
||||
n := nb.Build()
|
||||
if n.Kind() != ipld.Kind_Map {
|
||||
return fmt.Errorf("record attributes must be a map, not %T", n.Kind())
|
||||
}
|
||||
|
||||
return k.processAttributeMap(ctx, n, id, prefix)
|
||||
}
|
||||
|
||||
func (k Keeper) processAttributeMap(ctx sdk.Context, n ipld.Node, id string, prefix string) error {
|
||||
for it := n.MapIterator(); !it.Done(); {
|
||||
//nolint:misspell
|
||||
keynode, valuenode, err := it.Next()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
key, err := keynode.AsString()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if valuenode.Kind() == ipld.Kind_Map {
|
||||
err := k.processAttributeMap(ctx, valuenode, id, key)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
var buf bytes.Buffer
|
||||
if err := dagjson.Encode(valuenode, &buf); err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO
|
||||
// value := buf.Bytes()
|
||||
// indexKey := GetAttributesIndexKey(prefix+key, value)
|
||||
// if err := k.SetAttributeMapping(ctx, indexKey, id); err != nil {
|
||||
// return err
|
||||
// }
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetModuleBalances gets the registry module account(s) balances.
|
||||
func (k Keeper) GetModuleBalances(ctx sdk.Context) []*registrytypes.AccountBalance {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
@@ -1,14 +1,287 @@
|
||||
package keeper
|
||||
|
||||
// import "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
import (
|
||||
"context"
|
||||
|
||||
// var _ registry.MsgServer = msgServer{}
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
|
||||
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
)
|
||||
|
||||
var _ registrytypes.MsgServer = msgServer{}
|
||||
|
||||
type msgServer struct {
|
||||
k Keeper
|
||||
}
|
||||
|
||||
// // NewMsgServerImpl returns an implementation of the module MsgServer interface.
|
||||
// func NewMsgServerImpl(keeper Keeper) registry.MsgServer {
|
||||
// return &msgServer{k: keeper}
|
||||
// }
|
||||
// NewMsgServerImpl returns an implementation of the module MsgServer interface.
|
||||
func NewMsgServerImpl(keeper Keeper) registrytypes.MsgServer {
|
||||
return &msgServer{k: keeper}
|
||||
}
|
||||
|
||||
func (ms msgServer) SetRecord(c context.Context, msg *registrytypes.MsgSetRecord) (*registrytypes.MsgSetRecordResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
record, err := ms.k.SetRecord(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeSetRecord,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.GetSigner()),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyBondId, msg.GetBondId()),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyPayload, msg.Payload.Record.Id),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
|
||||
return ®istrytypes.MsgSetRecordResponse{Id: record.Id}, nil
|
||||
}
|
||||
|
||||
// nolint: all
|
||||
func (ms msgServer) SetName(c context.Context, msg *registrytypes.MsgSetName) (*registrytypes.MsgSetNameResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessSetName(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeSetRecord,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyCRN, msg.Crn),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyCID, msg.Cid),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgSetNameResponse{}, nil
|
||||
}
|
||||
|
||||
func (ms msgServer) ReserveName(c context.Context, msg *registrytypes.MsgReserveAuthority) (*registrytypes.MsgReserveAuthorityResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = sdk.AccAddressFromBech32(msg.Owner)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessReserveAuthority(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeReserveNameAuthority,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyName, msg.Name),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyOwner, msg.Owner),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgReserveAuthorityResponse{}, nil
|
||||
}
|
||||
|
||||
// nolint: all
|
||||
func (ms msgServer) SetAuthorityBond(c context.Context, msg *registrytypes.MsgSetAuthorityBond) (*registrytypes.MsgSetAuthorityBondResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessSetAuthorityBond(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeAuthorityBond,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyName, msg.Name),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyBondId, msg.BondId),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgSetAuthorityBondResponse{}, nil
|
||||
}
|
||||
|
||||
func (ms msgServer) DeleteName(c context.Context, msg *registrytypes.MsgDeleteNameAuthority) (*registrytypes.MsgDeleteNameAuthorityResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessDeleteName(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeDeleteName,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyCRN, msg.Crn),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgDeleteNameAuthorityResponse{}, nil
|
||||
}
|
||||
|
||||
func (ms msgServer) RenewRecord(c context.Context, msg *registrytypes.MsgRenewRecord) (*registrytypes.MsgRenewRecordResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessRenewRecord(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeRenewRecord,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyRecordId, msg.RecordId),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgRenewRecordResponse{}, nil
|
||||
}
|
||||
|
||||
// nolint: all
|
||||
func (ms msgServer) AssociateBond(c context.Context, msg *registrytypes.MsgAssociateBond) (*registrytypes.MsgAssociateBondResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = ms.k.ProcessAssociateBond(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeAssociateBond,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyRecordId, msg.RecordId),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyBondId, msg.BondId),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgAssociateBondResponse{}, nil
|
||||
}
|
||||
|
||||
func (ms msgServer) DissociateBond(c context.Context, msg *registrytypes.MsgDissociateBond) (*registrytypes.MsgDissociateBondResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessDissociateBond(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeDissociateBond,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyRecordId, msg.RecordId),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgDissociateBondResponse{}, nil
|
||||
}
|
||||
|
||||
func (ms msgServer) DissociateRecords(c context.Context, msg *registrytypes.MsgDissociateRecords) (*registrytypes.MsgDissociateRecordsResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessDissociateRecords(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeDissociateRecords,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyBondId, msg.BondId),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgDissociateRecordsResponse{}, nil
|
||||
}
|
||||
|
||||
func (ms msgServer) ReAssociateRecords(c context.Context, msg *registrytypes.MsgReAssociateRecords) (*registrytypes.MsgReAssociateRecordsResponse, error) { //nolint: all
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
_, err := sdk.AccAddressFromBech32(msg.Signer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = ms.k.ProcessReAssociateRecords(ctx, *msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx.EventManager().EmitEvents(sdk.Events{
|
||||
sdk.NewEvent(
|
||||
registrytypes.EventTypeReAssociateRecords,
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyOldBondId, msg.OldBondId),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeyNewBondId, msg.NewBondId),
|
||||
),
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, registrytypes.AttributeValueCategory),
|
||||
sdk.NewAttribute(registrytypes.AttributeKeySigner, msg.Signer),
|
||||
),
|
||||
})
|
||||
return ®istrytypes.MsgReAssociateRecordsResponse{}, nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
package keeper
|
||||
|
||||
import (
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
|
||||
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
)
|
||||
|
||||
// GetNameAuthority - gets a name authority from the store.
|
||||
func (k Keeper) GetNameAuthority(ctx sdk.Context, name string) registrytypes.NameAuthority {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// HasNameRecord - checks if a name record exists.
|
||||
func (k Keeper) HasNameRecord(ctx sdk.Context, crn string) bool {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// GetNameRecord - gets a name record from the store.
|
||||
func (k Keeper) GetNameRecord(ctx sdk.Context, crn string) *registrytypes.NameRecord {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ListNameRecords - get all name records.
|
||||
func (k Keeper) ListNameRecords(ctx sdk.Context) []registrytypes.NameEntry {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessSetName creates a CRN -> Record ID mapping.
|
||||
func (k Keeper) ProcessSetName(ctx sdk.Context, msg registrytypes.MsgSetName) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessReserveAuthority reserves a name authority.
|
||||
func (k Keeper) ProcessReserveAuthority(ctx sdk.Context, msg registrytypes.MsgReserveAuthority) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func (k Keeper) ProcessSetAuthorityBond(ctx sdk.Context, msg registrytypes.MsgSetAuthorityBond) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessDeleteName removes a CRN -> Record ID mapping.
|
||||
func (k Keeper) ProcessDeleteName(ctx sdk.Context, msg registrytypes.MsgDeleteNameAuthority) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func (k Keeper) GetAuthorityExpiryQueue(ctx sdk.Context) []*registrytypes.ExpiryQueueRecord {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ResolveCRN resolves a CRN to a record.
|
||||
func (k Keeper) ResolveCRN(ctx sdk.Context, crn string) *registrytypes.Record {
|
||||
panic("unimplemented")
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package keeper
|
||||
|
||||
import (
|
||||
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
// GetParams - Get all parameters as types.Params.
|
||||
func (k Keeper) GetParams(ctx sdk.Context) (*registrytypes.Params, error) {
|
||||
params, err := k.Params.Get(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ¶ms, nil
|
||||
}
|
||||
@@ -1,16 +1,141 @@
|
||||
package keeper
|
||||
|
||||
// import (
|
||||
// registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
// )
|
||||
import (
|
||||
"context"
|
||||
|
||||
// var _ registrytypes.QueryServer = queryServer{}
|
||||
errorsmod "cosmossdk.io/errors"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
|
||||
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
)
|
||||
|
||||
var _ registrytypes.QueryServer = queryServer{}
|
||||
|
||||
type queryServer struct {
|
||||
k Keeper
|
||||
}
|
||||
|
||||
// // NewQueryServerImpl returns an implementation of the module QueryServer.
|
||||
// func NewQueryServerImpl(k Keeper) registrytypes.QueryServer {
|
||||
// return queryServer{k}
|
||||
// }
|
||||
// NewQueryServerImpl returns an implementation of the module QueryServer.
|
||||
func NewQueryServerImpl(k Keeper) registrytypes.QueryServer {
|
||||
return queryServer{k}
|
||||
}
|
||||
|
||||
func (qs queryServer) Params(c context.Context, _ *registrytypes.QueryParamsRequest) (*registrytypes.QueryParamsResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
|
||||
params, err := qs.k.GetParams(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ®istrytypes.QueryParamsResponse{Params: params}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) Records(c context.Context, req *registrytypes.QueryRecordsRequest) (*registrytypes.QueryRecordsResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
|
||||
attributes := req.GetAttributes()
|
||||
all := req.GetAll()
|
||||
|
||||
var records []registrytypes.Record
|
||||
var err error
|
||||
if len(attributes) > 0 {
|
||||
records, err = qs.k.RecordsFromAttributes(ctx, attributes, all)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
records, err = qs.k.ListRecords(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return ®istrytypes.QueryRecordsResponse{Records: records}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) GetRecord(c context.Context, req *registrytypes.QueryRecordByIdRequest) (*registrytypes.QueryRecordByIdResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
id := req.GetId()
|
||||
|
||||
if has, err := qs.k.HasRecord(ctx, req.Id); !has {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, "Record not found.")
|
||||
}
|
||||
|
||||
record, err := qs.k.GetRecord(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ®istrytypes.QueryRecordByIdResponse{Record: record}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) GetRecordsByBondId(c context.Context, req *registrytypes.QueryRecordsByBondIdRequest) (*registrytypes.QueryRecordsByBondIdResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
records := qs.k.recordKeeper.QueryRecordsByBond(ctx, req.GetId())
|
||||
return ®istrytypes.QueryRecordsByBondIdResponse{Records: records}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) GetRegistryModuleBalance(c context.Context,
|
||||
_ *registrytypes.QueryGetRegistryModuleBalanceRequest,
|
||||
) (*registrytypes.QueryGetRegistryModuleBalanceResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
balances := qs.k.GetModuleBalances(ctx)
|
||||
return ®istrytypes.QueryGetRegistryModuleBalanceResponse{
|
||||
Balances: balances,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) NameRecords(c context.Context, _ *registrytypes.QueryNameRecordsRequest) (*registrytypes.QueryNameRecordsResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
nameRecords := qs.k.ListNameRecords(ctx)
|
||||
return ®istrytypes.QueryNameRecordsResponse{Names: nameRecords}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) Whois(c context.Context, request *registrytypes.QueryWhoisRequest) (*registrytypes.QueryWhoisResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
nameAuthority := qs.k.GetNameAuthority(ctx, request.GetName())
|
||||
return ®istrytypes.QueryWhoisResponse{NameAuthority: nameAuthority}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) LookupCrn(c context.Context, req *registrytypes.QueryLookupCrnRequest) (*registrytypes.QueryLookupCrnResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
crn := req.GetCrn()
|
||||
if !qs.k.HasNameRecord(ctx, crn) {
|
||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, "CRN not found.")
|
||||
}
|
||||
nameRecord := qs.k.GetNameRecord(ctx, crn)
|
||||
if nameRecord == nil {
|
||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, "name record not found.")
|
||||
}
|
||||
return ®istrytypes.QueryLookupCrnResponse{Name: nameRecord}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) ResolveCrn(c context.Context, req *registrytypes.QueryResolveCrnRequest) (*registrytypes.QueryResolveCrnResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
crn := req.GetCrn()
|
||||
record := qs.k.ResolveCRN(ctx, crn)
|
||||
if record == nil {
|
||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnknownRequest, "record not found.")
|
||||
}
|
||||
return ®istrytypes.QueryResolveCrnResponse{Record: record}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) GetRecordExpiryQueue(c context.Context, _ *registrytypes.QueryGetRecordExpiryQueueRequest) (*registrytypes.QueryGetRecordExpiryQueueResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
records := qs.k.GetRecordExpiryQueue(ctx)
|
||||
return ®istrytypes.QueryGetRecordExpiryQueueResponse{Records: records}, nil
|
||||
}
|
||||
|
||||
func (qs queryServer) GetAuthorityExpiryQueue(c context.Context,
|
||||
_ *registrytypes.QueryGetAuthorityExpiryQueueRequest,
|
||||
) (*registrytypes.QueryGetAuthorityExpiryQueueResponse, error) {
|
||||
ctx := sdk.UnwrapSDKContext(c)
|
||||
authorities := qs.k.GetAuthorityExpiryQueue(ctx)
|
||||
return ®istrytypes.QueryGetAuthorityExpiryQueueResponse{Authorities: authorities}, nil
|
||||
}
|
||||
|
||||
@@ -2,8 +2,10 @@ package keeper
|
||||
|
||||
import (
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
|
||||
auctionkeeper "git.vdb.to/cerc-io/laconic2d/x/auction/keeper"
|
||||
registrytypes "git.vdb.to/cerc-io/laconic2d/x/registry"
|
||||
)
|
||||
|
||||
// TODO: Add methods
|
||||
@@ -14,3 +16,33 @@ type RecordKeeper struct {
|
||||
auctionKeeper auctionkeeper.Keeper
|
||||
// storeKey storetypes.StoreKey // Unexposed key to access store from sdk.Context
|
||||
}
|
||||
|
||||
// QueryRecordsByBond - get all records for the given bond.
|
||||
func (k RecordKeeper) QueryRecordsByBond(ctx sdk.Context, bondID string) []registrytypes.Record {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessRenewRecord renews a record.
|
||||
func (k Keeper) ProcessRenewRecord(ctx sdk.Context, msg registrytypes.MsgRenewRecord) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessAssociateBond associates a record with a bond.
|
||||
func (k Keeper) ProcessAssociateBond(ctx sdk.Context, msg registrytypes.MsgAssociateBond) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessDissociateBond dissociates a record from its bond.
|
||||
func (k Keeper) ProcessDissociateBond(ctx sdk.Context, msg registrytypes.MsgDissociateBond) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessDissociateRecords dissociates all records associated with a given bond.
|
||||
func (k Keeper) ProcessDissociateRecords(ctx sdk.Context, msg registrytypes.MsgDissociateRecords) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// ProcessReAssociateRecords switches records from and old to new bond.
|
||||
func (k Keeper) ProcessReAssociateRecords(ctx sdk.Context, msg registrytypes.MsgReAssociateRecords) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user