planetmint-go/x/dao/keeper/msg_server_redeem_claim.go
Lorenz Herzberger a38fe781ba
187 implement rddl claim (#298)
* ignite scaffold map redeem-claim amount issued:bool --module dao --index beneficiary,liquid-tx-hash

* revert: remove autogenerated delete redeem claim logic

* fix: replace deprecated autogenerated sdkerrors with errorsmod

* refactor: rename issued to confirmed on redeem claim

* feat: add claim address param

* test: add test for restricted msg UpdateRedeemClaim

* refactor: update redeem claim key creation and messages

* feat: add SendUpdateRedeemCLaim to util

* feat: add RedeemClaimDecorator for ante package

* ignite scaffold message confirm-redeem-claim id:uint beneficiary:string --module dao

* feat: add handleConfirmRedeemClaim to ante handler

* feat: add handleUpdateRedeemClaim to ante handler

* feat: implement ConfirmRedeemClaim msg handler

* test: add redeem claim test and adjust e2e test suite

* fix: make use of uint to rddl string util in CreateRedeemClaim

* fix: linter and staticcheck errors

* ignite scaffold query redeem-claim-by-liquid-tx-hash liquid-tx-hash --response redeem-claim:RedeemClaim --module dao

* feat: add RedeemClaimByLiquidTXHash store capabilities

* test: add QueryRedeemClaimByLiquidTxHash to e2e test suite

* feat: add RedeemClaimDecorator to ante handler chain

* fix: remove redundant planetmint-go from service path

* fix: linter and staticcheck errors

* fix: go vet errors

* fix: remove unused autogenerated simulation

* fix: broken simulation

* fix: openapi.yml

* revert: remove autogenerated redundant test file that causes data race on pipeline

* feat: burn claim on CreateRedeemClaim

* fix: linter error

* test: fix mock bankkeeper for msg server test

* fix: reissuance test if statement

* chore: removed TODO comment

* fix: typo in redeem claim error msg

* revert: remove autogenerated genesis state

* fix: dao module simulation

* revert: remove unused function

* fix: linter errors

* fix: linter error

---------

Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com>
2024-02-01 09:57:58 +01:00

114 lines
3.1 KiB
Go

package keeper
import (
"context"
"fmt"
errorsmod "cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/planetmint/planetmint-go/util"
"github.com/planetmint/planetmint-go/x/dao/types"
)
var (
createRedeemClaimTag = "create redeem claim: "
)
func (k msgServer) CreateRedeemClaim(goCtx context.Context, msg *types.MsgCreateRedeemClaim) (*types.MsgCreateRedeemClaimResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
params := k.GetParams(ctx)
var redeemClaim = types.RedeemClaim{
Creator: msg.Creator,
Beneficiary: msg.Beneficiary,
Amount: msg.Amount,
}
err := k.burnClaimAmount(ctx, sdk.MustAccAddressFromBech32(msg.Creator), msg.Amount)
if err != nil {
util.GetAppLogger().Error(ctx, createRedeemClaimTag+"could not burn claim")
}
id := k.CreateNewRedeemClaim(
ctx,
redeemClaim,
)
if util.IsValidatorBlockProposer(ctx, ctx.BlockHeader().ProposerAddress) {
util.GetAppLogger().Info(ctx, fmt.Sprintf("Issuing RDDL claim: %s/%d", msg.Beneficiary, id))
txID, err := util.DistributeAsset(msg.Beneficiary, util.UintValueToRDDLTokenString(msg.Amount), params.ReissuanceAsset)
if err != nil {
util.GetAppLogger().Error(ctx, createRedeemClaimTag+"could not issue claim to beneficiary: "+msg.GetBeneficiary())
}
util.SendUpdateRedeemClaim(goCtx, msg.Beneficiary, id, txID)
}
return &types.MsgCreateRedeemClaimResponse{}, nil
}
func (k msgServer) UpdateRedeemClaim(goCtx context.Context, msg *types.MsgUpdateRedeemClaim) (*types.MsgUpdateRedeemClaimResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
valFound, isFound := k.GetRedeemClaim(
ctx,
msg.Beneficiary,
msg.Id,
)
if !isFound {
return nil, errorsmod.Wrap(sdkerrors.ErrKeyNotFound, "index not set")
}
var redeemClaim = types.RedeemClaim{
Creator: valFound.Creator,
Beneficiary: msg.Beneficiary,
LiquidTxHash: msg.LiquidTxHash,
Amount: valFound.Amount,
Id: valFound.Id,
}
k.SetRedeemClaim(ctx, redeemClaim)
return &types.MsgUpdateRedeemClaimResponse{}, nil
}
func (k msgServer) ConfirmRedeemClaim(goCtx context.Context, msg *types.MsgConfirmRedeemClaim) (*types.MsgConfirmRedeemClaimResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
valFound, isFound := k.GetRedeemClaim(
ctx,
msg.Beneficiary,
msg.Id,
)
if !isFound {
return nil, errorsmod.Wrap(sdkerrors.ErrKeyNotFound, "index not set")
}
var redeemClaim = types.RedeemClaim{
Creator: valFound.Creator,
Beneficiary: msg.Beneficiary,
LiquidTxHash: valFound.LiquidTxHash,
Amount: valFound.Amount,
Id: valFound.Id,
Confirmed: true,
}
k.SetRedeemClaim(ctx, redeemClaim)
return &types.MsgConfirmRedeemClaimResponse{}, nil
}
func (k msgServer) burnClaimAmount(ctx sdk.Context, addr sdk.AccAddress, amount uint64) (err error) {
params := k.GetParams(ctx)
burnCoins := sdk.NewCoins(sdk.NewCoin(params.ClaimDenom, sdk.NewIntFromUint64(amount)))
err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, addr, types.ModuleName, burnCoins)
if err != nil {
return err
}
err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, burnCoins)
if err != nil {
return err
}
return
}