From 7d4ec9d56cb95d11730af660ab161ea1f5904aba Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger <64837895+LaurentMontBlanc@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:29:29 +0100 Subject: [PATCH 01/19] change: CreateRedeemClaim consumes entire claim for reduced complexity (#352) * change: CreateRedeemClaim consumes entire claim for reduced complexity --------- Signed-off-by: Lorenz Herzberger --- proto/planetmintgo/dao/tx.proto | 1 - tests/e2e/dao/pop/selection_suite.go | 8 +- x/dao/client/cli/tx_redeem_claim.go | 7 - x/dao/keeper/msg_server_redeem_claim.go | 30 +--- x/dao/types/messages_redeem_claim.go | 2 - x/dao/types/tx.pb.go | 174 ++++++++++-------------- 6 files changed, 79 insertions(+), 143 deletions(-) diff --git a/proto/planetmintgo/dao/tx.proto b/proto/planetmintgo/dao/tx.proto index 133664a..d9674ab 100644 --- a/proto/planetmintgo/dao/tx.proto +++ b/proto/planetmintgo/dao/tx.proto @@ -108,7 +108,6 @@ message MsgInitPopResponse {} message MsgCreateRedeemClaim { string creator = 1; string beneficiary = 2; - uint64 amount = 3; } message MsgCreateRedeemClaimResponse {} diff --git a/tests/e2e/dao/pop/selection_suite.go b/tests/e2e/dao/pop/selection_suite.go index f99f13e..dbe0619 100644 --- a/tests/e2e/dao/pop/selection_suite.go +++ b/tests/e2e/dao/pop/selection_suite.go @@ -258,7 +258,7 @@ func (s *SelectionE2ETestSuite) TestTokenRedeemClaim() { addr, _ := k.GetAddress() // Addr sends CreateRedeemClaim => accepted query redeem claim - createClaimMsg := daotypes.NewMsgCreateRedeemClaim(addr.String(), "liquidAddress", 10000) + createClaimMsg := daotypes.NewMsgCreateRedeemClaim(addr.String(), "liquidAddress") out, err := lib.BroadcastTxWithFileLock(addr, createClaimMsg) s.Require().NoError(err) @@ -275,7 +275,7 @@ func (s *SelectionE2ETestSuite) TestTokenRedeemClaim() { fmt.Sprintf(s.errormsg, bank.FlagDenom, s.claimDenom), }) s.Require().NoError(err) - assert.Equal(s.T(), "amount: \"5993140682\"\ndenom: crddl\n", balanceOut.String()) // 3 * 1997716894 - 10000 = 5993140682 + assert.Equal(s.T(), "amount: \"0\"\ndenom: crddl\n", balanceOut.String()) // consumes all claims // Addr sends ConfirmRedeemClaim => rejected not claim address confirmMsg := daotypes.NewMsgConfirmRedeemClaim(addr.String(), 0, "liquidAddress") @@ -302,11 +302,11 @@ func (s *SelectionE2ETestSuite) TestTokenRedeemClaim() { // QueryRedeemClaim qOut, err := clitestutil.ExecTestCLICmd(val.ClientCtx, daocli.CmdShowRedeemClaim(), []string{"liquidAddress", "0"}) s.Require().NoError(err) - assert.Equal(s.T(), "redeemClaim:\n amount: \"10000\"\n beneficiary: liquidAddress\n confirmed: true\n creator: plmnt1kp93kns6hs2066d8qw0uz84fw3vlthewt2ck6p\n id: \"0\"\n liquidTxHash: \"0000000000000000000000000000000000000000000000000000000000000000\"\n", qOut.String()) + assert.Equal(s.T(), "redeemClaim:\n amount: \"5993150682\"\n beneficiary: liquidAddress\n confirmed: true\n creator: plmnt1kp93kns6hs2066d8qw0uz84fw3vlthewt2ck6p\n id: \"0\"\n liquidTxHash: \"0000000000000000000000000000000000000000000000000000000000000000\"\n", qOut.String()) qOut, err = clitestutil.ExecTestCLICmd(val.ClientCtx, daocli.CmdRedeemClaimByLiquidTxHash(), []string{"0000000000000000000000000000000000000000000000000000000000000000"}) s.Require().NoError(err) - assert.Equal(s.T(), "redeemClaim:\n amount: \"10000\"\n beneficiary: liquidAddress\n confirmed: true\n creator: plmnt1kp93kns6hs2066d8qw0uz84fw3vlthewt2ck6p\n id: \"0\"\n liquidTxHash: \"0000000000000000000000000000000000000000000000000000000000000000\"\n", qOut.String()) + assert.Equal(s.T(), "redeemClaim:\n amount: \"5993150682\"\n beneficiary: liquidAddress\n confirmed: true\n creator: plmnt1kp93kns6hs2066d8qw0uz84fw3vlthewt2ck6p\n id: \"0\"\n liquidTxHash: \"0000000000000000000000000000000000000000000000000000000000000000\"\n", qOut.String()) } func (s *SelectionE2ETestSuite) createValAccount(cfg network.Config) (address sdk.AccAddress, err error) { diff --git a/x/dao/client/cli/tx_redeem_claim.go b/x/dao/client/cli/tx_redeem_claim.go index 793e638..997d6c9 100644 --- a/x/dao/client/cli/tx_redeem_claim.go +++ b/x/dao/client/cli/tx_redeem_claim.go @@ -19,12 +19,6 @@ func CmdCreateRedeemClaim() *cobra.Command { // Get indexes indexBeneficiary := args[0] - // Get value arguments - argAmount, err := strconv.ParseUint(args[1], 10, 64) - if err != nil { - return err - } - clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err @@ -33,7 +27,6 @@ func CmdCreateRedeemClaim() *cobra.Command { msg := types.NewMsgCreateRedeemClaim( clientCtx.GetFromAddress().String(), indexBeneficiary, - argAmount, ) if err := msg.ValidateBasic(); err != nil { return err diff --git a/x/dao/keeper/msg_server_redeem_claim.go b/x/dao/keeper/msg_server_redeem_claim.go index b47be69..93cc6db 100644 --- a/x/dao/keeper/msg_server_redeem_claim.go +++ b/x/dao/keeper/msg_server_redeem_claim.go @@ -12,7 +12,6 @@ import ( ) var ( - redeemClaimContext = "redeem claim: " createRedeemClaimTag = "create redeem claim: " ) @@ -20,18 +19,16 @@ func (k msgServer) CreateRedeemClaim(goCtx context.Context, msg *types.MsgCreate ctx := sdk.UnwrapSDKContext(goCtx) params := k.GetParams(ctx) - err := k.validateCreateRedeemClaim(ctx, msg) - if err != nil { - return nil, err - } + addr := sdk.MustAccAddressFromBech32(msg.Creator) + burnCoins := k.bankKeeper.GetBalance(ctx, addr, params.ClaimDenom) var redeemClaim = types.RedeemClaim{ Creator: msg.Creator, Beneficiary: msg.Beneficiary, - Amount: msg.Amount, + Amount: burnCoins.Amount.Uint64(), } - err = k.burnClaimAmount(ctx, sdk.MustAccAddressFromBech32(msg.Creator), msg.Amount) + err := k.burnClaimAmount(ctx, sdk.MustAccAddressFromBech32(msg.Creator), sdk.NewCoins(burnCoins)) if err != nil { util.GetAppLogger().Error(ctx, createRedeemClaimTag+"could not burn claim") } @@ -43,7 +40,7 @@ func (k msgServer) CreateRedeemClaim(goCtx context.Context, msg *types.MsgCreate if util.IsValidatorBlockProposer(ctx, ctx.BlockHeader().ProposerAddress, k.RootDir) { 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) + txID, err := util.DistributeAsset(msg.Beneficiary, util.UintValueToRDDLTokenString(burnCoins.Amount.Uint64()), params.ReissuanceAsset) if err != nil { util.GetAppLogger().Error(ctx, createRedeemClaimTag+"could not issue claim to beneficiary: "+msg.GetBeneficiary()) } @@ -53,19 +50,6 @@ func (k msgServer) CreateRedeemClaim(goCtx context.Context, msg *types.MsgCreate return &types.MsgCreateRedeemClaimResponse{}, nil } -func (k msgServer) validateCreateRedeemClaim(ctx sdk.Context, msg *types.MsgCreateRedeemClaim) (err error) { - addr := sdk.MustAccAddressFromBech32(msg.Creator) - - params := k.GetParams(ctx) - balance := k.bankKeeper.GetBalance(ctx, addr, params.ClaimDenom) - - if !balance.Amount.GTE(sdk.NewIntFromUint64(msg.Amount)) { - return errorsmod.Wrap(sdkerrors.ErrInsufficientFunds, redeemClaimContext) - } - - return nil -} - func (k msgServer) UpdateRedeemClaim(goCtx context.Context, msg *types.MsgUpdateRedeemClaim) (*types.MsgUpdateRedeemClaimResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) @@ -134,9 +118,7 @@ func (k msgServer) validateConfirmRedeemClaim(ctx sdk.Context, msg *types.MsgCon return 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))) +func (k msgServer) burnClaimAmount(ctx sdk.Context, addr sdk.AccAddress, burnCoins sdk.Coins) (err error) { err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, addr, types.ModuleName, burnCoins) if err != nil { return err diff --git a/x/dao/types/messages_redeem_claim.go b/x/dao/types/messages_redeem_claim.go index 7400902..8dbd3e7 100644 --- a/x/dao/types/messages_redeem_claim.go +++ b/x/dao/types/messages_redeem_claim.go @@ -18,13 +18,11 @@ var _ sdk.Msg = &MsgCreateRedeemClaim{} func NewMsgCreateRedeemClaim( creator string, beneficiary string, - amount uint64, ) *MsgCreateRedeemClaim { return &MsgCreateRedeemClaim{ Creator: creator, Beneficiary: beneficiary, - Amount: amount, } } diff --git a/x/dao/types/tx.pb.go b/x/dao/types/tx.pb.go index 84801dd..6016217 100644 --- a/x/dao/types/tx.pb.go +++ b/x/dao/types/tx.pb.go @@ -852,7 +852,6 @@ var xxx_messageInfo_MsgInitPopResponse proto.InternalMessageInfo type MsgCreateRedeemClaim struct { Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` Beneficiary string `protobuf:"bytes,2,opt,name=beneficiary,proto3" json:"beneficiary,omitempty"` - Amount uint64 `protobuf:"varint,3,opt,name=amount,proto3" json:"amount,omitempty"` } func (m *MsgCreateRedeemClaim) Reset() { *m = MsgCreateRedeemClaim{} } @@ -902,13 +901,6 @@ func (m *MsgCreateRedeemClaim) GetBeneficiary() string { return "" } -func (m *MsgCreateRedeemClaim) GetAmount() uint64 { - if m != nil { - return m.Amount - } - return 0 -} - type MsgCreateRedeemClaimResponse struct { } @@ -1173,76 +1165,75 @@ func init() { func init() { proto.RegisterFile("planetmintgo/dao/tx.proto", fileDescriptor_7117c47dbc1828c7) } var fileDescriptor_7117c47dbc1828c7 = []byte{ - // 1094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcf, 0x4f, 0xdc, 0xc6, - 0x17, 0xc7, 0x40, 0x20, 0xfb, 0xe0, 0x1b, 0x82, 0xc3, 0x97, 0x2c, 0x2e, 0x38, 0x5b, 0x07, 0xd1, - 0x0d, 0x4a, 0xd6, 0x6d, 0x2a, 0x55, 0x6a, 0x7b, 0xa8, 0x0a, 0x48, 0x0d, 0x52, 0x57, 0x45, 0x0e, - 0xbd, 0x54, 0x95, 0xd0, 0x60, 0x0f, 0xde, 0x29, 0xb6, 0xc7, 0xcc, 0xcc, 0x46, 0xa0, 0xde, 0x72, - 0xe8, 0xb9, 0xa7, 0x9e, 0xfa, 0x07, 0xf4, 0x98, 0x43, 0xff, 0x88, 0x1c, 0xa3, 0x9e, 0x7a, 0xaa, - 0x22, 0x38, 0xe4, 0x4f, 0xe8, 0xa1, 0x97, 0xca, 0xe3, 0x59, 0xaf, 0x77, 0xc7, 0xfb, 0xe3, 0xd2, - 0x4b, 0x32, 0xef, 0xbd, 0xcf, 0x9b, 0xf7, 0xf1, 0x9b, 0x37, 0x9f, 0x61, 0x61, 0x23, 0x8d, 0x50, - 0x82, 0x45, 0x4c, 0x12, 0x11, 0x52, 0x37, 0x40, 0xd4, 0x15, 0x97, 0xad, 0x94, 0x51, 0x41, 0xcd, - 0xbb, 0xe5, 0x50, 0x2b, 0x40, 0xd4, 0x6a, 0x68, 0x60, 0xbf, 0x83, 0xa2, 0x08, 0x27, 0x21, 0xce, - 0x73, 0xac, 0x87, 0x1a, 0x22, 0x5b, 0x9e, 0x30, 0x7c, 0xd1, 0xc5, 0x5c, 0x28, 0xd0, 0x23, 0x0d, - 0x14, 0x10, 0x2e, 0x18, 0x39, 0xed, 0x0a, 0x42, 0x93, 0x13, 0xca, 0x02, 0xcc, 0x14, 0x74, 0x4b, - 0x83, 0xa6, 0x88, 0xa1, 0x98, 0xab, 0xf0, 0x2a, 0x8a, 0x49, 0x42, 0x5d, 0xf9, 0xaf, 0x72, 0xad, - 0x85, 0x34, 0xa4, 0x72, 0xe9, 0x66, 0x2b, 0xe5, 0xdd, 0xf0, 0x29, 0x8f, 0x29, 0x3f, 0xc9, 0x03, - 0xb9, 0xa1, 0x42, 0xf7, 0x73, 0xcb, 0x8d, 0x79, 0xe8, 0xbe, 0xf8, 0x28, 0xfb, 0x6f, 0xe4, 0xb7, - 0x30, 0x1c, 0x60, 0x1c, 0x9f, 0xf8, 0x11, 0x22, 0x71, 0x0e, 0x72, 0x08, 0x98, 0x6d, 0x1e, 0x7a, - 0x38, 0xa5, 0x4c, 0x1c, 0xd1, 0xd4, 0xc3, 0xbc, 0x1b, 0x09, 0xb3, 0x0e, 0x8b, 0x3e, 0xc3, 0x48, - 0x50, 0x56, 0x37, 0x1a, 0x46, 0xb3, 0xe6, 0xf5, 0x4c, 0xf3, 0x53, 0xa8, 0x15, 0x3d, 0xab, 0xcf, - 0x36, 0x8c, 0xe6, 0xd2, 0xd3, 0xf7, 0x5a, 0xc3, 0x8d, 0x6e, 0xed, 0xf7, 0x20, 0x5e, 0x1f, 0xed, - 0x6c, 0x82, 0xa5, 0x97, 0xf2, 0x30, 0x4f, 0x69, 0xc2, 0xb1, 0xf3, 0xd6, 0x80, 0x75, 0x19, 0x26, - 0x9c, 0x77, 0xb1, 0x77, 0x70, 0xf0, 0xf5, 0x11, 0xa3, 0x29, 0xe5, 0x28, 0x1a, 0xc3, 0xc6, 0x82, - 0xdb, 0xa9, 0x44, 0x61, 0x26, 0xc9, 0xd4, 0xbc, 0xc2, 0x96, 0x59, 0x34, 0x8e, 0x51, 0x12, 0xd4, - 0xe7, 0x54, 0x56, 0x6e, 0x9a, 0x0d, 0x58, 0x3a, 0x8d, 0xa8, 0x7f, 0xfe, 0x0c, 0x93, 0xb0, 0x23, - 0xea, 0xf3, 0x0d, 0xa3, 0x39, 0xe7, 0x95, 0x5d, 0xe6, 0x2e, 0xdc, 0x3d, 0x23, 0x8c, 0x8b, 0xc3, - 0xc4, 0x8f, 0xba, 0x01, 0x0e, 0x8e, 0x68, 0x5a, 0xbf, 0x25, 0x61, 0x9a, 0xdf, 0x6c, 0xc2, 0x4a, - 0x84, 0x06, 0xa1, 0x0b, 0x12, 0x3a, 0xec, 0x76, 0x1a, 0x60, 0x57, 0x7f, 0x61, 0xd1, 0x04, 0x02, - 0xcb, 0x6d, 0x1e, 0xb6, 0x49, 0x22, 0x8e, 0xe9, 0x39, 0x4e, 0xc6, 0x7c, 0xf9, 0x17, 0xb0, 0x94, - 0xf5, 0xdb, 0xcb, 0x07, 0x53, 0x9d, 0xc4, 0x96, 0x7e, 0x12, 0xed, 0x3e, 0xc8, 0x2b, 0x67, 0x38, - 0xeb, 0xb0, 0x56, 0x2e, 0x55, 0x50, 0x78, 0x69, 0xc8, 0x40, 0x89, 0xe5, 0xc4, 0x99, 0x18, 0x77, - 0x0a, 0x26, 0xcc, 0x8b, 0xcb, 0xc3, 0x03, 0x75, 0x04, 0x72, 0x3d, 0xb9, 0xff, 0x8e, 0x0d, 0x9b, - 0x55, 0x1c, 0x0a, 0x92, 0x7f, 0x1b, 0xf0, 0xff, 0x36, 0x0f, 0x0f, 0x4a, 0xd7, 0x6e, 0x22, 0xcb, - 0x3a, 0x2c, 0x66, 0x07, 0x92, 0x9d, 0xcf, 0xac, 0xac, 0xd8, 0x33, 0xb3, 0x48, 0x80, 0xe8, 0x71, - 0x9f, 0x66, 0xcf, 0x34, 0x1d, 0x58, 0x26, 0xc9, 0x0b, 0xcc, 0x05, 0x65, 0x32, 0x3c, 0x2f, 0xc3, - 0x03, 0xbe, 0x2c, 0x3b, 0xa5, 0xa9, 0x0c, 0xdf, 0xca, 0xb3, 0x95, 0x69, 0x3e, 0x86, 0x55, 0x8c, - 0x58, 0x74, 0x75, 0x58, 0xde, 0x62, 0x41, 0x62, 0xf4, 0x80, 0xb9, 0x0d, 0xff, 0xe3, 0x82, 0x21, - 0x81, 0x43, 0xe2, 0x4b, 0xe4, 0xa2, 0x44, 0x0e, 0x3a, 0x9d, 0x07, 0xb0, 0x55, 0xf9, 0xe1, 0x45, - 0x6b, 0x7e, 0x94, 0xd7, 0x68, 0x10, 0x20, 0x4f, 0x7c, 0x4c, 0x6b, 0xbe, 0x82, 0xe5, 0xb2, 0x82, - 0xa9, 0x69, 0x7a, 0xa8, 0x4f, 0x53, 0x79, 0xdb, 0x6f, 0x32, 0x99, 0xf3, 0x06, 0x12, 0xd5, 0x84, - 0x57, 0x14, 0x2f, 0xe8, 0xfd, 0x62, 0xc0, 0x4a, 0x9b, 0x87, 0xdf, 0xa6, 0x01, 0x12, 0xf8, 0x48, - 0x6a, 0xa1, 0xf9, 0x09, 0xd4, 0x50, 0x57, 0x74, 0x28, 0x23, 0xe2, 0x2a, 0xa7, 0xb6, 0x57, 0xff, - 0xe3, 0xf7, 0x27, 0x6b, 0x4a, 0xe6, 0xbe, 0x0c, 0x02, 0x86, 0x39, 0x7f, 0x2e, 0x18, 0x49, 0x42, - 0xaf, 0x0f, 0x35, 0x3f, 0x87, 0x85, 0x5c, 0x4d, 0x15, 0xe1, 0xba, 0x4e, 0x38, 0xaf, 0xb0, 0x57, - 0x7b, 0xfd, 0xd7, 0x83, 0x99, 0xdf, 0xde, 0xbd, 0xda, 0x35, 0x3c, 0x95, 0xf2, 0xd9, 0x9d, 0x97, - 0xef, 0x5e, 0xed, 0xf6, 0x37, 0x73, 0x36, 0xe0, 0xfe, 0x10, 0xaf, 0x82, 0xf3, 0xaf, 0x06, 0x40, - 0x9b, 0x87, 0x87, 0x09, 0xe9, 0x8d, 0xcb, 0x88, 0x3e, 0x6e, 0x42, 0x8d, 0x24, 0x44, 0x10, 0x19, - 0xcb, 0x6f, 0x42, 0xdf, 0x61, 0xda, 0x00, 0x85, 0x18, 0x32, 0x35, 0x69, 0x25, 0xcf, 0x40, 0x1c, - 0xab, 0x51, 0x2b, 0x79, 0xcc, 0x75, 0x58, 0xe8, 0xe4, 0x37, 0x26, 0x97, 0x22, 0x65, 0x39, 0x6b, - 0x52, 0xc2, 0x15, 0xbb, 0x82, 0xf4, 0x0f, 0xf2, 0x1a, 0xef, 0x67, 0xcc, 0xb0, 0x27, 0x75, 0x7f, - 0x3f, 0x93, 0xfd, 0x31, 0xec, 0xb3, 0x6b, 0x89, 0x13, 0x7c, 0x46, 0x7c, 0x82, 0xd8, 0x95, 0xe2, - 0x5f, 0x76, 0x65, 0x0c, 0x50, 0x4c, 0xbb, 0x89, 0x90, 0xec, 0xe7, 0x3d, 0x65, 0xa9, 0xeb, 0xaa, - 0xd5, 0x2a, 0xb8, 0xfc, 0x94, 0x6b, 0x4a, 0xde, 0xdc, 0xe9, 0xc8, 0xdc, 0x81, 0x59, 0x12, 0x48, - 0x0e, 0xf3, 0xde, 0x2c, 0x09, 0x86, 0xc9, 0xcd, 0xe9, 0xe4, 0x1c, 0x58, 0x8e, 0xc8, 0x45, 0x97, - 0x04, 0xc7, 0x97, 0xcf, 0x10, 0xef, 0xf4, 0xee, 0x6a, 0xd9, 0xa7, 0x88, 0x6a, 0x3c, 0x0a, 0xa2, - 0xbe, 0x94, 0x95, 0x7d, 0x9a, 0x9c, 0x11, 0x16, 0xff, 0x47, 0x44, 0xd5, 0x15, 0xd6, 0x8b, 0xf4, - 0x58, 0x3c, 0xfd, 0xe7, 0x36, 0xcc, 0xb5, 0x79, 0x68, 0x5e, 0xc0, 0xbd, 0xaa, 0xe7, 0xb0, 0x59, - 0xa1, 0xf2, 0x95, 0xcf, 0x8a, 0xf5, 0xe1, 0xb4, 0xc8, 0x5e, 0x69, 0xf3, 0x39, 0xd4, 0xfa, 0xaf, - 0x8f, 0x5d, 0x99, 0x5e, 0xc4, 0xad, 0x9d, 0xf1, 0xf1, 0x62, 0xd3, 0x73, 0x58, 0xd5, 0x9f, 0x93, - 0x9d, 0x49, 0xdc, 0x72, 0x9c, 0xd5, 0x9a, 0x0e, 0x57, 0x14, 0x4b, 0xc0, 0xac, 0x78, 0x16, 0x3e, - 0xa8, 0xdc, 0x45, 0x07, 0x5a, 0xee, 0x94, 0xc0, 0xa2, 0xde, 0x05, 0xdc, 0xab, 0x12, 0xdb, 0xe6, - 0x14, 0xfb, 0x48, 0xe4, 0x88, 0x43, 0x1a, 0xa3, 0xa1, 0xe6, 0xf7, 0xb0, 0x3c, 0xa0, 0x9f, 0xef, - 0x57, 0xee, 0x50, 0x86, 0x58, 0x8f, 0x26, 0x42, 0x8a, 0xdd, 0x31, 0xac, 0x0c, 0xff, 0x39, 0xb8, - 0x3d, 0xe2, 0x0c, 0x06, 0x50, 0xd6, 0xe3, 0x69, 0x50, 0x45, 0x99, 0x36, 0x2c, 0xf6, 0x04, 0x75, - 0xb3, 0x32, 0x51, 0x45, 0xad, 0xed, 0x71, 0xd1, 0xf2, 0x8c, 0xe9, 0x5a, 0x57, 0x3d, 0x63, 0x1a, - 0x6e, 0xc4, 0x8c, 0x8d, 0xd4, 0xb3, 0xac, 0x98, 0xae, 0x65, 0x3b, 0x63, 0x5a, 0x3c, 0xb9, 0xd8, - 0x48, 0x4d, 0xca, 0x06, 0xba, 0x42, 0x90, 0xaa, 0x07, 0x5a, 0x07, 0x8e, 0x18, 0xe8, 0xd1, 0xea, - 0xb3, 0x77, 0xf8, 0xfa, 0xda, 0x36, 0xde, 0x5c, 0xdb, 0xc6, 0xdb, 0x6b, 0xdb, 0xf8, 0xf9, 0xc6, - 0x9e, 0x79, 0x73, 0x63, 0xcf, 0xfc, 0x79, 0x63, 0xcf, 0x7c, 0xe7, 0x86, 0x44, 0x74, 0xba, 0xa7, - 0x2d, 0x9f, 0xc6, 0x6e, 0x7f, 0xd3, 0xd2, 0xf2, 0x49, 0x48, 0xdd, 0xcb, 0xfc, 0x47, 0xd8, 0x55, - 0x8a, 0xf9, 0xe9, 0x82, 0xfc, 0x8d, 0xf1, 0xf1, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x81, 0x5c, - 0x0d, 0x9f, 0xa5, 0x0d, 0x00, 0x00, + // 1080 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4f, 0x6f, 0xdc, 0x44, + 0x14, 0x8f, 0x93, 0x34, 0xe9, 0xbe, 0x84, 0xa6, 0x71, 0x43, 0xba, 0x31, 0x89, 0xbb, 0xb8, 0x51, + 0xd8, 0x46, 0xed, 0x1a, 0x8a, 0x84, 0x04, 0x1c, 0x10, 0x49, 0x24, 0x1a, 0x89, 0x15, 0x91, 0x1b, + 0x2e, 0x08, 0x29, 0x9a, 0xd8, 0x13, 0xef, 0x28, 0xb6, 0xc7, 0x99, 0x99, 0xad, 0x12, 0x71, 0xeb, + 0x81, 0x33, 0x27, 0x4e, 0x7c, 0x00, 0x8e, 0x3d, 0xf0, 0x21, 0x7a, 0xac, 0x38, 0x71, 0x42, 0x55, + 0x72, 0xe8, 0x47, 0xe0, 0xc0, 0x05, 0x79, 0x3c, 0xeb, 0xf5, 0xee, 0x78, 0xff, 0x5c, 0xb8, 0xb4, + 0x9e, 0xf7, 0x7e, 0xef, 0xbd, 0x9f, 0xdf, 0xbc, 0xf7, 0x73, 0x16, 0x36, 0xd2, 0x08, 0x25, 0x58, + 0xc4, 0x24, 0x11, 0x21, 0x75, 0x03, 0x44, 0x5d, 0x71, 0xd9, 0x4a, 0x19, 0x15, 0xd4, 0xbc, 0x5b, + 0x76, 0xb5, 0x02, 0x44, 0xad, 0x86, 0x06, 0xf6, 0x3b, 0x28, 0x8a, 0x70, 0x12, 0xe2, 0x3c, 0xc6, + 0x7a, 0xa8, 0x21, 0xb2, 0xc7, 0x13, 0x86, 0x2f, 0xba, 0x98, 0x0b, 0x05, 0x7a, 0xa4, 0x81, 0x02, + 0xc2, 0x05, 0x23, 0xa7, 0x5d, 0x41, 0x68, 0x72, 0x42, 0x59, 0x80, 0x99, 0x82, 0x6e, 0x69, 0xd0, + 0x14, 0x31, 0x14, 0x73, 0xe5, 0x5e, 0x45, 0x31, 0x49, 0xa8, 0x2b, 0xff, 0x55, 0xa6, 0xb5, 0x90, + 0x86, 0x54, 0x3e, 0xba, 0xd9, 0x93, 0xb2, 0x6e, 0xf8, 0x94, 0xc7, 0x94, 0x9f, 0xe4, 0x8e, 0xfc, + 0xa0, 0x5c, 0xf7, 0xf3, 0x93, 0x1b, 0xf3, 0xd0, 0x7d, 0xf1, 0x49, 0xf6, 0xdf, 0xc8, 0x77, 0x61, + 0x38, 0xc0, 0x38, 0x3e, 0xf1, 0x23, 0x44, 0xe2, 0x1c, 0xe4, 0x10, 0x30, 0xdb, 0x3c, 0xf4, 0x70, + 0x4a, 0x99, 0x38, 0xa2, 0xa9, 0x87, 0x79, 0x37, 0x12, 0x66, 0x1d, 0x16, 0x7d, 0x86, 0x91, 0xa0, + 0xac, 0x6e, 0x34, 0x8c, 0x66, 0xcd, 0xeb, 0x1d, 0xcd, 0xcf, 0xa1, 0x56, 0xf4, 0xac, 0x3e, 0xdb, + 0x30, 0x9a, 0x4b, 0x4f, 0x3f, 0x68, 0x0d, 0x37, 0xba, 0xb5, 0xdf, 0x83, 0x78, 0x7d, 0xb4, 0xb3, + 0x09, 0x96, 0x5e, 0xca, 0xc3, 0x3c, 0xa5, 0x09, 0xc7, 0xce, 0x5b, 0x03, 0xd6, 0xa5, 0x9b, 0x70, + 0xde, 0xc5, 0xde, 0xc1, 0xc1, 0xb7, 0x47, 0x8c, 0xa6, 0x94, 0xa3, 0x68, 0x0c, 0x1b, 0x0b, 0x6e, + 0xa7, 0x12, 0x85, 0x99, 0x24, 0x53, 0xf3, 0x8a, 0xb3, 0x8c, 0xa2, 0x71, 0x8c, 0x92, 0xa0, 0x3e, + 0xa7, 0xa2, 0xf2, 0xa3, 0xd9, 0x80, 0xa5, 0xd3, 0x88, 0xfa, 0xe7, 0xcf, 0x30, 0x09, 0x3b, 0xa2, + 0x3e, 0xdf, 0x30, 0x9a, 0x73, 0x5e, 0xd9, 0x64, 0xee, 0xc2, 0xdd, 0x33, 0xc2, 0xb8, 0x38, 0x4c, + 0xfc, 0xa8, 0x1b, 0xe0, 0xe0, 0x88, 0xa6, 0xf5, 0x5b, 0x12, 0xa6, 0xd9, 0xcd, 0x26, 0xac, 0x44, + 0x68, 0x10, 0xba, 0x20, 0xa1, 0xc3, 0x66, 0xa7, 0x01, 0x76, 0xf5, 0x1b, 0x16, 0x4d, 0x20, 0xb0, + 0xdc, 0xe6, 0x61, 0x9b, 0x24, 0xe2, 0x98, 0x9e, 0xe3, 0x64, 0xcc, 0x9b, 0x7f, 0x05, 0x4b, 0x59, + 0xbf, 0xbd, 0x7c, 0x30, 0xd5, 0x4d, 0x6c, 0xe9, 0x37, 0xd1, 0xee, 0x83, 0xbc, 0x72, 0x84, 0xb3, + 0x0e, 0x6b, 0xe5, 0x52, 0x05, 0x85, 0x97, 0x86, 0x74, 0x94, 0x58, 0x4e, 0x9c, 0x89, 0x71, 0xb7, + 0x60, 0xc2, 0xbc, 0xb8, 0x3c, 0x3c, 0x50, 0x57, 0x20, 0x9f, 0x27, 0xf7, 0xdf, 0xb1, 0x61, 0xb3, + 0x8a, 0x43, 0x41, 0xf2, 0x1f, 0x03, 0xde, 0x6f, 0xf3, 0xf0, 0xa0, 0xb4, 0x76, 0x13, 0x59, 0xd6, + 0x61, 0x31, 0xbb, 0x90, 0xec, 0x7e, 0x66, 0x65, 0xc5, 0xde, 0x31, 0xf3, 0x04, 0x88, 0x1e, 0xf7, + 0x69, 0xf6, 0x8e, 0xa6, 0x03, 0xcb, 0x24, 0x79, 0x81, 0xb9, 0xa0, 0x4c, 0xba, 0xe7, 0xa5, 0x7b, + 0xc0, 0x96, 0x45, 0xa7, 0x34, 0x95, 0xee, 0x5b, 0x79, 0xb4, 0x3a, 0x9a, 0x8f, 0x61, 0x15, 0x23, + 0x16, 0x5d, 0x1d, 0x96, 0x53, 0x2c, 0x48, 0x8c, 0xee, 0x30, 0xb7, 0xe1, 0x3d, 0x2e, 0x18, 0x12, + 0x38, 0x24, 0xbe, 0x44, 0x2e, 0x4a, 0xe4, 0xa0, 0xd1, 0x79, 0x00, 0x5b, 0x95, 0x2f, 0x5e, 0xb4, + 0xe6, 0x27, 0xb9, 0x46, 0x83, 0x00, 0x79, 0xe3, 0x63, 0x5a, 0xf3, 0x0d, 0x2c, 0x97, 0x15, 0x4c, + 0x4d, 0xd3, 0x43, 0x7d, 0x9a, 0xca, 0x69, 0xbf, 0xcb, 0x64, 0xce, 0x1b, 0x08, 0x54, 0x13, 0x5e, + 0x51, 0xbc, 0xa0, 0xf7, 0xab, 0x01, 0x2b, 0x6d, 0x1e, 0x7e, 0x9f, 0x06, 0x48, 0xe0, 0x23, 0xa9, + 0x85, 0xe6, 0x67, 0x50, 0x43, 0x5d, 0xd1, 0xa1, 0x8c, 0x88, 0xab, 0x9c, 0xda, 0x5e, 0xfd, 0xcf, + 0x3f, 0x9e, 0xac, 0x29, 0x99, 0xfb, 0x3a, 0x08, 0x18, 0xe6, 0xfc, 0xb9, 0x60, 0x24, 0x09, 0xbd, + 0x3e, 0xd4, 0xfc, 0x12, 0x16, 0x72, 0x35, 0x55, 0x84, 0xeb, 0x3a, 0xe1, 0xbc, 0xc2, 0x5e, 0xed, + 0xf5, 0xdf, 0x0f, 0x66, 0x7e, 0x7f, 0xf7, 0x6a, 0xd7, 0xf0, 0x54, 0xc8, 0x17, 0x77, 0x5e, 0xbe, + 0x7b, 0xb5, 0xdb, 0x4f, 0xe6, 0x6c, 0xc0, 0xfd, 0x21, 0x5e, 0x05, 0xe7, 0xdf, 0x0c, 0x80, 0x36, + 0x0f, 0x0f, 0x13, 0xd2, 0x1b, 0x97, 0x11, 0x7d, 0xdc, 0x84, 0x1a, 0x49, 0x88, 0x20, 0xd2, 0x97, + 0x6f, 0x42, 0xdf, 0x60, 0xda, 0x00, 0x85, 0x18, 0x32, 0x35, 0x69, 0x25, 0xcb, 0x80, 0x1f, 0xab, + 0x51, 0x2b, 0x59, 0xcc, 0x75, 0x58, 0xe8, 0xe4, 0x1b, 0x93, 0x4b, 0x91, 0x3a, 0x39, 0x6b, 0x52, + 0xc2, 0x15, 0xbb, 0x82, 0xb4, 0x27, 0xd7, 0x78, 0x3f, 0x63, 0x86, 0x3d, 0xa9, 0xfb, 0xfb, 0x99, + 0xec, 0x8f, 0x61, 0x9f, 0xad, 0x25, 0x4e, 0xf0, 0x19, 0xf1, 0x09, 0x62, 0x57, 0x8a, 0x7f, 0xd9, + 0xa4, 0xd6, 0x52, 0xcb, 0x59, 0xd4, 0xfc, 0x39, 0xd7, 0x8e, 0xbc, 0x89, 0xd3, 0x15, 0xbd, 0x03, + 0xb3, 0x24, 0x90, 0xb5, 0xe6, 0xbd, 0x59, 0x12, 0x0c, 0x93, 0x98, 0xd3, 0x48, 0x64, 0x3b, 0x19, + 0x91, 0x8b, 0x2e, 0x09, 0x8e, 0x2f, 0x9f, 0x21, 0xde, 0xe9, 0xed, 0x64, 0xd9, 0xa6, 0x88, 0x6a, + 0x3c, 0x0a, 0xa2, 0xbe, 0x94, 0x8f, 0x7d, 0x9a, 0x9c, 0x11, 0x16, 0xff, 0x4f, 0x44, 0xd5, 0xaa, + 0xea, 0x45, 0x7a, 0x2c, 0x9e, 0xfe, 0x7b, 0x1b, 0xe6, 0xda, 0x3c, 0x34, 0x2f, 0xe0, 0x5e, 0xd5, + 0x67, 0xaf, 0x59, 0xa1, 0xe6, 0x95, 0x9f, 0x0f, 0xeb, 0xe3, 0x69, 0x91, 0xbd, 0xd2, 0xe6, 0x73, + 0xa8, 0xf5, 0xbf, 0x32, 0x76, 0x65, 0x78, 0xe1, 0xb7, 0x76, 0xc6, 0xfb, 0x8b, 0xa4, 0xe7, 0xb0, + 0xaa, 0x7f, 0x36, 0x76, 0x26, 0x71, 0xcb, 0x71, 0x56, 0x6b, 0x3a, 0x5c, 0x51, 0x2c, 0x01, 0xb3, + 0x42, 0xfe, 0x3f, 0xaa, 0xcc, 0xa2, 0x03, 0x2d, 0x77, 0x4a, 0x60, 0x51, 0xef, 0x02, 0xee, 0x55, + 0x89, 0x6a, 0x73, 0x8a, 0x3c, 0x12, 0x39, 0xe2, 0x92, 0xc6, 0x68, 0xa5, 0xf9, 0x23, 0x2c, 0x0f, + 0xe8, 0xe4, 0x87, 0x95, 0x19, 0xca, 0x10, 0xeb, 0xd1, 0x44, 0x48, 0x91, 0x1d, 0xc3, 0xca, 0xf0, + 0x9f, 0x7d, 0xdb, 0x23, 0xee, 0x60, 0x00, 0x65, 0x3d, 0x9e, 0x06, 0x55, 0x94, 0x69, 0xc3, 0x62, + 0x4f, 0x38, 0x37, 0x2b, 0x03, 0x95, 0xd7, 0xda, 0x1e, 0xe7, 0x2d, 0xcf, 0x98, 0xae, 0x69, 0xd5, + 0x33, 0xa6, 0xe1, 0x46, 0xcc, 0xd8, 0x48, 0x3d, 0xcb, 0x8a, 0xe9, 0x5a, 0xb6, 0x33, 0xa6, 0xc5, + 0x93, 0x8b, 0x8d, 0xd4, 0xa4, 0x6c, 0xa0, 0x2b, 0x04, 0xa9, 0x7a, 0xa0, 0x75, 0xe0, 0x88, 0x81, + 0x1e, 0xad, 0x3e, 0x7b, 0x87, 0xaf, 0xaf, 0x6d, 0xe3, 0xcd, 0xb5, 0x6d, 0xbc, 0xbd, 0xb6, 0x8d, + 0x5f, 0x6e, 0xec, 0x99, 0x37, 0x37, 0xf6, 0xcc, 0x5f, 0x37, 0xf6, 0xcc, 0x0f, 0x6e, 0x48, 0x44, + 0xa7, 0x7b, 0xda, 0xf2, 0x69, 0xec, 0xf6, 0x93, 0x96, 0x1e, 0x9f, 0x84, 0xd4, 0xbd, 0xcc, 0x7f, + 0x6c, 0x5d, 0xa5, 0x98, 0x9f, 0x2e, 0xc8, 0xdf, 0x12, 0x9f, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, + 0x09, 0x2c, 0x96, 0x95, 0x8d, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2289,11 +2280,6 @@ func (m *MsgCreateRedeemClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.Amount != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.Amount)) - i-- - dAtA[i] = 0x18 - } if len(m.Beneficiary) > 0 { i -= len(m.Beneficiary) copy(dAtA[i:], m.Beneficiary) @@ -2752,9 +2738,6 @@ func (m *MsgCreateRedeemClaim) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } - if m.Amount != 0 { - n += 1 + sovTx(uint64(m.Amount)) - } return n } @@ -4623,25 +4606,6 @@ func (m *MsgCreateRedeemClaim) Unmarshal(dAtA []byte) error { } m.Beneficiary = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) - } - m.Amount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Amount |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) From 0ec6fba4ece563507d09549b5fe50c2377d24a95 Mon Sep 17 00:00:00 2001 From: Julian Strobl Date: Wed, 20 Mar 2024 09:48:18 +0100 Subject: [PATCH 02/19] test: run action dynamically for each module in a repository (#351) // https://stackoverflow.com/a/68746128 Signed-off-by: Julian Strobl --- .github/workflows/audit.yaml | 73 +++++++++++++++--------------------- 1 file changed, 30 insertions(+), 43 deletions(-) diff --git a/.github/workflows/audit.yaml b/.github/workflows/audit.yaml index 8d62d69..0e46004 100644 --- a/.github/workflows/audit.yaml +++ b/.github/workflows/audit.yaml @@ -6,6 +6,9 @@ on: [push] jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + directory: [".", "lib"] steps: - name: Checkout uses: actions/checkout@v4 @@ -21,7 +24,9 @@ jobs: run: go mod verify - name: Build - run: go build -v ./... + run: | + pushd ${{ matrix.directory }} + go build -v ./... proto: runs-on: ubuntu-latest @@ -52,6 +57,9 @@ jobs: gofmt: runs-on: ubuntu-latest + strategy: + matrix: + directory: [".", "lib"] steps: - name: Checkout uses: actions/checkout@v4 @@ -64,10 +72,15 @@ jobs: go-version: "1.21" - name: Run gofmt - run: if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then exit 1; fi + run: | + pushd ${{ matrix.directory }} + if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then exit 1; fi govet: runs-on: ubuntu-latest + strategy: + matrix: + directory: [".", "lib"] steps: - name: Checkout uses: actions/checkout@v4 @@ -80,10 +93,15 @@ jobs: go-version: "1.21" - name: Run go vet - run: go vet ./... + run: | + pushd ${{ matrix.directory }} + go vet ./... staticcheck: runs-on: ubuntu-latest + strategy: + matrix: + directory: [".", "lib"] steps: - name: Checkout uses: actions/checkout@v4 @@ -100,9 +118,13 @@ jobs: - name: Run staticcheck run: | + pushd ${{ matrix.directory }} staticcheck ./... golangci-lint: + strategy: + matrix: + directory: [".", "lib"] runs-on: ubuntu-latest steps: - name: Checkout @@ -120,30 +142,13 @@ jobs: - name: Run golangci-lint run: | - golangci-lint run - - golangci-lint-lib: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Go - uses: actions/setup-go@v5 - with: - go-version: "1.21" - - - name: Install golangci-lint - run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest - - - name: Run golangci-lint - run: | - pushd lib + pushd ${{ matrix.directory }} golangci-lint run gotest: + strategy: + matrix: + directory: [".", "lib"] runs-on: ubuntu-latest steps: - name: Checkout @@ -158,26 +163,8 @@ jobs: - name: Run tests run: | + pushd ${{ matrix.directory }} # Exclude generated .pb.go and .pb.gw.go files from test and coverage go test -coverprofile cover.out -race -vet=off -v $(go list ./... | grep -v types) # Print coverage by function go tool cover -func=cover.out - - gotest-lib: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Go - uses: actions/setup-go@v5 - with: - go-version: "1.21" - - - name: Run tests - run: | - pushd lib - go test -coverprofile cover.out -race -vet=off -v ./... - go tool cover -func=cover.out From 779b1edd482a191344ef2bcddc99547c812f8224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Mon, 8 Apr 2024 10:49:00 +0200 Subject: [PATCH 03/19] Eckelj/mqtt monitoring (#359) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added a MqttMonitor module with levelDB and periodic cleanup * initialized in the app * passed to dao keeper * added conversion methods (string2unixtime, byte ToJSON) * removed obsolete keeper code * maded RDDLToken.Factor public * added explicit mqtt client to the monitor module * restart mqtt connection in mqttmonitor on connection loss * adjusted mqttmock structure to be compatible * added some linter exclusions to let the monitor tool pass * created a MockMqttMonitor interface and mock object * used this to pass tests * made the MockMqttMonitor a global object so that it can be easily mocked * removed MockMqttMonitor from the app/keeper initialization * adjusted test cases to register "active machines" to the mqttmonitor * added mutex in mocks to protect against data races * defined mocks for the dao tests * clear separation between interface and mqtt-Monitor * added another waiting block to ensure the tx went through (multi-threading issue, race condition) during tests this failed sometimes * added memstorage to test instead of a file based DB Signed-off-by: Jürgen Eckel --- .golangci.yaml | 8 +- go.mod | 2 +- monitor/backend.go | 105 +++++++++++ monitor/interface.go | 73 ++++++++ monitor/mocks/mqtt_monitor.go | 37 ++++ monitor/mqtt_monitor.go | 206 +++++++++++++++++++++ monitor/mqtt_monitor_test.go | 106 +++++++++++ tests/e2e/dao/gas/gas_consumption_suite.go | 1 + tests/e2e/dao/pop/selection_suite.go | 6 + testutil/keeper/dao.go | 6 +- testutil/network/loader.go | 4 + util/determine_block_proposer.go | 14 ++ util/mocks/mqtt.go | 13 ++ util/mqtt.go | 17 +- util/mqtt_test.go | 9 + util/rddl_token.go | 6 +- util/time.go | 23 +++ util/time_test.go | 15 ++ x/dao/abci.go | 11 +- x/dao/keeper/keeper.go | 61 +----- 20 files changed, 653 insertions(+), 70 deletions(-) create mode 100644 monitor/backend.go create mode 100644 monitor/interface.go create mode 100644 monitor/mocks/mqtt_monitor.go create mode 100644 monitor/mqtt_monitor.go create mode 100644 monitor/mqtt_monitor_test.go create mode 100644 util/time.go create mode 100644 util/time_test.go diff --git a/.golangci.yaml b/.golangci.yaml index ba0e7d4..3dcd13f 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -132,4 +132,10 @@ issues: - revive - path: docs/docs\.go linters: - - revive \ No newline at end of file + - revive + - path: monitor/mqtt_monitor_test\.go + linters: + - paralleltest + - path: monitor/.*\.go + linters: + - durationcheck \ No newline at end of file diff --git a/go.mod b/go.mod index 6e56952..3fb5f8f 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 google.golang.org/grpc v1.56.3 gopkg.in/yaml.v2 v2.4.0 @@ -155,7 +156,6 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.15.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.6.0 // indirect diff --git a/monitor/backend.go b/monitor/backend.go new file mode 100644 index 0000000..218c7c2 --- /dev/null +++ b/monitor/backend.go @@ -0,0 +1,105 @@ +package monitor + +import ( + "encoding/json" + "log" + "time" + + "github.com/syndtr/goleveldb/leveldb/iterator" +) + +type LastSeenEvent struct { + Address string `binding:"required" json:"address"` + Timestamp int64 `binding:"required" json:"timestamp"` +} + +func (mms *MqttMonitor) AddParticipant(address string, lastSeenTS int64) (err error) { + // store receive address - planetmint address pair + var lastSeen LastSeenEvent + lastSeen.Address = address + lastSeen.Timestamp = lastSeenTS + + lastSeenBytes, err := json.Marshal(lastSeen) + if err != nil { + mms.Log("[Monitor] Error serializing ConversionRequest: " + err.Error()) + return + } + increaseCounter := false + // returns an error if the entry does not exist (we have to increase the counter in this case) + _, err = mms.db.Get([]byte(address), nil) + if err != nil { + increaseCounter = true + } + mms.dbMutex.Lock() + if increaseCounter { + mms.numberOfElements++ + } + err = mms.db.Put([]byte(address), lastSeenBytes, nil) + mms.dbMutex.Unlock() + if err != nil { + log.Println("[Monitor] storing addresses in DB: " + err.Error()) + return + } + return +} + +func (mms *MqttMonitor) deleteEntry(key []byte) (err error) { + mms.dbMutex.Lock() + err = mms.db.Delete(key, nil) + mms.numberOfElements-- + mms.dbMutex.Unlock() + return +} + +func (mms *MqttMonitor) getAmountOfElements() (amount int64, err error) { + iter := mms.db.NewIterator(nil, nil) + defer iter.Release() + + for iter.Next() { + amount++ + } + + // Check for any errors encountered during iteration + if err := iter.Error(); err != nil { + log.Println("[Monitor] " + err.Error()) + } + return +} +func (mms *MqttMonitor) getDataFromIter(iter iterator.Iterator) (lastSeen LastSeenEvent, err error) { + key := iter.Key() + value := iter.Value() + err = json.Unmarshal(value, &lastSeen) + if err != nil { + mms.Log("[Monitor] Failed to unmarshal entry: " + string(key) + " - " + err.Error()) + } + return +} + +func (mms *MqttMonitor) CleanupDB() { + // Create an iterator for the database + iter := mms.db.NewIterator(nil, nil) + defer iter.Release() // Make sure to release the iterator at the end + + // Iterate over all elements in the database + for iter.Next() && !mms.IsTerminated() { + // Use iter.Key() and iter.Value() to access the key and value + lastSeen, err := mms.getDataFromIter(iter) + if err != nil { + mms.Log("[Monitor] Failed to unmarshal entry: " + string(iter.Key()) + " - " + err.Error()) + continue + } + timeThreshold := time.Now().Add(-1 * mms.CleanupPeriodicityInMinutes * time.Minute).Unix() + if lastSeen.Timestamp <= timeThreshold { + // If the entry is older than 12 hours, delete it + err := mms.deleteEntry(iter.Key()) + if err != nil { + mms.Log("[Monitor] Failed to delete entry: " + err.Error()) + } + } + } + + // Check for any errors encountered during iteration + if err := iter.Error(); err != nil { + mms.Log(err.Error()) + } +} diff --git a/monitor/interface.go b/monitor/interface.go new file mode 100644 index 0000000..7789fab --- /dev/null +++ b/monitor/interface.go @@ -0,0 +1,73 @@ +package monitor + +import ( + "sync" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/planetmint/planetmint-go/config" + "github.com/syndtr/goleveldb/leveldb" +) + +type MQTTMonitorClientI interface { + AddParticipant(address string, lastSeenTS int64) (err error) + SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) + SetContext(ctx sdk.Context) + Start() (err error) +} + +var monitorMutex sync.Mutex +var mqttMonitorInstance MQTTMonitorClientI + +func SetMqttMonitorInstance(monitorInstance MQTTMonitorClientI) { + monitorMutex.Lock() + mqttMonitorInstance = monitorInstance + monitorMutex.Unlock() +} + +func LazyMqttMonitorLoader(homeDir string) { + monitorMutex.Lock() + tmpInstance := mqttMonitorInstance + monitorMutex.Unlock() + if tmpInstance != nil { + return + } + if homeDir == "" { + homeDir = "./" + } + aciveActorsDB, err := leveldb.OpenFile(homeDir+"activeActors.db", nil) + if err != nil { + panic(err) + } + monitorMutex.Lock() + mqttMonitorInstance = NewMqttMonitorService(aciveActorsDB, *config.GetConfig()) + monitorMutex.Unlock() + err = mqttMonitorInstance.Start() + if err != nil { + panic(err) + } +} + +func SetContext(ctx sdk.Context) { + monitorMutex.Lock() + mqttMonitorInstance.SetContext(ctx) + monitorMutex.Unlock() +} + +func SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) { + monitorMutex.Lock() + challenger, challengee, err = mqttMonitorInstance.SelectPoPParticipantsOutOfActiveActors() + monitorMutex.Unlock() + return +} + +func Start() (err error) { + err = mqttMonitorInstance.Start() + return +} + +func AddParticipant(address string, lastSeenTS int64) (err error) { + monitorMutex.Lock() + err = mqttMonitorInstance.AddParticipant(address, lastSeenTS) + monitorMutex.Unlock() + return +} diff --git a/monitor/mocks/mqtt_monitor.go b/monitor/mocks/mqtt_monitor.go new file mode 100644 index 0000000..a08e814 --- /dev/null +++ b/monitor/mocks/mqtt_monitor.go @@ -0,0 +1,37 @@ +package mocks + +import ( + types "github.com/cosmos/cosmos-sdk/types" +) + +// MockMQTTMonitorClientI is a mock of MQTTMonitorClientI interface. +type MockMQTTMonitorClientI struct { + myStringList []string +} + +// AddParticipant mocks base method. +func (m *MockMQTTMonitorClientI) AddParticipant(address string, _ int64) error { + m.myStringList = append(m.myStringList, address) + + return nil +} + +// SelectPoPParticipantsOutOfActiveActors mocks base method. +func (m *MockMQTTMonitorClientI) SelectPoPParticipantsOutOfActiveActors() (string, string, error) { + var challenger, challengee string + amount := len(m.myStringList) + if amount >= 2 { + challenger = m.myStringList[amount-2] + challengee = m.myStringList[amount-1] + } + return challenger, challengee, nil +} + +// SetContext mocks base method. +func (m *MockMQTTMonitorClientI) SetContext(_ types.Context) { +} + +// Start mocks base method. +func (m *MockMQTTMonitorClientI) Start() error { + return nil +} diff --git a/monitor/mqtt_monitor.go b/monitor/mqtt_monitor.go new file mode 100644 index 0000000..c3830b5 --- /dev/null +++ b/monitor/mqtt_monitor.go @@ -0,0 +1,206 @@ +package monitor + +import ( + "math/rand" + "net" + "strconv" + "strings" + "sync" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + mqtt "github.com/eclipse/paho.mqtt.golang" + "github.com/planetmint/planetmint-go/config" + "github.com/planetmint/planetmint-go/util" + "github.com/syndtr/goleveldb/leveldb" +) + +var MonitorMQTTClient util.MQTTClientI + +type MqttMonitor struct { + db *leveldb.DB + dbMutex sync.Mutex // Mutex to synchronize write operations + ticker *time.Ticker + CleanupPeriodicityInMinutes time.Duration + config config.Config + numberOfElements int64 + sdkContext *sdk.Context + contextMutex sync.Mutex + isTerminated bool + terminationMutex sync.Mutex +} + +func (mms *MqttMonitor) Terminate() { + mms.terminationMutex.Lock() + mms.isTerminated = true + mms.terminationMutex.Unlock() +} + +func (mms *MqttMonitor) IsTerminated() (isTerminated bool) { + mms.terminationMutex.Lock() + isTerminated = mms.isTerminated + mms.terminationMutex.Unlock() + return +} + +func LazyLoadMonitorMQTTClient() { + if MonitorMQTTClient != nil { + return + } + + conf := config.GetConfig() + hostPort := net.JoinHostPort(conf.MqttDomain, strconv.FormatInt(int64(conf.MqttPort), 10)) + uri := "tcp://" + hostPort + + opts := mqtt.NewClientOptions().AddBroker(uri) + opts.SetClientID(conf.ValidatorAddress + "-monitor") + opts.SetUsername(conf.MqttUser) + opts.SetPassword(conf.MqttPassword) + MonitorMQTTClient = mqtt.NewClient(opts) +} + +func NewMqttMonitorService(db *leveldb.DB, config config.Config) *MqttMonitor { + service := &MqttMonitor{db: db, config: config, numberOfElements: 0, CleanupPeriodicityInMinutes: 10} + return service +} + +func (mms *MqttMonitor) registerPeriodicTasks() { + mms.ticker = time.NewTicker(mms.CleanupPeriodicityInMinutes * time.Minute) + go func() { + for range mms.ticker.C { // Loop over the ticker channel + go mms.CleanupDB() + } + }() +} + +func (mms *MqttMonitor) Start() (err error) { + amount, err := mms.getAmountOfElements() + if err != nil { + return + } + mms.numberOfElements = amount + mms.registerPeriodicTasks() + go mms.MonitorActiveParticipants() + return +} +func (mms *MqttMonitor) getRandomNumbers() (challenger int, challengee int) { + for challenger == challengee { + // Generate random numbers + challenger = rand.Intn(int(mms.numberOfElements)) + challengee = rand.Intn(int(mms.numberOfElements)) + } + return +} +func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) { + if mms.numberOfElements < 2 { + return + } + randomChallenger, randomChallengee := mms.getRandomNumbers() + mms.Log("[Monitor] number of elements: " + strconv.Itoa(int(mms.numberOfElements))) + mms.Log("[Monitor] selected IDs: " + strconv.Itoa(randomChallenger) + " " + strconv.Itoa(randomChallengee)) + iter := mms.db.NewIterator(nil, nil) + defer iter.Release() + count := 0 + found := 0 + var lastSeen LastSeenEvent + for iter.Next() { + mms.Log("[Monitor] count: " + strconv.Itoa(count)) + if count == randomChallenger { + lastSeen, err = mms.getDataFromIter(iter) + if err != nil { + return + } + challenger = lastSeen.Address + found++ + } else if count == randomChallengee { + lastSeen, err = mms.getDataFromIter(iter) + if err != nil { + return + } + challengee = lastSeen.Address + found++ + } + + count++ + if found == 2 { + break + } + } + return +} + +func (mms *MqttMonitor) MqttMsgHandler(_ mqtt.Client, msg mqtt.Message) { + if mms.IsTerminated() { + return + } + topicParts := strings.Split(msg.Topic(), "/") + if len(topicParts) != 3 { + return + } + if topicParts[0] != "tele" { + return + } + if topicParts[2] != "STATE" { + return + } + address := topicParts[1] + valid, err := util.IsValidAddress(address) + if err != nil || !valid { + return + } + payload, err := util.ToJSON(msg.Payload()) + if err != nil { + return + } + + timeString, ok := payload["Time"].(string) + if !ok { + return + } + unixTime, err := util.String2UnixTime(timeString) + if err != nil { + return + } + err = mms.AddParticipant(address, unixTime) + if err != nil { + mms.Log("[Monitor] error adding active actor to DB: " + address + " " + err.Error()) + } else { + mms.Log("[Monitor] added active actor to DB: " + address) + } +} + +func (mms *MqttMonitor) MonitorActiveParticipants() { + LazyLoadMonitorMQTTClient() + for !mms.IsTerminated() { + if !MonitorMQTTClient.IsConnected() { + if token := MonitorMQTTClient.Connect(); token.Wait() && token.Error() != nil { + mms.Log("[Monitor] error connecting to mqtt: " + token.Error().Error()) + panic(token.Error()) + } + + var messageHandler mqtt.MessageHandler = mms.MqttMsgHandler + + // Subscribe to a topic + subscriptionTopic := "tele/#" + if token := MonitorMQTTClient.Subscribe(subscriptionTopic, 0, messageHandler); token.Wait() && token.Error() != nil { + mms.Log("[Monitor] error registering the mqtt subscription: " + token.Error().Error()) + panic(token.Error()) + } + } + time.Sleep(5 * time.Second) + } +} + +func (mms *MqttMonitor) Log(msg string) { + mms.contextMutex.Lock() + if mms.sdkContext != nil { + util.GetAppLogger().Info(*mms.sdkContext, msg) + } + mms.contextMutex.Unlock() +} + +func (mms *MqttMonitor) SetContext(ctx sdk.Context) { + mms.contextMutex.Lock() + mms.sdkContext = &ctx + mms.contextMutex.Unlock() +} diff --git a/monitor/mqtt_monitor_test.go b/monitor/mqtt_monitor_test.go new file mode 100644 index 0000000..c36c1ed --- /dev/null +++ b/monitor/mqtt_monitor_test.go @@ -0,0 +1,106 @@ +package monitor_test + +import ( + "testing" + "time" + + "github.com/planetmint/planetmint-go/config" + "github.com/planetmint/planetmint-go/monitor" + "github.com/planetmint/planetmint-go/util/mocks" + "github.com/stretchr/testify/assert" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/storage" +) + +func init() { + // Use MQTT mock client + monitor.MonitorMQTTClient = &mocks.MockMQTTClient{} +} + +const ( + challengerInput = "plmnt1fx3x6u8k5q8kjl7pamsuwjtut8nkks8dk92dek" + challengeeInput = "plmnt1fsaljz3xqf6vchkjxfzfrd30cdp3j4vqh298pr" +) + +func TestGMonitorActiveParticipants(t *testing.T) { + monitor.LazyLoadMonitorMQTTClient() + cfg := config.GetConfig() + db, err := leveldb.Open(storage.NewMemStorage(), nil) + assert.NoError(t, err) + defer db.Close() + + mqttMonitor := monitor.NewMqttMonitorService(db, *cfg) + err = mqttMonitor.Start() + assert.NoError(t, err) + + currentTime := time.Now() + unixTime := currentTime.Unix() + err = mqttMonitor.AddParticipant(challengerInput, unixTime) + assert.NoError(t, err) + err = mqttMonitor.AddParticipant(challengeeInput, unixTime) + assert.NoError(t, err) + mqttMonitor.CleanupDB() + + challenger, challengee, err := mqttMonitor.SelectPoPParticipantsOutOfActiveActors() + assert.NoError(t, err) + assert.Contains(t, challenger, "plmnt") + assert.Contains(t, challengee, "plmnt") + mqttMonitor.Terminate() +} + +func TestCleanupRemoval(t *testing.T) { + monitor.LazyLoadMonitorMQTTClient() + + cfg := config.GetConfig() + db, err := leveldb.Open(storage.NewMemStorage(), nil) + assert.NoError(t, err) + defer db.Close() + + mqttMonitor := monitor.NewMqttMonitorService(db, *cfg) + err = mqttMonitor.Start() + assert.NoError(t, err) + + currentTime := time.Now() + CleanupPeriodicityAgo := currentTime.Add(-1 * mqttMonitor.CleanupPeriodicityInMinutes * time.Minute) + unixTimeNow := currentTime.Unix() + err = mqttMonitor.AddParticipant(challengerInput, unixTimeNow) + assert.NoError(t, err) + err = mqttMonitor.AddParticipant(challengeeInput, CleanupPeriodicityAgo.Unix()-1) + assert.NoError(t, err) + mqttMonitor.CleanupDB() + + challenger, challengee, err := mqttMonitor.SelectPoPParticipantsOutOfActiveActors() + assert.NoError(t, err) + assert.Equal(t, "", challenger) + assert.Contains(t, "", challengee) + mqttMonitor.Terminate() +} + +func TestCleanupPrecisionTest(t *testing.T) { + monitor.LazyLoadMonitorMQTTClient() + + cfg := config.GetConfig() + db, err := leveldb.Open(storage.NewMemStorage(), nil) + assert.NoError(t, err) + defer db.Close() + + mqttMonitor := monitor.NewMqttMonitorService(db, *cfg) + err = mqttMonitor.Start() + assert.NoError(t, err) + + currentTime := time.Now() + CleanupThresholdAgo := currentTime.Add(-1 * mqttMonitor.CleanupPeriodicityInMinutes * time.Minute) + aboveThreshold := CleanupThresholdAgo.Unix() + 10 + unixTimeNow := currentTime.Unix() + err = mqttMonitor.AddParticipant(challengerInput, unixTimeNow) + assert.NoError(t, err) + err = mqttMonitor.AddParticipant(challengeeInput, aboveThreshold) + assert.NoError(t, err) + mqttMonitor.CleanupDB() + + challenger, challengee, err := mqttMonitor.SelectPoPParticipantsOutOfActiveActors() + assert.NoError(t, err) + assert.Contains(t, challenger, "plmnt") + assert.Contains(t, challengee, "plmnt") + mqttMonitor.Terminate() +} diff --git a/tests/e2e/dao/gas/gas_consumption_suite.go b/tests/e2e/dao/gas/gas_consumption_suite.go index f167d51..5ee6de7 100644 --- a/tests/e2e/dao/gas/gas_consumption_suite.go +++ b/tests/e2e/dao/gas/gas_consumption_suite.go @@ -132,6 +132,7 @@ func (s *ConsumptionE2ETestSuite) TestNonValidatorConsumptionOverflow() { out, err := lib.BroadcastTxWithFileLock(addr, msgs...) s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) _, err = clitestutil.GetRawLogFromTxOut(val, out) diff --git a/tests/e2e/dao/pop/selection_suite.go b/tests/e2e/dao/pop/selection_suite.go index dbe0619..60c061e 100644 --- a/tests/e2e/dao/pop/selection_suite.go +++ b/tests/e2e/dao/pop/selection_suite.go @@ -7,11 +7,13 @@ import ( "math" "os" "strconv" + "time" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" bank "github.com/cosmos/cosmos-sdk/x/bank/client/cli" "github.com/planetmint/planetmint-go/lib" + "github.com/planetmint/planetmint-go/monitor" "github.com/planetmint/planetmint-go/testutil" clitestutil "github.com/planetmint/planetmint-go/testutil/cli" e2etestutil "github.com/planetmint/planetmint-go/testutil/e2e" @@ -164,6 +166,8 @@ func (s *SelectionE2ETestSuite) TestPopSelectionNoActors() { func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { err := e2etestutil.AttestMachine(s.network, machines[0].name, machines[0].mnemonic, 0, s.feeDenom) s.Require().NoError(err) + err = monitor.AddParticipant(machines[0].address, time.Now().Unix()) + s.Require().NoError(err) out := s.perpareLocalTest() @@ -174,6 +178,8 @@ func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { func (s *SelectionE2ETestSuite) TestPopSelectionTwoActors() { err := e2etestutil.AttestMachine(s.network, machines[1].name, machines[1].mnemonic, 1, s.feeDenom) s.Require().NoError(err) + err = monitor.AddParticipant(machines[1].address, time.Now().Unix()) + s.Require().NoError(err) out := s.perpareLocalTest() diff --git a/testutil/keeper/dao.go b/testutil/keeper/dao.go index 8fc16a2..9e32731 100644 --- a/testutil/keeper/dao.go +++ b/testutil/keeper/dao.go @@ -15,14 +15,16 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/golang/mock/gomock" + "github.com/planetmint/planetmint-go/monitor" + monitormocks "github.com/planetmint/planetmint-go/monitor/mocks" "github.com/planetmint/planetmint-go/x/dao/keeper" + daotestutil "github.com/planetmint/planetmint-go/x/dao/testutil" "github.com/planetmint/planetmint-go/x/dao/types" "github.com/stretchr/testify/require" - - daotestutil "github.com/planetmint/planetmint-go/x/dao/testutil" ) func DaoKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { + monitor.SetMqttMonitorInstance(&monitormocks.MockMQTTMonitorClientI{}) storeKey := sdk.NewKVStoreKey(types.StoreKey) memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) challengeStoreKey := storetypes.NewMemoryStoreKey(types.ChallengeKey) diff --git a/testutil/network/loader.go b/testutil/network/loader.go index e27e0fd..028aaaf 100644 --- a/testutil/network/loader.go +++ b/testutil/network/loader.go @@ -15,6 +15,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/planetmint/planetmint-go/app" + "github.com/planetmint/planetmint-go/monitor" + monitormocks "github.com/planetmint/planetmint-go/monitor/mocks" "github.com/planetmint/planetmint-go/testutil/sample" "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/util/mocks" @@ -39,6 +41,8 @@ func Load(t *testing.T, configs ...Config) *Network { // use mock client for testing util.MQTTClient = &mocks.MockMQTTClient{} + monitor.MonitorMQTTClient = &mocks.MockMQTTClient{} + monitor.SetMqttMonitorInstance(&monitormocks.MockMQTTMonitorClientI{}) elements.Client = &elementsmocks.MockClient{} util.RegisterAssetServiceHTTPClient = &mocks.MockClient{} diff --git a/util/determine_block_proposer.go b/util/determine_block_proposer.go index a6db7a2..2c36834 100644 --- a/util/determine_block_proposer.go +++ b/util/determine_block_proposer.go @@ -57,3 +57,17 @@ func IsValidatorBlockProposer(ctx sdk.Context, proposerAddress []byte, rootDir s result = hexProposerAddress == validatorIdentity return } + +func IsValidAddress(address string) (valid bool, err error) { + // Attempt to decode the address + _, err = sdk.AccAddressFromBech32(address) + if err != nil { + return + } + if !strings.Contains(address, "plmnt") { + valid = false + return + } + valid = true + return +} diff --git a/util/mocks/mqtt.go b/util/mocks/mqtt.go index e6fcba3..0d6bdfd 100644 --- a/util/mocks/mqtt.go +++ b/util/mocks/mqtt.go @@ -14,6 +14,9 @@ type MockMQTTClient struct { PublishFunc func(topic string, qos byte, retained bool, payload interface{}) mqtt.Token SubscribeFunc func(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token UnsubscribeFunc func(topics ...string) mqtt.Token + IsConnectedFunc func() bool + connected bool + connectedMutex sync.Mutex } // GetConnectFunc fetches the mock client's `Connect` func @@ -96,6 +99,9 @@ func GetUnsubscribeFunc(_ ...string) mqtt.Token { // Connect is the mock client's `Disconnect` func func (m *MockMQTTClient) Connect() mqtt.Token { + m.connectedMutex.Lock() + m.connected = true + m.connectedMutex.Unlock() return GetConnectFunc() } @@ -116,3 +122,10 @@ func (m *MockMQTTClient) Subscribe(topic string, qos byte, callback mqtt.Message func (m *MockMQTTClient) Unsubscribe(topics ...string) mqtt.Token { return GetUnsubscribeFunc(topics...) } + +func (m *MockMQTTClient) IsConnected() bool { + m.connectedMutex.Lock() + connected := m.connected + m.connectedMutex.Unlock() + return connected +} diff --git a/util/mqtt.go b/util/mqtt.go index 3de4bc5..111968b 100644 --- a/util/mqtt.go +++ b/util/mqtt.go @@ -1,6 +1,7 @@ package util import ( + "encoding/json" "net" "strconv" "strings" @@ -20,6 +21,7 @@ type MQTTClientI interface { Publish(topic string, qos byte, retained bool, payload interface{}) mqtt.Token Subscribe(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token Unsubscribe(topics ...string) mqtt.Token + IsConnected() bool } var ( @@ -32,7 +34,7 @@ const ( MqttCmdPrefix = "cmnd/" ) -func lazyLoadMQTTClient() { +func LazyLoadMQTTClient() { if MQTTClient != nil { return } @@ -66,7 +68,7 @@ func SendMqttPopInitMessagesToServer(ctx sdk.Context, challenge types.Challenge) } func sendMqttPopInitMessages(challenge types.Challenge) (err error) { - lazyLoadMQTTClient() + LazyLoadMQTTClient() if token := MQTTClient.Connect(); token.Wait() && token.Error() != nil { err = token.Error() return @@ -92,7 +94,7 @@ func sendMqttPopInitMessages(challenge types.Challenge) (err error) { } func GetMqttStatusOfParticipant(address string, responseTimeoutInMs int64) (isAvailable bool, err error) { - lazyLoadMQTTClient() + LazyLoadMQTTClient() if token := MQTTClient.Connect(); token.Wait() && token.Error() != nil { err = token.Error() return @@ -142,3 +144,12 @@ func GetMqttStatusOfParticipant(address string, responseTimeoutInMs int64) (isAv MQTTClient.Disconnect(1000) return } + +func ToJSON(payload []byte) (map[string]interface{}, error) { + jsonString := string(payload) + + var result map[string]interface{} + // Unmarshal the JSON string into the map + err := json.Unmarshal([]byte(jsonString), &result) + return result, err +} diff --git a/util/mqtt_test.go b/util/mqtt_test.go index e210c17..922b6c5 100644 --- a/util/mqtt_test.go +++ b/util/mqtt_test.go @@ -31,3 +31,12 @@ func TestGetMqttStatusOfParticipantMocked(t *testing.T) { assert.NoError(t, err) assert.True(t, isAvailable) } + +func TestToJSON(t *testing.T) { + t.Parallel() + payload := []byte(`{"Time":"2024-03-26T11:50:42","Uptime":"0T00:50:19","UptimeSec":3019,"Heap":97,"SleepMode":"Dynamic","Sleep":10,"LoadAvg":99,"MqttCount":2,"Berry":{"HeapUsed":27,"Objects":491},"POWER1":"ON","POWER2":"ON","Dimmer":17,"Color":"00182C","HSBColor":"207,100,17","Channel":[0,9,17],"Scheme":0,"Width":1,"Fade":"OFF","Speed":1,"LedTable":"ON","Wifi":{"AP":1,"SSId":"UPC5729E56","BSSId":"C2:14:7E:6F:BC:C5","Channel":11,"Mode":"11n","RSSI":96,"Signal":-52,"LinkCount":1,"Downtime":"0T00:00:10"}}`) + + result, err := ToJSON(payload) + assert.NoError(t, err) + assert.Equal(t, 21, len(result)) +} diff --git a/util/rddl_token.go b/util/rddl_token.go index 6eb47b2..63b121b 100644 --- a/util/rddl_token.go +++ b/util/rddl_token.go @@ -5,15 +5,15 @@ import ( ) const ( - factor = 100000000.0 + Factor = 100000000.0 ) func RDDLToken2Uint(amount float64) uint64 { - return uint64(amount * factor) + return uint64(amount * Factor) } func RDDLToken2Float(amount uint64) float64 { - return float64(amount) / factor + return float64(amount) / Factor } func RDDLTokenStringToFloat(amount string) (amountFloat float64, err error) { diff --git a/util/time.go b/util/time.go new file mode 100644 index 0000000..e718b38 --- /dev/null +++ b/util/time.go @@ -0,0 +1,23 @@ +package util + +import ( + "time" +) + +func String2UnixTime(timeInput string) (int64, error) { + // Layout specifying the format of the input string + // Note: Go uses a specific reference time (Mon Jan 2 15:04:05 MST 2006) to define format layouts + layout := "2006-01-02T15:04:05" + + // Parse the string into a time.Time struct in local time zone + parsedTime, err := time.Parse(layout, timeInput) + if err != nil { + return 0, err + } + + // Convert to UTC if not already + utcTime := parsedTime.UTC() + unixTime := utcTime.Unix() + + return unixTime, nil +} diff --git a/util/time_test.go b/util/time_test.go new file mode 100644 index 0000000..d56c517 --- /dev/null +++ b/util/time_test.go @@ -0,0 +1,15 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestString2UnixTime(t *testing.T) { + t.Parallel() + input := "2024-03-26T11:10:41" + unixTime, err := String2UnixTime(input) + assert.NoError(t, err) + assert.Equal(t, int64(1711451441), unixTime) +} diff --git a/x/dao/abci.go b/x/dao/abci.go index f412597..49680f0 100644 --- a/x/dao/abci.go +++ b/x/dao/abci.go @@ -3,6 +3,7 @@ package dao import ( "encoding/hex" + "github.com/planetmint/planetmint-go/monitor" "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/dao/keeper" @@ -23,7 +24,15 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) hexProposerAddress := hex.EncodeToString(proposerAddress) if isPopHeight(ctx, k, currentBlockHeight) { // select PoP participants - challenger, challengee := k.SelectPopParticipants(ctx) + monitor.SetContext(ctx) + challenger, challengee, err := monitor.SelectPoPParticipantsOutOfActiveActors() + if err != nil { + util.GetAppLogger().Error(ctx, "error during PoP Participant selection ", err) + } + if err != nil || challenger == "" || challengee == "" { + challenger = "" + challengee = "" + } // Init PoP - independent from challenger and challengee // The keeper will send the MQTT initializing message to challenger && challengee diff --git a/x/dao/keeper/keeper.go b/x/dao/keeper/keeper.go index de10ec9..c9d9414 100644 --- a/x/dao/keeper/keeper.go +++ b/x/dao/keeper/keeper.go @@ -1,16 +1,13 @@ package keeper import ( - db "github.com/cometbft/cometbft-db" "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/store/prefix" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/planetmint/planetmint-go/util" + "github.com/planetmint/planetmint-go/monitor" "github.com/planetmint/planetmint-go/x/dao/types" ) @@ -53,7 +50,7 @@ func NewKeeper( if !ps.HasKeyTable() { ps = ps.WithKeyTable(types.ParamKeyTable()) } - + monitor.LazyMqttMonitorLoader(rootDir) return &Keeper{ cdc: cdc, storeKey: storeKey, @@ -75,57 +72,3 @@ func NewKeeper( func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", "x/"+types.ModuleName) } - -func (k Keeper) SelectPopParticipants(ctx sdk.Context) (challenger string, challengee string) { - var startAccountNumber uint64 - lastPopHeight := ctx.BlockHeight() - k.GetParams(ctx).PopEpochs - lastPop, found := k.LookupChallenge(ctx, lastPopHeight) - if lastPopHeight > 0 && found && lastPop.Challengee != "" { - lastAccountAddr := sdk.MustAccAddressFromBech32(lastPop.Challengee) - lastAccount := k.accountKeeper.GetAccount(ctx, lastAccountAddr) - startAccountNumber = lastAccount.GetAccountNumber() + 1 - } - - var participants []sdk.AccAddress - k.iterateAccountsForMachines(ctx, startAccountNumber, &participants, true) - if len(participants) != 2 { - k.iterateAccountsForMachines(ctx, startAccountNumber, &participants, false) - } - - // Not enough participants - if len(participants) != 2 { - return - } - - challenger = participants[0].String() - challengee = participants[1].String() - - return -} - -func (k Keeper) iterateAccountsForMachines(ctx sdk.Context, start uint64, participants *[]sdk.AccAddress, iterateFromStart bool) { - store := ctx.KVStore(k.accountKeeperKey) - accountStore := prefix.NewStore(store, authtypes.AccountNumberStoreKeyPrefix) - var iterator db.Iterator - if iterateFromStart { - iterator = accountStore.Iterator(sdk.Uint64ToBigEndian(start), nil) - } else { - iterator = accountStore.Iterator(nil, sdk.Uint64ToBigEndian(start)) - } - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - participant := sdk.AccAddress(iterator.Value()) - _, found := k.machineKeeper.GetMachineIndexByAddress(ctx, participant.String()) - if found { - available, err := util.GetMqttStatusOfParticipant(participant.String(), k.GetParams(ctx).MqttResponseTimeout) - if err == nil && available { - *participants = append(*participants, participant) - } - } - - if len(*participants) == 2 { - return - } - } -} From 0fd12a563c6490f436c730bd7494abef28ae5810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Mon, 8 Apr 2024 14:42:54 +0200 Subject: [PATCH 04/19] added to wait for another block to ensure the tx went through (#365) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jürgen Eckel --- tests/e2e/dao/basic/suite.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/e2e/dao/basic/suite.go b/tests/e2e/dao/basic/suite.go index 25fdc83..19e05b1 100644 --- a/tests/e2e/dao/basic/suite.go +++ b/tests/e2e/dao/basic/suite.go @@ -120,6 +120,7 @@ func (s *E2ETestSuite) TestMintToken() { out, err := e2etestutil.BuildSignBroadcastTx(s.T(), val.Address, msg1) s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) rawLog, err := clitestutil.GetRawLogFromTxOut(val, out) s.Require().NoError(err) From 1983890fb8cc4420924fd1dfacebef959df19557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Tue, 9 Apr 2024 13:49:51 +0200 Subject: [PATCH 05/19] Adjusting to newest version of elements-rpc (#353) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added tests (for the sake of on-demand local tests) * added wrapping the first parameters of the calls into `"` * using newest elements RPC from now on (>=1.0.0) * removed print outputs * removed parallel testing from util/elementsd_connector_test.go Signed-off-by: Jürgen Eckel --- .golangci.yaml | 5 ++- go.mod | 13 ++++---- go.sum | 52 +++++++++++++++++------------- util/elementsd_connector.go | 16 +++++----- util/elementsd_connector_test.go | 54 ++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 37 deletions(-) create mode 100644 util/elementsd_connector_test.go diff --git a/.golangci.yaml b/.golangci.yaml index 3dcd13f..37898f4 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -133,9 +133,12 @@ issues: - path: docs/docs\.go linters: - revive + - path: util/elementsd_connector_test\.go + linters: + - paralleltest - path: monitor/mqtt_monitor_test\.go linters: - paralleltest - path: monitor/.*\.go linters: - - durationcheck \ No newline at end of file + - durationcheck diff --git a/go.mod b/go.mod index 3fb5f8f..efb6a08 100644 --- a/go.mod +++ b/go.mod @@ -24,11 +24,11 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 github.com/planetmint/planetmint-go/lib v0.5.0 - github.com/rddl-network/elements-rpc v0.5.2 - github.com/spf13/cast v1.5.0 + github.com/rddl-network/elements-rpc v1.0.0 + github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 google.golang.org/grpc v1.56.3 @@ -87,6 +87,7 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.23.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect + github.com/gin-gonic/gin v1.9.1 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -138,7 +139,7 @@ require ( github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.7 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -152,9 +153,9 @@ require ( github.com/rs/cors v1.8.3 // indirect github.com/rs/zerolog v1.30.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/spf13/afero v1.9.3 // indirect + github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.15.0 // indirect + github.com/spf13/viper v1.16.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/go-amino v0.16.0 // indirect diff --git a/go.sum b/go.sum index aecc387..bce4260 100644 --- a/go.sum +++ b/go.sum @@ -284,6 +284,7 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -297,6 +298,7 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -433,11 +435,12 @@ github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -445,7 +448,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -464,11 +468,11 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= @@ -477,7 +481,7 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -723,6 +727,7 @@ github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -735,7 +740,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -837,8 +842,8 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= -github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= @@ -893,8 +898,8 @@ github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Ung github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rddl-network/elements-rpc v0.5.2 h1:gHCJEJR72/bi98gSfLCL5GHxAJnWZIrhkUwCpvLA5j0= -github.com/rddl-network/elements-rpc v0.5.2/go.mod h1:WOSYDMhq+V74lReSInnSejbdEyGI8hiQZSn4cSoFuxo= +github.com/rddl-network/elements-rpc v1.0.0 h1:geFcsaD1t2ONxRC13semPpiOwsJl0ZCfkFT9UIKPZFk= +github.com/rddl-network/elements-rpc v1.0.0/go.mod h1:E35cJMXZqe1iEo/AvjwSWn25mHZ4+y4gV8qj0lWle5c= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -929,11 +934,11 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= @@ -946,16 +951,16 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -965,8 +970,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -979,11 +985,12 @@ github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1025,6 +1032,7 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1039,8 +1047,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= diff --git a/util/elementsd_connector.go b/util/elementsd_connector.go index e6021b4..c10931f 100644 --- a/util/elementsd_connector.go +++ b/util/elementsd_connector.go @@ -24,7 +24,7 @@ func ReissueAsset(reissueTx string) (txID string, err error) { cmdArgs := strings.Split(reissueTx, " ") elementsSyncAccess.Lock() defer elementsSyncAccess.Unlock() - result, err := elements.ReissueAsset(url, []string{cmdArgs[1], cmdArgs[2]}) + result, err := elements.ReissueAsset(url, []string{`"` + cmdArgs[1] + `"`, cmdArgs[2]}) if err != nil { return } @@ -39,7 +39,7 @@ func DistributeAsset(address string, amount string, reissuanceAsset string) (txI elementsSyncAccess.Lock() defer elementsSyncAccess.Unlock() txID, err = elements.SendToAddress(url, []string{ - address, + `"` + address + `"`, `"` + amount + `"`, `""`, `""`, @@ -62,7 +62,7 @@ func IssueNFTAsset(name string, machineAddress string, domain string) (assetID s return } - addressInfo, err := elements.GetAddressInfo(url, []string{address}) + addressInfo, err := elements.GetAddressInfo(url, []string{`"` + address + `"`}) if err != nil { return } @@ -74,7 +74,7 @@ func IssueNFTAsset(name string, machineAddress string, domain string) (assetID s return } - fundRawTransactionResult, err := elements.FundRawTransaction(url, []string{hex, `{"feeRate":0.00001000}`}) + fundRawTransactionResult, err := elements.FundRawTransaction(url, []string{`"` + hex + `"`, `{"feeRate":0.00001000}`}) if err != nil { return } @@ -109,7 +109,7 @@ func IssueNFTAsset(name string, machineAddress string, domain string) (assetID s hash[i], hash[j] = hash[j], hash[i] } - rawIssueAssetResults, err := elements.RawIssueAsset(url, []string{fundRawTransactionResult.Hex, + rawIssueAssetResults, err := elements.RawIssueAsset(url, []string{`"` + fundRawTransactionResult.Hex + `"`, `[{"asset_amount":0.00000001, "asset_address":"` + address + `", "blind":false, "contract_hash":"` + fmt.Sprintf("%+x", hash) + `"}]`, }) if err != nil { @@ -117,13 +117,13 @@ func IssueNFTAsset(name string, machineAddress string, domain string) (assetID s } rawIssueAssetResult := rawIssueAssetResults[len(rawIssueAssetResults)-1] - hex, err = elements.BlindRawTransaction(url, []string{rawIssueAssetResult.Hex, `true`, `[]`, `false`}) + hex, err = elements.BlindRawTransaction(url, []string{`"` + rawIssueAssetResult.Hex + `"`, `true`, `[]`, `false`}) if err != nil { return } assetID = rawIssueAssetResult.Asset - signRawTransactionWithWalletResult, err := elements.SignRawTransactionWithWallet(url, []string{hex}) + signRawTransactionWithWalletResult, err := elements.SignRawTransactionWithWallet(url, []string{`"` + hex + `"`}) if err != nil { return } @@ -139,7 +139,7 @@ func IssueNFTAsset(name string, machineAddress string, domain string) (assetID s return } - hex, err = elements.SendRawTransaction(url, []string{signRawTransactionWithWalletResult.Hex}) + hex, err = elements.SendRawTransaction(url, []string{`"` + signRawTransactionWithWalletResult.Hex + `"`}) if err != nil { return } diff --git a/util/elementsd_connector_test.go b/util/elementsd_connector_test.go new file mode 100644 index 0000000..0a53789 --- /dev/null +++ b/util/elementsd_connector_test.go @@ -0,0 +1,54 @@ +package util_test + +import ( + "math/rand" + "strconv" + "sync" + "testing" + + "github.com/planetmint/planetmint-go/testutil/moduleobject" + "github.com/planetmint/planetmint-go/testutil/sample" + "github.com/planetmint/planetmint-go/util" + "github.com/planetmint/planetmint-go/x/machine/types" + elements "github.com/rddl-network/elements-rpc" + elementsmocks "github.com/rddl-network/elements-rpc/utils/mocks" + "github.com/stretchr/testify/assert" +) + +func TestReissueAsset(t *testing.T) { + elements.Client = &elementsmocks.MockClient{} + _, err := util.ReissueAsset("reissueasset 06c20c8de513527f1ae6c901f74a05126525ac2d7e89306f4a7fd5ec4e674403 900.000") + assert.NoError(t, err) +} + +func TestDistributeAsset(t *testing.T) { + elements.Client = &elementsmocks.MockClient{} + + _, err := util.DistributeAsset( + "tlq1qqt5078sef4aqls29c3j3pwfmukgjug70t37x26gwyhzpdxmtmjmphar88fwsl9qcm559jevve772prhtuyf9xkxdtrhvuce6a", + "20", + "06c20c8de513527f1ae6c901f74a05126525ac2d7e89306f4a7fd5ec4e674403") + assert.NoError(t, err) +} + +func TestIssueNFTAsset(t *testing.T) { + elements.Client = &elementsmocks.MockClient{} + + params := types.DefaultParams() + var wg sync.WaitGroup + + for i := 0; i < 1; i++ { + wg.Add(1) + go func() { + randomInt := rand.Int() + sk, pk := sample.KeyPair(randomInt) + machine := moduleobject.MachineRandom(pk, pk, sk, "address "+strconv.Itoa(randomInt), randomInt) + + _, _, _, err := util.IssueNFTAsset(machine.Name, machine.Address, params.AssetRegistryDomain) + assert.NoError(t, err) + + wg.Done() + }() + } + wg.Wait() +} From 5e2b307a70ec32ce7f8ab850d72ada4e55505d1b Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger <64837895+LaurentMontBlanc@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:07:40 +0200 Subject: [PATCH 06/19] 368 make attestmachine msgtx with fee=zero (#372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * no fee deduction in case of machineattestation messages * no gas price for machineattestations in lib/tx * test: add balance check to machine attestation e2e test Signed-off-by: Jürgen Eckel Signed-off-by: Lorenz Herzberger --- app/ante/deduct_fee_decorator.go | 4 ++++ lib/tx.go | 28 +++++++++++++++++++------ tests/e2e/machine/suite.go | 36 ++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/app/ante/deduct_fee_decorator.go b/app/ante/deduct_fee_decorator.go index 4299e6b..f14985e 100644 --- a/app/ante/deduct_fee_decorator.go +++ b/app/ante/deduct_fee_decorator.go @@ -84,6 +84,10 @@ func (dfd DeductFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bo var ( err error ) + msgs := tx.GetMsgs() + if len(msgs) == 1 && sdk.MsgTypeURL(msgs[0]) == "/planetmintgo.machine.MsgAttestMachine" { + return next(ctx, tx, simulate) + } fee := feeTx.GetFee() if !simulate { diff --git a/lib/tx.go b/lib/tx.go index 7bbe213..55d468d 100644 --- a/lib/tx.go +++ b/lib/tx.go @@ -37,7 +37,7 @@ func getAccountNumberAndSequence(clientCtx client.Context) (accountNumber, seque return } -func getClientContextAndTxFactory(fromAddress sdk.AccAddress) (clientCtx client.Context, txf tx.Factory, err error) { +func getClientContextAndTxFactory(fromAddress sdk.AccAddress, withoutFee bool) (clientCtx client.Context, txf tx.Factory, err error) { clientCtx = GetConfig().clientCtx // at least we need an account retriever // it would be better to check for an empty client context, but that does not work at the moment @@ -60,18 +60,22 @@ func getClientContextAndTxFactory(fromAddress sdk.AccAddress) (clientCtx client. if err != nil { return } - txf = getTxFactoryWithAccountNumberAndSequence(clientCtx, accountNumber, sequence) + gasPrice := "0.000005" + if withoutFee { + gasPrice = "0.0" + } + txf = getTxFactoryWithAccountNumberAndSequence(clientCtx, accountNumber, sequence, gasPrice) return } -func getTxFactoryWithAccountNumberAndSequence(clientCtx client.Context, accountNumber, sequence uint64) (txf tx.Factory) { +func getTxFactoryWithAccountNumberAndSequence(clientCtx client.Context, accountNumber, sequence uint64, gasPrice string) (txf tx.Factory) { return tx.Factory{}. WithAccountNumber(accountNumber). WithAccountRetriever(clientCtx.AccountRetriever). WithChainID(clientCtx.ChainID). WithFeeGranter(clientCtx.FeeGranter). WithGas(GetConfig().txGas). - WithGasPrices("0.000005" + GetConfig().feeDenom). + WithGasPrices(gasPrice + GetConfig().feeDenom). WithKeybase(clientCtx.Keyring). WithSequence(sequence). WithTxConfig(clientCtx.TxConfig) @@ -128,10 +132,21 @@ func getClientContext(fromAddress sdk.AccAddress) (clientCtx client.Context, err return } +func isMachineAttestationMsg(msgs ...sdk.Msg) (isMachineAttestation bool) { + if len(msgs) != 1 { + return + } + if sdk.MsgTypeURL(msgs[0]) == "/planetmintgo.machine.MsgAttestMachine" { + isMachineAttestation = true + } + return +} + // BuildUnsignedTx builds a transaction to be signed given a set of messages. // Once created, the fee, memo, and messages are set. func BuildUnsignedTx(fromAddress sdk.AccAddress, msgs ...sdk.Msg) (txJSON string, err error) { - clientCtx, txf, err := getClientContextAndTxFactory(fromAddress) + withoutFee := isMachineAttestationMsg(msgs...) + clientCtx, txf, err := getClientContextAndTxFactory(fromAddress, withoutFee) if err != nil { return } @@ -197,7 +212,8 @@ func BroadcastTxWithFileLock(fromAddress sdk.AccAddress, msgs ...sdk.Msg) (out * }() // get basic chain information - clientCtx, txf, err := getClientContextAndTxFactory(fromAddress) + withoutFee := isMachineAttestationMsg(msgs...) + clientCtx, txf, err := getClientContextAndTxFactory(fromAddress, withoutFee) if err != nil { return } diff --git a/tests/e2e/machine/suite.go b/tests/e2e/machine/suite.go index 3f38e93..4b1de37 100644 --- a/tests/e2e/machine/suite.go +++ b/tests/e2e/machine/suite.go @@ -1,6 +1,8 @@ package machine import ( + "bytes" + "github.com/planetmint/planetmint-go/lib" clitestutil "github.com/planetmint/planetmint-go/testutil/cli" "github.com/planetmint/planetmint-go/testutil/network" @@ -11,6 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" + txcli "github.com/cosmos/cosmos-sdk/x/auth/tx" + bank "github.com/cosmos/cosmos-sdk/x/bank/client/cli" "github.com/cosmos/cosmos-sdk/x/feegrant" e2etestutil "github.com/planetmint/planetmint-go/testutil/e2e" "github.com/stretchr/testify/assert" @@ -74,6 +78,17 @@ func (s *E2ETestSuite) TestAttestMachine() { s.Require().NoError(err) addr, _ := k.GetAddress() + // Check preAttestationBalance in order to verify that it doesn't change after machine attestation + preAttestationBalanceOutput, err := clitestutil.ExecTestCLICmd(val.ClientCtx, bank.GetBalancesCmd(), []string{ + addr.String(), + }) + s.Require().NoError(err) + preAttestationBalance, ok := preAttestationBalanceOutput.(*bytes.Buffer) + if !ok { + err = lib.ErrTypeAssertionFailed + s.Require().NoError(err) + } + machine := moduleobject.Machine(sample.Name, pubKey, prvKey, addr.String()) msg2 := machinetypes.NewMsgAttestMachine(addr.String(), &machine) out, err = e2etestutil.BuildSignBroadcastTx(s.T(), addr, msg2) @@ -95,6 +110,27 @@ func (s *E2ETestSuite) TestAttestMachine() { _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, machinecli.CmdGetMachineByPublicKey(), args) s.Require().NoError(err) + txResponse, err := lib.GetTxResponseFromOut(out) + s.Require().NoError(err) + + txResp, err := txcli.QueryTx(val.ClientCtx, txResponse.TxHash) + s.Require().NoError(err) + + assert.Contains(s.T(), txResp.TxHash, txResponse.TxHash) + s.Require().NoError(err) + + // Check postAttestationBalance as it should be the same as prior to the machine attestation + postAttestationBalanceOutput, err := clitestutil.ExecTestCLICmd(val.ClientCtx, bank.GetBalancesCmd(), []string{ + addr.String(), + }) + s.Require().NoError(err) + postAttestationBalance, ok := postAttestationBalanceOutput.(*bytes.Buffer) + if !ok { + err = lib.ErrTypeAssertionFailed + s.Require().NoError(err) + } + + assert.Equal(s.T(), preAttestationBalance, postAttestationBalance) } func (s *E2ETestSuite) TestInvalidAttestMachine() { From 43d152fcf6eecb4d6df6dc6d559971339fdcfdee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Tue, 23 Apr 2024 12:00:31 +0200 Subject: [PATCH 07/19] Donate tokens to attested machines so that these are able to run after their attestation (#375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added donation of tokens/denom to the just attestet machine * extended the machine module to have two additional parameters: amount of tokens to be distributed and their denominator Signed-off-by: Jürgen Eckel --- docs/static/openapi.yml | 15 ++ proto/planetmintgo/machine/params.proto | 2 + tests/e2e/machine/suite.go | 7 +- util/issue_commands.go | 13 ++ x/machine/keeper/msg_server_attest_machine.go | 17 +++ x/machine/types/errors.go | 2 + x/machine/types/params.go | 13 +- x/machine/types/params.pb.go | 128 +++++++++++++++--- 8 files changed, 170 insertions(+), 27 deletions(-) diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml index 4c5c954..e0d11ec 100644 --- a/docs/static/openapi.yml +++ b/docs/static/openapi.yml @@ -47644,6 +47644,11 @@ paths: type: string asset_registry_path: type: string + dao_machine_funding_amount: + type: string + format: uint64 + dao_machine_funding_denom: + type: string description: >- QueryParamsResponse is response type for the Query/Params RPC method. @@ -77177,6 +77182,11 @@ definitions: type: string asset_registry_path: type: string + dao_machine_funding_amount: + type: string + format: uint64 + dao_machine_funding_denom: + type: string description: Params defines the parameters for the module. planetmintgo.machine.QueryGetLiquidAssetsByMachineidResponse: type: object @@ -77300,6 +77310,11 @@ definitions: type: string asset_registry_path: type: string + dao_machine_funding_amount: + type: string + format: uint64 + dao_machine_funding_denom: + type: string description: QueryParamsResponse is response type for the Query/Params RPC method. planetmintgo.machine.TrustAnchor: type: object diff --git a/proto/planetmintgo/machine/params.proto b/proto/planetmintgo/machine/params.proto index 08cd122..5b6c43d 100644 --- a/proto/planetmintgo/machine/params.proto +++ b/proto/planetmintgo/machine/params.proto @@ -11,4 +11,6 @@ message Params { string asset_registry_scheme =1; string asset_registry_domain =2; string asset_registry_path =3; + uint64 dao_machine_funding_amount = 4; + string dao_machine_funding_denom = 5; } diff --git a/tests/e2e/machine/suite.go b/tests/e2e/machine/suite.go index 4b1de37..029f8ba 100644 --- a/tests/e2e/machine/suite.go +++ b/tests/e2e/machine/suite.go @@ -88,6 +88,7 @@ func (s *E2ETestSuite) TestAttestMachine() { err = lib.ErrTypeAssertionFailed s.Require().NoError(err) } + assert.Contains(s.T(), preAttestationBalance.String(), "10000") machine := moduleobject.Machine(sample.Name, pubKey, prvKey, addr.String()) msg2 := machinetypes.NewMsgAttestMachine(addr.String(), &machine) @@ -98,6 +99,7 @@ func (s *E2ETestSuite) TestAttestMachine() { s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) + s.Require().NoError(s.network.WaitForNextBlock()) rawLog, err = clitestutil.GetRawLogFromTxOut(val, out) s.Require().NoError(err) @@ -119,7 +121,7 @@ func (s *E2ETestSuite) TestAttestMachine() { assert.Contains(s.T(), txResp.TxHash, txResponse.TxHash) s.Require().NoError(err) - // Check postAttestationBalance as it should be the same as prior to the machine attestation + // Check postAttestationBalance it should be the preAttestationBalance + th 8800 tokens being donated to the machine (no fees are taken) postAttestationBalanceOutput, err := clitestutil.ExecTestCLICmd(val.ClientCtx, bank.GetBalancesCmd(), []string{ addr.String(), }) @@ -129,8 +131,7 @@ func (s *E2ETestSuite) TestAttestMachine() { err = lib.ErrTypeAssertionFailed s.Require().NoError(err) } - - assert.Equal(s.T(), preAttestationBalance, postAttestationBalance) + assert.Contains(s.T(), postAttestationBalance.String(), "18800") } func (s *E2ETestSuite) TestInvalidAttestMachine() { diff --git a/util/issue_commands.go b/util/issue_commands.go index b46bcd4..89d42a8 100644 --- a/util/issue_commands.go +++ b/util/issue_commands.go @@ -4,6 +4,7 @@ import ( "context" sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/planetmint/planetmint-go/config" "github.com/planetmint/planetmint-go/lib" daotypes "github.com/planetmint/planetmint-go/x/dao/types" @@ -99,3 +100,15 @@ func SendUpdateRedeemClaim(goCtx context.Context, beneficiary string, id uint64, loggingContext := "redeem claim" buildSignBroadcastTx(goCtx, loggingContext, sendingValidatorAddress, msg) } + +func SendTokens(goCtx context.Context, beneficiary sdk.AccAddress, amount uint64, denominator string) { + sendingValidatorAddress := config.GetConfig().ValidatorAddress + + coin := sdk.NewCoin(denominator, sdk.NewIntFromUint64(amount)) + coins := sdk.NewCoins(coin) + orgAddr := sdk.MustAccAddressFromBech32(sendingValidatorAddress) + msg := banktypes.NewMsgSend(orgAddr, beneficiary, coins) + + loggingContext := "sending " + denominator + " tokens" + buildSignBroadcastTx(goCtx, loggingContext, sendingValidatorAddress, msg) +} diff --git a/x/machine/keeper/msg_server_attest_machine.go b/x/machine/keeper/msg_server_attest_machine.go index 5176bab..21e952e 100644 --- a/x/machine/keeper/msg_server_attest_machine.go +++ b/x/machine/keeper/msg_server_attest_machine.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "fmt" config "github.com/planetmint/planetmint-go/config" "github.com/planetmint/planetmint-go/util" @@ -50,6 +51,8 @@ func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMach } else { util.GetAppLogger().Info(ctx, "Machine NFT issuance successful: "+msg.Machine.String()) } + + k.sendInitialFundingTokensToMachine(goCtx, msg.GetMachine().GetAddress(), params) } else { util.GetAppLogger().Info(ctx, "Not block proposer: skipping Machine NFT issuance") } @@ -60,9 +63,23 @@ func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMach if err != nil { return nil, err } + return &types.MsgAttestMachineResponse{}, err } +func (k msgServer) sendInitialFundingTokensToMachine(goCtx context.Context, machineAddressString string, keeperParams types.Params) { + ctx := sdk.UnwrapSDKContext(goCtx) + machineAddress, err := sdk.AccAddressFromBech32(machineAddressString) + if err != nil { + util.GetAppLogger().Error(ctx, "error: for provided address "+machineAddress.String()) + return + } + + logMsg := fmt.Sprintf("transferring %v tokens to address %s", keeperParams.GetDaoMachineFundingAmount(), machineAddress.String()) + util.GetAppLogger().Info(ctx, logMsg) + util.SendTokens(goCtx, machineAddress, keeperParams.GetDaoMachineFundingAmount(), keeperParams.GetDaoMachineFundingDenom()) +} + func validateExtendedPublicKey(issuer string, cfg chaincfg.Params) bool { xpubKey, err := hdkeychain.NewKeyFromString(issuer) if err != nil { diff --git a/x/machine/types/errors.go b/x/machine/types/errors.go index 1fa6a54..1613f53 100644 --- a/x/machine/types/errors.go +++ b/x/machine/types/errors.go @@ -21,4 +21,6 @@ var ( ErrAssetRegistryReqFailure = errorsmod.Register(ModuleName, 13, "request to asset registry could not be created") ErrAssetRegistryReqSending = errorsmod.Register(ModuleName, 14, "request to asset registry could not be sent") ErrAssetRegistryRepsonse = errorsmod.Register(ModuleName, 15, "request response issue") + ErrInvalidAddress = errorsmod.Register(ModuleName, 16, "invalid address") + ErrTransferFailed = errorsmod.Register(ModuleName, 17, "transfer failed") ) diff --git a/x/machine/types/params.go b/x/machine/types/params.go index 5eecf07..2398da0 100644 --- a/x/machine/types/params.go +++ b/x/machine/types/params.go @@ -13,17 +13,20 @@ func ParamKeyTable() paramtypes.KeyTable { } // NewParams creates a new Params instance -func NewParams(assetRegistryScheme string, assetRegistryDomain string, assetRegistryPath string) Params { +func NewParams(assetRegistryScheme string, assetRegistryDomain string, assetRegistryPath string, + daoMachineFundingAmount uint64, daoMachineFundingDenom string) Params { return Params{ - AssetRegistryScheme: assetRegistryScheme, - AssetRegistryDomain: assetRegistryDomain, - AssetRegistryPath: assetRegistryPath, + AssetRegistryScheme: assetRegistryScheme, + AssetRegistryDomain: assetRegistryDomain, + AssetRegistryPath: assetRegistryPath, + DaoMachineFundingAmount: daoMachineFundingAmount, + DaoMachineFundingDenom: daoMachineFundingDenom, } } // DefaultParams returns a default set of parameters func DefaultParams() Params { - return NewParams("https", "testnet-assets.rddl.io", "register_asset") + return NewParams("https", "testnet-assets.rddl.io", "register_asset", 8800, "plmnt") } // ParamSetPairs get the params.ParamSet diff --git a/x/machine/types/params.pb.go b/x/machine/types/params.pb.go index 67e24e1..9771547 100644 --- a/x/machine/types/params.pb.go +++ b/x/machine/types/params.pb.go @@ -25,9 +25,11 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // Params defines the parameters for the module. type Params struct { - AssetRegistryScheme string `protobuf:"bytes,1,opt,name=asset_registry_scheme,json=assetRegistryScheme,proto3" json:"asset_registry_scheme,omitempty"` - AssetRegistryDomain string `protobuf:"bytes,2,opt,name=asset_registry_domain,json=assetRegistryDomain,proto3" json:"asset_registry_domain,omitempty"` - AssetRegistryPath string `protobuf:"bytes,3,opt,name=asset_registry_path,json=assetRegistryPath,proto3" json:"asset_registry_path,omitempty"` + AssetRegistryScheme string `protobuf:"bytes,1,opt,name=asset_registry_scheme,json=assetRegistryScheme,proto3" json:"asset_registry_scheme,omitempty"` + AssetRegistryDomain string `protobuf:"bytes,2,opt,name=asset_registry_domain,json=assetRegistryDomain,proto3" json:"asset_registry_domain,omitempty"` + AssetRegistryPath string `protobuf:"bytes,3,opt,name=asset_registry_path,json=assetRegistryPath,proto3" json:"asset_registry_path,omitempty"` + DaoMachineFundingAmount uint64 `protobuf:"varint,4,opt,name=dao_machine_funding_amount,json=daoMachineFundingAmount,proto3" json:"dao_machine_funding_amount,omitempty"` + DaoMachineFundingDenom string `protobuf:"bytes,5,opt,name=dao_machine_funding_denom,json=daoMachineFundingDenom,proto3" json:"dao_machine_funding_denom,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -83,6 +85,20 @@ func (m *Params) GetAssetRegistryPath() string { return "" } +func (m *Params) GetDaoMachineFundingAmount() uint64 { + if m != nil { + return m.DaoMachineFundingAmount + } + return 0 +} + +func (m *Params) GetDaoMachineFundingDenom() string { + if m != nil { + return m.DaoMachineFundingDenom + } + return "" +} + func init() { proto.RegisterType((*Params)(nil), "planetmintgo.machine.Params") } @@ -90,22 +106,26 @@ func init() { func init() { proto.RegisterFile("planetmintgo/machine/params.proto", fileDescriptor_84cd778d65e6639c) } var fileDescriptor_84cd778d65e6639c = []byte{ - // 233 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2c, 0xc8, 0x49, 0xcc, - 0x4b, 0x2d, 0xc9, 0xcd, 0xcc, 0x2b, 0x49, 0xcf, 0xd7, 0xcf, 0x4d, 0x4c, 0xce, 0xc8, 0xcc, 0x4b, - 0xd5, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x41, - 0x56, 0xa2, 0x07, 0x55, 0x22, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x56, 0xa0, 0x0f, 0x62, 0x41, - 0xd4, 0x2a, 0x2d, 0x63, 0xe4, 0x62, 0x0b, 0x00, 0x6b, 0x16, 0x32, 0xe2, 0x12, 0x4d, 0x2c, 0x2e, - 0x4e, 0x2d, 0x89, 0x2f, 0x4a, 0x4d, 0xcf, 0x2c, 0x2e, 0x29, 0xaa, 0x8c, 0x2f, 0x4e, 0xce, 0x48, - 0xcd, 0x4d, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x12, 0x06, 0x4b, 0x06, 0x41, 0xe5, 0x82, - 0xc1, 0x52, 0x58, 0xf4, 0xa4, 0xe4, 0xe7, 0x26, 0x66, 0xe6, 0x49, 0x30, 0x61, 0xd1, 0xe3, 0x02, - 0x96, 0x12, 0xd2, 0xe3, 0x12, 0x46, 0xd3, 0x53, 0x90, 0x58, 0x92, 0x21, 0xc1, 0x0c, 0xd6, 0x21, - 0x88, 0xa2, 0x23, 0x20, 0xb1, 0x24, 0xc3, 0x8a, 0x65, 0xc6, 0x02, 0x79, 0x06, 0x27, 0xdf, 0x13, - 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, - 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x32, 0x4e, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, - 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x47, 0xf8, 0x1c, 0x89, 0xa9, 0x9b, 0x9e, 0xaf, 0x5f, 0x01, 0x0f, - 0xaa, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0xf7, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x50, 0x39, 0xf4, 0xa3, 0x4f, 0x01, 0x00, 0x00, + // 295 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xb1, 0x4e, 0xeb, 0x30, + 0x14, 0x40, 0xe3, 0xbe, 0xbc, 0x4a, 0x78, 0x23, 0x2d, 0x10, 0x3a, 0x98, 0xc2, 0xd4, 0x85, 0x44, + 0xa2, 0x13, 0x30, 0x81, 0x2a, 0xb6, 0x4a, 0x55, 0xd8, 0x58, 0x22, 0x37, 0x31, 0x8e, 0x25, 0xec, + 0x1b, 0xc5, 0x8e, 0x44, 0xff, 0x82, 0x91, 0x09, 0xf1, 0x39, 0x8c, 0x1d, 0x19, 0x51, 0xf2, 0x23, + 0xa8, 0x4e, 0x04, 0x05, 0xb2, 0x5d, 0xe9, 0x9c, 0x23, 0xcb, 0xf7, 0xe2, 0xe3, 0xfc, 0x81, 0x2a, + 0x66, 0xa4, 0x50, 0x86, 0x43, 0x28, 0x69, 0x92, 0x09, 0xc5, 0xc2, 0x9c, 0x16, 0x54, 0xea, 0x20, + 0x2f, 0xc0, 0x80, 0x37, 0xdc, 0x56, 0x82, 0x56, 0x19, 0x0d, 0x39, 0x70, 0xb0, 0x42, 0xb8, 0x99, + 0x1a, 0xf7, 0xe4, 0xa5, 0x87, 0xfb, 0x0b, 0x1b, 0x7b, 0x67, 0x78, 0x8f, 0x6a, 0xcd, 0x4c, 0x5c, + 0x30, 0x2e, 0xb4, 0x29, 0x56, 0xb1, 0x4e, 0x32, 0x26, 0x99, 0x8f, 0xc6, 0x68, 0xb2, 0x13, 0x0d, + 0x2c, 0x8c, 0x5a, 0x76, 0x6b, 0x51, 0x47, 0x93, 0x82, 0xa4, 0x42, 0xf9, 0xbd, 0x8e, 0x66, 0x66, + 0x91, 0x17, 0xe0, 0xc1, 0xaf, 0x26, 0xa7, 0x26, 0xf3, 0xff, 0xd9, 0x62, 0xf7, 0x47, 0xb1, 0xa0, + 0x26, 0xf3, 0x2e, 0xf1, 0x28, 0xa5, 0x10, 0xb7, 0xff, 0x88, 0xef, 0x4b, 0x95, 0x0a, 0xc5, 0x63, + 0x2a, 0xa1, 0x54, 0xc6, 0x77, 0xc7, 0x68, 0xe2, 0x46, 0x07, 0x29, 0x85, 0x79, 0x23, 0xdc, 0x34, + 0xfc, 0xca, 0x62, 0xef, 0x1c, 0x1f, 0x76, 0xc5, 0x29, 0x53, 0x20, 0xfd, 0xff, 0xf6, 0xc9, 0xfd, + 0x3f, 0xed, 0x6c, 0x43, 0x2f, 0xdc, 0xe7, 0xd7, 0x23, 0xe7, 0x7a, 0xfe, 0x56, 0x11, 0xb4, 0xae, + 0x08, 0xfa, 0xa8, 0x08, 0x7a, 0xaa, 0x89, 0xb3, 0xae, 0x89, 0xf3, 0x5e, 0x13, 0xe7, 0x6e, 0xca, + 0x85, 0xc9, 0xca, 0x65, 0x90, 0x80, 0x0c, 0xbf, 0x37, 0xbe, 0x35, 0x9e, 0x72, 0x08, 0x1f, 0xbf, + 0x4e, 0x64, 0x56, 0x39, 0xd3, 0xcb, 0xbe, 0x5d, 0xfb, 0xf4, 0x33, 0x00, 0x00, 0xff, 0xff, 0xb0, + 0xd8, 0x7a, 0xbe, 0xc7, 0x01, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { @@ -128,6 +148,18 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.DaoMachineFundingDenom) > 0 { + i -= len(m.DaoMachineFundingDenom) + copy(dAtA[i:], m.DaoMachineFundingDenom) + i = encodeVarintParams(dAtA, i, uint64(len(m.DaoMachineFundingDenom))) + i-- + dAtA[i] = 0x2a + } + if m.DaoMachineFundingAmount != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.DaoMachineFundingAmount)) + i-- + dAtA[i] = 0x20 + } if len(m.AssetRegistryPath) > 0 { i -= len(m.AssetRegistryPath) copy(dAtA[i:], m.AssetRegistryPath) @@ -181,6 +213,13 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovParams(uint64(l)) } + if m.DaoMachineFundingAmount != 0 { + n += 1 + sovParams(uint64(m.DaoMachineFundingAmount)) + } + l = len(m.DaoMachineFundingDenom) + if l > 0 { + n += 1 + l + sovParams(uint64(l)) + } return n } @@ -315,6 +354,57 @@ func (m *Params) Unmarshal(dAtA []byte) error { } m.AssetRegistryPath = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DaoMachineFundingAmount", wireType) + } + m.DaoMachineFundingAmount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DaoMachineFundingAmount |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DaoMachineFundingDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + 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 ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DaoMachineFundingDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) From b45c381b3b044f880a74eda3446449d86f316d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Wed, 24 Apr 2024 14:59:17 +0200 Subject: [PATCH 08/19] TLS support for planetmint (#381) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added TSL support for mqtt * added configuration value mqtt-tls (bool) to support tls and non-tls connections (testing) Signed-off-by: Jürgen Eckel --- config/config.go | 3 +++ monitor/mqtt_monitor.go | 9 +++++++++ util/mqtt.go | 9 +++++++++ 3 files changed, 21 insertions(+) diff --git a/config/config.go b/config/config.go index 282c52c..c726e3f 100644 --- a/config/config.go +++ b/config/config.go @@ -23,6 +23,7 @@ mqtt-domain = "{{ .PlmntConfig.MqttDomain }}" mqtt-port = {{ .PlmntConfig.MqttPort }} mqtt-user = "{{ .PlmntConfig.MqttUser }}" mqtt-password = "{{ .PlmntConfig.MqttPassword }}" +mqtt-tls = "{{ .PlmntConfig.MqttTLS }}" ` @@ -40,6 +41,7 @@ type Config struct { MqttPort int `json:"mqtt-port" mapstructure:"mqtt-port"` MqttUser string `json:"mqtt-user" mapstructure:"mqtt-user"` MqttPassword string `json:"mqtt-password" mapstructure:"mqtt-password"` + MqttTLS bool `json:"mqtt-tls" mapstructure:"mqtt-tls"` } // cosmos-sdk wide global singleton @@ -63,6 +65,7 @@ func DefaultConfig() *Config { MqttPort: 1885, MqttUser: "user", MqttPassword: "password", + MqttTLS: true, } } diff --git a/monitor/mqtt_monitor.go b/monitor/mqtt_monitor.go index c3830b5..6029788 100644 --- a/monitor/mqtt_monitor.go +++ b/monitor/mqtt_monitor.go @@ -1,6 +1,7 @@ package monitor import ( + "crypto/tls" "math/rand" "net" "strconv" @@ -51,11 +52,19 @@ func LazyLoadMonitorMQTTClient() { conf := config.GetConfig() hostPort := net.JoinHostPort(conf.MqttDomain, strconv.FormatInt(int64(conf.MqttPort), 10)) uri := "tcp://" + hostPort + if conf.MqttTLS { + uri = "ssl://" + hostPort + } opts := mqtt.NewClientOptions().AddBroker(uri) opts.SetClientID(conf.ValidatorAddress + "-monitor") opts.SetUsername(conf.MqttUser) opts.SetPassword(conf.MqttPassword) + if conf.MqttTLS { + tlsConfig := &tls.Config{} + opts.SetTLSConfig(tlsConfig) + } + MonitorMQTTClient = mqtt.NewClient(opts) } diff --git a/util/mqtt.go b/util/mqtt.go index 111968b..a288235 100644 --- a/util/mqtt.go +++ b/util/mqtt.go @@ -1,6 +1,7 @@ package util import ( + "crypto/tls" "encoding/json" "net" "strconv" @@ -42,11 +43,19 @@ func LazyLoadMQTTClient() { conf := config.GetConfig() hostPort := net.JoinHostPort(conf.MqttDomain, strconv.FormatInt(int64(conf.MqttPort), 10)) uri := "tcp://" + hostPort + if conf.MqttTLS { + uri = "ssl://" + hostPort + } opts := mqtt.NewClientOptions().AddBroker(uri) opts.SetClientID(conf.ValidatorAddress) opts.SetUsername(conf.MqttUser) opts.SetPassword(conf.MqttPassword) + if conf.MqttTLS { + tlsConfig := &tls.Config{} + opts.SetTLSConfig(tlsConfig) + } + MQTTClient = mqtt.NewClient(opts) } From 937104b3cd0a08a5943b359fd1bc2012de43ff85 Mon Sep 17 00:00:00 2001 From: Julian Strobl Date: Thu, 25 Apr 2024 13:50:22 +0200 Subject: [PATCH 09/19] fix: mqtt default config (#382) * fix: mqtt-tls in default config template - panic: json: cannot unmarshal string into Go struct field Config.mqtt-tls of type bool * fix: default mqtt port - since MqttTLS is set to true by default we need to use the mqtts port as well. panic: network Error : EOF Signed-off-by: Julian Strobl --- config/config.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/config/config.go b/config/config.go index c726e3f..a54d205 100644 --- a/config/config.go +++ b/config/config.go @@ -23,8 +23,7 @@ mqtt-domain = "{{ .PlmntConfig.MqttDomain }}" mqtt-port = {{ .PlmntConfig.MqttPort }} mqtt-user = "{{ .PlmntConfig.MqttUser }}" mqtt-password = "{{ .PlmntConfig.MqttPassword }}" -mqtt-tls = "{{ .PlmntConfig.MqttTLS }}" - +mqtt-tls = {{ .PlmntConfig.MqttTLS }} ` // Config defines Planetmint's top level configuration @@ -62,7 +61,7 @@ func DefaultConfig() *Config { RPCWallet: "rpcwallet", ValidatorAddress: "plmnt1w5dww335zhh98pzv783hqre355ck3u4w4hjxcx", MqttDomain: "testnet-mqtt.rddl.io", - MqttPort: 1885, + MqttPort: 1886, MqttUser: "user", MqttPassword: "password", MqttTLS: true, From b0f8516cd61c5abe3ea1f7ab44bf311fddaf04b7 Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger <64837895+LaurentMontBlanc@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:38:58 +0200 Subject: [PATCH 10/19] 379 create redeem claim does not call service (#383) * feat: add rddl-claim-service/client --------- Signed-off-by: Lorenz Herzberger Signed-off-by: Julian Strobl Co-authored-by: Julian Strobl --- .github/workflows/audit.yaml | 48 ++++++ clients/claim_client.go | 123 +++++++++++++++ config/config.go | 3 + go.mod | 52 +++---- go.sum | 142 ++++++++---------- .../mocks/rddl_claim_service_client_mock.go | 66 ++++++++ testutil/network/loader.go | 9 ++ x/dao/keeper/msg_server_redeem_claim.go | 18 ++- 8 files changed, 348 insertions(+), 113 deletions(-) create mode 100644 clients/claim_client.go create mode 100644 testutil/mocks/rddl_claim_service_client_mock.go diff --git a/.github/workflows/audit.yaml b/.github/workflows/audit.yaml index 0e46004..edb5d46 100644 --- a/.github/workflows/audit.yaml +++ b/.github/workflows/audit.yaml @@ -15,6 +15,18 @@ jobs: with: fetch-depth: 0 + - name: Checkout dependency + uses: actions/checkout@v4 + with: + repository: rddl-network/bc-slip39-go + path: bc-slip39-go + + - name: Build dependency + run: | + pushd bc-slip39-go + ./deps.sh + popd + - name: Setup Go uses: actions/setup-go@v5 with: @@ -87,6 +99,18 @@ jobs: with: fetch-depth: 0 + - name: Checkout dependency + uses: actions/checkout@v4 + with: + repository: rddl-network/bc-slip39-go + path: bc-slip39-go + + - name: Build dependency + run: | + pushd bc-slip39-go + ./deps.sh + popd + - name: Setup Go uses: actions/setup-go@v5 with: @@ -108,6 +132,18 @@ jobs: with: fetch-depth: 0 + - name: Checkout dependency + uses: actions/checkout@v4 + with: + repository: rddl-network/bc-slip39-go + path: bc-slip39-go + + - name: Build dependency + run: | + pushd bc-slip39-go + ./deps.sh + popd + - name: Setup Go uses: actions/setup-go@v5 with: @@ -156,6 +192,18 @@ jobs: with: fetch-depth: 0 + - name: Checkout dependency + uses: actions/checkout@v4 + with: + repository: rddl-network/bc-slip39-go + path: bc-slip39-go + + - name: Build dependency + run: | + pushd bc-slip39-go + ./deps.sh + popd + - name: Setup Go uses: actions/setup-go@v5 with: diff --git a/clients/claim_client.go b/clients/claim_client.go new file mode 100644 index 0000000..d65236d --- /dev/null +++ b/clients/claim_client.go @@ -0,0 +1,123 @@ +package clients + +import ( + "bytes" + "context" + "encoding/json" + "io" + "net/http" + "strconv" + + "github.com/planetmint/planetmint-go/config" +) + +// TODO: revert to actual rddl-claim-service client after CosmosSDK upgrade to v0.50.x +// see https://github.com/planetmint/planetmint-go/issues/384 + +var ClaimServiceClient IRCClient + +func init() { + cfg := config.GetConfig() + ClaimServiceClient = NewRCClient(cfg.ClaimHost, &http.Client{}) +} + +func PostClaim(ctx context.Context, beneficiary string, amount uint64, id uint64) (txID string, err error) { + res, err := ClaimServiceClient.PostClaim(ctx, PostClaimRequest{Beneficiary: beneficiary, Amount: amount, ClaimID: int(id)}) + if err != nil { + return + } + return res.TxID, nil +} + +type PostClaimRequest struct { + Beneficiary string `binding:"required" json:"beneficiary"` + Amount uint64 `binding:"required" json:"amount"` + ClaimID int `binding:"required" json:"claim-id"` +} + +type PostClaimResponse struct { + ID int `binding:"required" json:"id"` + TxID string `binding:"required" json:"tx-id"` +} + +type GetClaimResponse struct { + ID int `binding:"required" json:"id"` + Beneficiary string `binding:"required" json:"beneficiary"` + Amount uint64 `binding:"required" json:"amount"` + LiquidTXHash string `binding:"required" json:"liquid-tx-hash"` + ClaimID int `binding:"required" json:"claim-id"` +} + +type IRCClient interface { + GetClaim(ctx context.Context, id int) (res GetClaimResponse, err error) + PostClaim(ctx context.Context, req PostClaimRequest) (res PostClaimResponse, err error) +} + +type RCClient struct { + baseURL string + client *http.Client +} + +func NewRCClient(baseURL string, client *http.Client) *RCClient { + if client == nil { + client = &http.Client{} + } + return &RCClient{ + baseURL: baseURL, + client: client, + } +} + +func (rcc *RCClient) GetClaim(ctx context.Context, id int) (res GetClaimResponse, err error) { + err = rcc.doRequest(ctx, http.MethodGet, rcc.baseURL+"/claim/"+strconv.Itoa(id), nil, &res) + return +} + +func (rcc *RCClient) PostClaim(ctx context.Context, req PostClaimRequest) (res PostClaimResponse, err error) { + err = rcc.doRequest(ctx, http.MethodPost, rcc.baseURL+"/claim", req, &res) + return +} + +func (rcc *RCClient) doRequest(ctx context.Context, method, url string, body interface{}, response interface{}) (err error) { + var bodyReader io.Reader + if body != nil { + bodyBytes, err := json.Marshal(body) + if err != nil { + return err + } + bodyReader = bytes.NewBuffer(bodyBytes) + } + + req, err := http.NewRequestWithContext(ctx, method, url, bodyReader) + if err != nil { + return err + } + + if body != nil { + req.Header.Set("Content-Type", "application/json") + } + + resp, err := rcc.client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode >= 400 { + return &httpError{StatusCode: resp.StatusCode} + } + + if response != nil { + return json.NewDecoder(resp.Body).Decode(response) + } + + return +} + +type httpError struct { + StatusCode int +} + +func (e *httpError) Error() string { + return http.StatusText(e.StatusCode) +} diff --git a/config/config.go b/config/config.go index a54d205..6828782 100644 --- a/config/config.go +++ b/config/config.go @@ -23,6 +23,7 @@ mqtt-domain = "{{ .PlmntConfig.MqttDomain }}" mqtt-port = {{ .PlmntConfig.MqttPort }} mqtt-user = "{{ .PlmntConfig.MqttUser }}" mqtt-password = "{{ .PlmntConfig.MqttPassword }}" +claim-host = "{{ .PlmntConfig.ClaimHost }}" mqtt-tls = {{ .PlmntConfig.MqttTLS }} ` @@ -40,6 +41,7 @@ type Config struct { MqttPort int `json:"mqtt-port" mapstructure:"mqtt-port"` MqttUser string `json:"mqtt-user" mapstructure:"mqtt-user"` MqttPassword string `json:"mqtt-password" mapstructure:"mqtt-password"` + ClaimHost string `json:"claim-host" mapstructure:"claim-host"` MqttTLS bool `json:"mqtt-tls" mapstructure:"mqtt-tls"` } @@ -64,6 +66,7 @@ func DefaultConfig() *Config { MqttPort: 1886, MqttUser: "user", MqttPassword: "password", + ClaimHost: "testnet-p2r.rddl.io", MqttTLS: true, } } diff --git a/go.mod b/go.mod index efb6a08..2b4b74b 100644 --- a/go.mod +++ b/go.mod @@ -25,24 +25,24 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 github.com/planetmint/planetmint-go/lib v0.5.0 github.com/rddl-network/elements-rpc v1.0.0 - github.com/spf13/cast v1.5.1 + github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d - google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 - google.golang.org/grpc v1.56.3 + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 + google.golang.org/grpc v1.59.0 gopkg.in/yaml.v2 v2.4.0 gotest.tools v2.2.0+incompatible sigs.k8s.io/yaml v1.3.0 ) require ( - cloud.google.com/go v0.110.4 // indirect - cloud.google.com/go/compute v1.20.1 // indirect + cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.0 // indirect - cloud.google.com/go/storage v1.30.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/storage v1.35.1 // indirect cosmossdk.io/core v0.5.1 // indirect cosmossdk.io/log v1.2.1 // indirect cosmossdk.io/tools/rosetta v0.2.1 // indirect @@ -75,7 +75,7 @@ require ( github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect github.com/creachadair/taskgroup v0.4.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect @@ -84,26 +84,25 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/getsentry/sentry-go v0.23.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/gin-gonic/gin v1.9.1 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.0 // indirect + github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -139,10 +138,10 @@ require ( github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect @@ -153,10 +152,10 @@ require ( github.com/rs/cors v1.8.3 // indirect github.com/rs/zerolog v1.30.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/afero v1.11.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.16.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.6.0 // indirect @@ -167,17 +166,18 @@ require ( go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.17.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.2.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/sync v0.5.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect + google.golang.org/api v0.152.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index bce4260..60cc8d5 100644 --- a/go.sum +++ b/go.sum @@ -3,7 +3,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -16,7 +15,6 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -32,8 +30,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -70,8 +68,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -111,8 +109,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.0 h1:67gSqaPukx7O8WLLHMa0PNs3EBGd2eE4d+psbO/CO94= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -170,12 +168,11 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -284,7 +281,6 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -298,7 +294,6 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -381,8 +376,9 @@ github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuA github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -435,12 +431,11 @@ github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -448,8 +443,7 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -468,11 +462,11 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= @@ -481,7 +475,7 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -496,8 +490,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -556,8 +550,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -578,24 +573,24 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -605,10 +600,9 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -727,10 +721,8 @@ github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -740,7 +732,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -842,8 +834,8 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= @@ -857,9 +849,9 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -934,11 +926,11 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= @@ -970,11 +962,11 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= @@ -985,12 +977,11 @@ github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1032,7 +1023,6 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1045,10 +1035,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1133,14 +1120,12 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1153,8 +1138,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1180,8 +1165,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1196,8 +1181,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1254,13 +1239,11 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1292,7 +1275,6 @@ golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1312,7 +1294,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= @@ -1320,6 +1301,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1374,7 +1357,6 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -1441,8 +1423,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.152.0 h1:t0r1vPnfMc260S2Ci+en7kfCZaLOPs5KI0sVV/6jZrY= +google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1490,10 +1472,8 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1560,12 +1540,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 h1:Au6te5hbKUV8pIYWHqOUZ1pva5qK/rwbIhoXEUB9Lu8= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 h1:s5YSX+ZH5b5vS9rnpGymvIyMpLRJizowqDlOuyjXnTk= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1607,8 +1587,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/testutil/mocks/rddl_claim_service_client_mock.go b/testutil/mocks/rddl_claim_service_client_mock.go new file mode 100644 index 0000000..6a87b9b --- /dev/null +++ b/testutil/mocks/rddl_claim_service_client_mock.go @@ -0,0 +1,66 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./clients/claim_client.go + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + clients "github.com/planetmint/planetmint-go/clients" +) + +// MockIRCClient is a mock of IRCClient interface. +type MockIRCClient struct { + ctrl *gomock.Controller + recorder *MockIRCClientMockRecorder +} + +// MockIRCClientMockRecorder is the mock recorder for MockIRCClient. +type MockIRCClientMockRecorder struct { + mock *MockIRCClient +} + +// NewMockIRCClient creates a new mock instance. +func NewMockIRCClient(ctrl *gomock.Controller) *MockIRCClient { + mock := &MockIRCClient{ctrl: ctrl} + mock.recorder = &MockIRCClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockIRCClient) EXPECT() *MockIRCClientMockRecorder { + return m.recorder +} + +// GetClaim mocks base method. +func (m *MockIRCClient) GetClaim(ctx context.Context, id int) (clients.GetClaimResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetClaim", ctx, id) + ret0, _ := ret[0].(clients.GetClaimResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetClaim indicates an expected call of GetClaim. +func (mr *MockIRCClientMockRecorder) GetClaim(ctx, id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetClaim", reflect.TypeOf((*MockIRCClient)(nil).GetClaim), ctx, id) +} + +// PostClaim mocks base method. +func (m *MockIRCClient) PostClaim(ctx context.Context, req clients.PostClaimRequest) (clients.PostClaimResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PostClaim", ctx, req) + ret0, _ := ret[0].(clients.PostClaimResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PostClaim indicates an expected call of PostClaim. +func (mr *MockIRCClientMockRecorder) PostClaim(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PostClaim", reflect.TypeOf((*MockIRCClient)(nil).PostClaim), ctx, req) +} diff --git a/testutil/network/loader.go b/testutil/network/loader.go index 028aaaf..d9695e9 100644 --- a/testutil/network/loader.go +++ b/testutil/network/loader.go @@ -14,9 +14,12 @@ import ( simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/golang/mock/gomock" "github.com/planetmint/planetmint-go/app" + "github.com/planetmint/planetmint-go/clients" "github.com/planetmint/planetmint-go/monitor" monitormocks "github.com/planetmint/planetmint-go/monitor/mocks" + claimmocks "github.com/planetmint/planetmint-go/testutil/mocks" "github.com/planetmint/planetmint-go/testutil/sample" "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/util/mocks" @@ -45,6 +48,12 @@ func Load(t *testing.T, configs ...Config) *Network { monitor.SetMqttMonitorInstance(&monitormocks.MockMQTTMonitorClientI{}) elements.Client = &elementsmocks.MockClient{} util.RegisterAssetServiceHTTPClient = &mocks.MockClient{} + ctrl := gomock.NewController(t) + claimMock := claimmocks.NewMockIRCClient(ctrl) + claimMock.EXPECT().PostClaim(gomock.Any(), gomock.Any()).AnyTimes().Return(clients.PostClaimResponse{ + TxID: "0000000000000000000000000000000000000000000000000000000000000000", + }, nil) + clients.ClaimServiceClient = claimMock // enable application logger in tests appLogger := util.GetAppLogger() diff --git a/x/dao/keeper/msg_server_redeem_claim.go b/x/dao/keeper/msg_server_redeem_claim.go index 93cc6db..ee30624 100644 --- a/x/dao/keeper/msg_server_redeem_claim.go +++ b/x/dao/keeper/msg_server_redeem_claim.go @@ -7,6 +7,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/planetmint/planetmint-go/clients" "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/dao/types" ) @@ -39,12 +40,7 @@ func (k msgServer) CreateRedeemClaim(goCtx context.Context, msg *types.MsgCreate ) if util.IsValidatorBlockProposer(ctx, ctx.BlockHeader().ProposerAddress, k.RootDir) { - util.GetAppLogger().Info(ctx, fmt.Sprintf("Issuing RDDL claim: %s/%d", msg.Beneficiary, id)) - txID, err := util.DistributeAsset(msg.Beneficiary, util.UintValueToRDDLTokenString(burnCoins.Amount.Uint64()), 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) + go postClaimToService(goCtx, msg.GetBeneficiary(), burnCoins.Amount.Uint64(), id) } return &types.MsgCreateRedeemClaimResponse{}, nil @@ -129,3 +125,13 @@ func (k msgServer) burnClaimAmount(ctx sdk.Context, addr sdk.AccAddress, burnCoi } return } + +func postClaimToService(goCtx context.Context, beneficiary string, amount uint64, id uint64) { + ctx := sdk.UnwrapSDKContext(goCtx) + util.GetAppLogger().Info(ctx, fmt.Sprintf("Issuing RDDL claim: %s/%d", beneficiary, id)) + txID, err := clients.PostClaim(goCtx, beneficiary, amount, id) + if err != nil { + util.GetAppLogger().Error(ctx, createRedeemClaimTag+"could not issue claim to beneficiary: "+beneficiary) + } + util.SendUpdateRedeemClaim(goCtx, beneficiary, id, txID) +} From 066c1a76676fbee2ad07c922523104811b854775 Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger <64837895+LaurentMontBlanc@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:49:45 +0200 Subject: [PATCH 11/19] Fix rddl claim client load (#388) * fix: lazyLoad on rddl-claim-service-client * fix: sane default value for claim-host --------- Signed-off-by: Lorenz Herzberger --- clients/claim_client.go | 9 +++++++-- config/config.go | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/clients/claim_client.go b/clients/claim_client.go index d65236d..8ad9dcc 100644 --- a/clients/claim_client.go +++ b/clients/claim_client.go @@ -16,13 +16,18 @@ import ( var ClaimServiceClient IRCClient -func init() { +func lazyLoad() IRCClient { + if ClaimServiceClient != nil { + return ClaimServiceClient + } cfg := config.GetConfig() ClaimServiceClient = NewRCClient(cfg.ClaimHost, &http.Client{}) + return ClaimServiceClient } func PostClaim(ctx context.Context, beneficiary string, amount uint64, id uint64) (txID string, err error) { - res, err := ClaimServiceClient.PostClaim(ctx, PostClaimRequest{Beneficiary: beneficiary, Amount: amount, ClaimID: int(id)}) + client := lazyLoad() + res, err := client.PostClaim(ctx, PostClaimRequest{Beneficiary: beneficiary, Amount: amount, ClaimID: int(id)}) if err != nil { return } diff --git a/config/config.go b/config/config.go index 6828782..9ba7e60 100644 --- a/config/config.go +++ b/config/config.go @@ -66,7 +66,7 @@ func DefaultConfig() *Config { MqttPort: 1886, MqttUser: "user", MqttPassword: "password", - ClaimHost: "testnet-p2r.rddl.io", + ClaimHost: "https://testnet-p2r.rddl.io", MqttTLS: true, } } From af1483a8ec6901fa66e638a6df0ccacc5889ebf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Fri, 10 May 2024 10:57:55 +0200 Subject: [PATCH 12/19] added secp256r1 machine ID Sig verification (#395) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added secp256r1 machineIDSignature verification * to go-utils v0.1.1 --------- Signed-off-by: Jürgen Eckel --- go.mod | 1 + go.sum | 2 + util/validate_signature.go | 53 ------------------- x/machine/keeper/msg_server_attest_machine.go | 18 +++++-- 4 files changed, 17 insertions(+), 57 deletions(-) delete mode 100644 util/validate_signature.go diff --git a/go.mod b/go.mod index 2b4b74b..b74440c 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 github.com/planetmint/planetmint-go/lib v0.5.0 github.com/rddl-network/elements-rpc v1.0.0 + github.com/rddl-network/go-utils v0.1.1 github.com/spf13/cast v1.6.0 github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 diff --git a/go.sum b/go.sum index 60cc8d5..9e4bd13 100644 --- a/go.sum +++ b/go.sum @@ -892,6 +892,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rddl-network/elements-rpc v1.0.0 h1:geFcsaD1t2ONxRC13semPpiOwsJl0ZCfkFT9UIKPZFk= github.com/rddl-network/elements-rpc v1.0.0/go.mod h1:E35cJMXZqe1iEo/AvjwSWn25mHZ4+y4gV8qj0lWle5c= +github.com/rddl-network/go-utils v0.1.1 h1:41ZrDMM2ree7/OfhKYK4j/SQnyVvms4YirTKneibeyk= +github.com/rddl-network/go-utils v0.1.1/go.mod h1:xKO/ZSAEHwcYe8bNUZjcQCIX+6OMXzEXu1WQ1HqXqZA= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= diff --git a/util/validate_signature.go b/util/validate_signature.go deleted file mode 100644 index e72d807..0000000 --- a/util/validate_signature.go +++ /dev/null @@ -1,53 +0,0 @@ -package util - -import ( - "encoding/hex" - "errors" - - "github.com/btcsuite/btcd/btcutil/hdkeychain" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" -) - -func ValidateSignature(message string, signature string, publicKey string) (bool, error) { - // Convert the message, signature, and public key from hex to bytes - messageBytes, err := hex.DecodeString(message) - if err != nil { - return false, errors.New("invalid message hex string") - } - return ValidateSignatureByteMsg(messageBytes, signature, publicKey) -} - -func ValidateSignatureByteMsg(message []byte, signature string, publicKey string) (bool, error) { - // Convert signature, and public key from hex to bytes - signatureBytes, err := hex.DecodeString(signature) - if err != nil { - return false, errors.New("invalid signature hex string") - } - publicKeyBytes, err := hex.DecodeString(publicKey) - if err != nil { - return false, errors.New("invalid public key hex string") - } - - // Create a secp256k1 public key object - pubKey := &secp256k1.PubKey{Key: publicKeyBytes} - - // Verify the signature - isValid := pubKey.VerifySignature(message, signatureBytes) - if !isValid { - return false, errors.New("invalid signature") - } - return isValid, nil -} - -func GetHexPubKey(extPubKey string) (string, error) { - xpubKey, err := hdkeychain.NewKeyFromString(extPubKey) - if err != nil { - return "", err - } - pubKey, err := xpubKey.ECPubKey() - if err != nil { - return "", err - } - byteKey := pubKey.SerializeCompressed() - return hex.EncodeToString(byteKey), nil -} diff --git a/x/machine/keeper/msg_server_attest_machine.go b/x/machine/keeper/msg_server_attest_machine.go index 21e952e..f0e3277 100644 --- a/x/machine/keeper/msg_server_attest_machine.go +++ b/x/machine/keeper/msg_server_attest_machine.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "errors" "fmt" config "github.com/planetmint/planetmint-go/config" @@ -13,6 +14,7 @@ import ( errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/rddl-network/go-utils/signature" ) func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMachine) (*types.MsgAttestMachineResponse, error) { @@ -22,9 +24,17 @@ func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMach // and removed from here due to inconsistency or checking the same thing over and over again. ta, _, _ := k.GetTrustAnchor(ctx, msg.Machine.MachineId) - isValidMachineID, err := util.ValidateSignature(msg.Machine.MachineId, msg.Machine.MachineIdSignature, msg.Machine.MachineId) - if !isValidMachineID { - return nil, err + isValidSecp256r1, errR1 := signature.ValidateSECP256R1Signature(msg.Machine.MachineId, msg.Machine.MachineIdSignature, msg.Machine.MachineId) + if errR1 != nil || !isValidSecp256r1 { + isValidSecp256k1, errK1 := signature.ValidateSignature(msg.Machine.MachineId, msg.Machine.MachineIdSignature, msg.Machine.MachineId) + if errK1 != nil || !isValidSecp256k1 { + errStr := "" + if errR1 != nil { + errStr = errR1.Error() + } + aggreatedErrorMessage := "Invalid machine signature: " + errStr + ", " + errK1.Error() + return nil, errors.New(aggreatedErrorMessage) + } } isValidIssuerPlanetmint := validateExtendedPublicKey(msg.Machine.IssuerPlanetmint, config.PlmntNetParams) @@ -59,7 +69,7 @@ func (k msgServer) AttestMachine(goCtx context.Context, msg *types.MsgAttestMach k.StoreMachine(ctx, *msg.Machine) k.StoreMachineIndex(ctx, *msg.Machine) - err = k.StoreTrustAnchor(ctx, ta, true) + err := k.StoreTrustAnchor(ctx, ta, true) if err != nil { return nil, err } From ccf491d658ce9e041e2af12c0c7bcdee6bca5e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Tue, 14 May 2024 10:32:52 +0200 Subject: [PATCH 13/19] added uncompressed trust anchor pub key processing (#396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added uncompressed trust anchor pub key processing * added a nother waiting block to pass CI test cases - these are a bit slower Signed-off-by: Jürgen Eckel --- tests/e2e/dao/pop/selection_suite.go | 2 ++ x/machine/keeper/msg_server_register_trust_anchor.go | 6 ++++++ x/machine/keeper/msg_server_test.go | 12 ++++++++++++ 3 files changed, 20 insertions(+) diff --git a/tests/e2e/dao/pop/selection_suite.go b/tests/e2e/dao/pop/selection_suite.go index 60c061e..fb2898f 100644 --- a/tests/e2e/dao/pop/selection_suite.go +++ b/tests/e2e/dao/pop/selection_suite.go @@ -289,6 +289,8 @@ func (s *SelectionE2ETestSuite) TestTokenRedeemClaim() { s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) + s.Require().NoError(s.network.WaitForNextBlock()) // added another waiting block to pass CI test cases (they are a bit slower) + _, err = clitestutil.GetRawLogFromTxOut(val, out) s.Require().ErrorContains(err, "failed to execute message; message index: 0: expected: plmnt19cl05ztgt8ey6v86hjjjn3thfmpu6q2xtveehc; got: plmnt1kp93kns6hs2066d8qw0uz84fw3vlthewt2ck6p: invalid claim address") diff --git a/x/machine/keeper/msg_server_register_trust_anchor.go b/x/machine/keeper/msg_server_register_trust_anchor.go index b71d6c2..2c12092 100644 --- a/x/machine/keeper/msg_server_register_trust_anchor.go +++ b/x/machine/keeper/msg_server_register_trust_anchor.go @@ -35,6 +35,12 @@ func validatePublicKey(pubkey string) bool { return false } + // uncompressed key + if len(pubkeyBytes) == 64 { + return true + } + + // compressed key // Check if byte slice has correct length if len(pubkeyBytes) != 33 { return false diff --git a/x/machine/keeper/msg_server_test.go b/x/machine/keeper/msg_server_test.go index 73dd467..09a28c1 100644 --- a/x/machine/keeper/msg_server_test.go +++ b/x/machine/keeper/msg_server_test.go @@ -71,6 +71,18 @@ func TestMsgServerRegisterTrustAnchor(t *testing.T) { } } +func TestMsgServerRegisterTrustAnchorUncompressedKey(t *testing.T) { + t.Parallel() + pk := "6003d0ab9af4ec112629195a7266a244aecf1ac7691da0084be3e7ceea2ee71571b0963fffd9c80a640317509a681ac66c2ed70ecc9f317a0d2b1a9bff94ff74" + ta := moduleobject.TrustAnchor(pk) + msg := types.NewMsgRegisterTrustAnchor(pk, &ta) + msgServer, ctx := setupMsgServer(t) + res, err := msgServer.RegisterTrustAnchor(ctx, msg) + if assert.NoError(t, err) { + assert.Equal(t, &types.MsgRegisterTrustAnchorResponse{}, res) + } +} + func TestMsgServerRegisterTrustAnchorTwice(t *testing.T) { t.Parallel() _, pk := sample.KeyPair() From 1f2b1702ea3a7a557274d7d3dffcb9e96d59feb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Wed, 15 May 2024 13:23:06 +0200 Subject: [PATCH 14/19] Eckelj/mqtt monitoring fix (#398) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * set keepalive ping * made mutex more granular * avoid using app.Logger to have a consistent log from the beginning * made lazyLoading local to the module * fixed ticker bug so that the tasks are executed in an endless loop * fixed timezone bug of Add Participant. only validator local time is used not the timestamp from the mqtt messages as these might come from a different time zone (resulted in delayed deletion from the activeActors DB) * improved connection management for the monitor * added a watchdog task to restart the monitor in case of connection loss (every 2 min) * removed obsolete SetContext function/interface * removed obsolete time conversion method Signed-off-by: Jürgen Eckel --- monitor/backend.go | 25 ++++-- monitor/interface.go | 8 -- monitor/mocks/mqtt_monitor.go | 8 -- monitor/mqtt_monitor.go | 140 +++++++++++++++++++++------------- monitor/mqtt_monitor_test.go | 5 -- util/time.go | 23 ------ util/time_test.go | 15 ---- x/dao/abci.go | 1 - 8 files changed, 102 insertions(+), 123 deletions(-) delete mode 100644 util/time.go delete mode 100644 util/time_test.go diff --git a/monitor/backend.go b/monitor/backend.go index 218c7c2..1471e70 100644 --- a/monitor/backend.go +++ b/monitor/backend.go @@ -3,6 +3,7 @@ package monitor import ( "encoding/json" "log" + "strconv" "time" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -21,7 +22,7 @@ func (mms *MqttMonitor) AddParticipant(address string, lastSeenTS int64) (err er lastSeenBytes, err := json.Marshal(lastSeen) if err != nil { - mms.Log("[Monitor] Error serializing ConversionRequest: " + err.Error()) + log.Println("[app] [Monitor] Error serializing ConversionRequest: " + err.Error()) return } increaseCounter := false @@ -37,9 +38,11 @@ func (mms *MqttMonitor) AddParticipant(address string, lastSeenTS int64) (err er err = mms.db.Put([]byte(address), lastSeenBytes, nil) mms.dbMutex.Unlock() if err != nil { - log.Println("[Monitor] storing addresses in DB: " + err.Error()) - return + log.Println("[app] [Monitor] error storing addresses in DB: " + err.Error()) + } else { + log.Println("[app] [Monitor] stored address in DB: " + address) } + return } @@ -61,8 +64,11 @@ func (mms *MqttMonitor) getAmountOfElements() (amount int64, err error) { // Check for any errors encountered during iteration if err := iter.Error(); err != nil { - log.Println("[Monitor] " + err.Error()) + log.Println("[app] [Monitor] " + err.Error()) + } else { + log.Println("[app] [Monitor] elements: " + strconv.FormatInt(amount, 10)) } + return } func (mms *MqttMonitor) getDataFromIter(iter iterator.Iterator) (lastSeen LastSeenEvent, err error) { @@ -70,13 +76,14 @@ func (mms *MqttMonitor) getDataFromIter(iter iterator.Iterator) (lastSeen LastSe value := iter.Value() err = json.Unmarshal(value, &lastSeen) if err != nil { - mms.Log("[Monitor] Failed to unmarshal entry: " + string(key) + " - " + err.Error()) + log.Println("[app] [Monitor] Failed to unmarshal entry: " + string(key) + " - " + err.Error()) } return } func (mms *MqttMonitor) CleanupDB() { // Create an iterator for the database + log.Println("[app] [Monitor] Starting clean-up process") iter := mms.db.NewIterator(nil, nil) defer iter.Release() // Make sure to release the iterator at the end @@ -85,7 +92,7 @@ func (mms *MqttMonitor) CleanupDB() { // Use iter.Key() and iter.Value() to access the key and value lastSeen, err := mms.getDataFromIter(iter) if err != nil { - mms.Log("[Monitor] Failed to unmarshal entry: " + string(iter.Key()) + " - " + err.Error()) + log.Println("[app] [Monitor] Failed to unmarshal entry: " + string(iter.Key()) + " - " + err.Error()) continue } timeThreshold := time.Now().Add(-1 * mms.CleanupPeriodicityInMinutes * time.Minute).Unix() @@ -93,13 +100,15 @@ func (mms *MqttMonitor) CleanupDB() { // If the entry is older than 12 hours, delete it err := mms.deleteEntry(iter.Key()) if err != nil { - mms.Log("[Monitor] Failed to delete entry: " + err.Error()) + log.Println("[app] [Monitor] Failed to delete entry: " + err.Error()) + } else { + log.Println("[app] [Monitor] Delete entry: " + string(iter.Key())) } } } // Check for any errors encountered during iteration if err := iter.Error(); err != nil { - mms.Log(err.Error()) + log.Println("[app] [Monitor] error during cleanup : " + err.Error()) } } diff --git a/monitor/interface.go b/monitor/interface.go index 7789fab..21879af 100644 --- a/monitor/interface.go +++ b/monitor/interface.go @@ -3,7 +3,6 @@ package monitor import ( "sync" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/planetmint/planetmint-go/config" "github.com/syndtr/goleveldb/leveldb" ) @@ -11,7 +10,6 @@ import ( type MQTTMonitorClientI interface { AddParticipant(address string, lastSeenTS int64) (err error) SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) - SetContext(ctx sdk.Context) Start() (err error) } @@ -47,12 +45,6 @@ func LazyMqttMonitorLoader(homeDir string) { } } -func SetContext(ctx sdk.Context) { - monitorMutex.Lock() - mqttMonitorInstance.SetContext(ctx) - monitorMutex.Unlock() -} - func SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) { monitorMutex.Lock() challenger, challengee, err = mqttMonitorInstance.SelectPoPParticipantsOutOfActiveActors() diff --git a/monitor/mocks/mqtt_monitor.go b/monitor/mocks/mqtt_monitor.go index a08e814..ea020a8 100644 --- a/monitor/mocks/mqtt_monitor.go +++ b/monitor/mocks/mqtt_monitor.go @@ -1,9 +1,5 @@ package mocks -import ( - types "github.com/cosmos/cosmos-sdk/types" -) - // MockMQTTMonitorClientI is a mock of MQTTMonitorClientI interface. type MockMQTTMonitorClientI struct { myStringList []string @@ -27,10 +23,6 @@ func (m *MockMQTTMonitorClientI) SelectPoPParticipantsOutOfActiveActors() (strin return challenger, challengee, nil } -// SetContext mocks base method. -func (m *MockMQTTMonitorClientI) SetContext(_ types.Context) { -} - // Start mocks base method. func (m *MockMQTTMonitorClientI) Start() error { return nil diff --git a/monitor/mqtt_monitor.go b/monitor/mqtt_monitor.go index 6029788..d4c4bb7 100644 --- a/monitor/mqtt_monitor.go +++ b/monitor/mqtt_monitor.go @@ -2,6 +2,7 @@ package monitor import ( "crypto/tls" + "log" "math/rand" "net" "strconv" @@ -17,11 +18,12 @@ import ( ) var MonitorMQTTClient util.MQTTClientI +var clientMutex sync.Mutex +var localMqttClient util.MQTTClientI type MqttMonitor struct { db *leveldb.DB dbMutex sync.Mutex // Mutex to synchronize write operations - ticker *time.Ticker CleanupPeriodicityInMinutes time.Duration config config.Config numberOfElements int64 @@ -29,6 +31,7 @@ type MqttMonitor struct { contextMutex sync.Mutex isTerminated bool terminationMutex sync.Mutex + maxRetries time.Duration } func (mms *MqttMonitor) Terminate() { @@ -44,9 +47,9 @@ func (mms *MqttMonitor) IsTerminated() (isTerminated bool) { return } -func LazyLoadMonitorMQTTClient() { +func (mms *MqttMonitor) lazyLoadMonitorMQTTClient() util.MQTTClientI { if MonitorMQTTClient != nil { - return + return MonitorMQTTClient } conf := config.GetConfig() @@ -56,7 +59,7 @@ func LazyLoadMonitorMQTTClient() { uri = "ssl://" + hostPort } - opts := mqtt.NewClientOptions().AddBroker(uri) + opts := mqtt.NewClientOptions().AddBroker(uri).SetKeepAlive(60).SetCleanSession(true) opts.SetClientID(conf.ValidatorAddress + "-monitor") opts.SetUsername(conf.MqttUser) opts.SetPassword(conf.MqttPassword) @@ -65,7 +68,9 @@ func LazyLoadMonitorMQTTClient() { opts.SetTLSConfig(tlsConfig) } - MonitorMQTTClient = mqtt.NewClient(opts) + log.Println("[app] [Monitor] create new client") + client := mqtt.NewClient(opts) + return client } func NewMqttMonitorService(db *leveldb.DB, config config.Config) *MqttMonitor { @@ -73,13 +78,20 @@ func NewMqttMonitorService(db *leveldb.DB, config config.Config) *MqttMonitor { return service } -func (mms *MqttMonitor) registerPeriodicTasks() { - mms.ticker = time.NewTicker(mms.CleanupPeriodicityInMinutes * time.Minute) - go func() { - for range mms.ticker.C { // Loop over the ticker channel +func (mms *MqttMonitor) runPeriodicTasks() { + tickerRestablishConnection := time.NewTicker(2 * time.Minute) + tickerCleanup := time.NewTicker(5 * time.Minute) + defer tickerRestablishConnection.Stop() + defer tickerCleanup.Stop() + + for { + select { + case <-tickerRestablishConnection.C: + go mms.MonitorActiveParticipants() + case <-tickerCleanup.C: go mms.CleanupDB() } - }() + } } func (mms *MqttMonitor) Start() (err error) { @@ -88,8 +100,9 @@ func (mms *MqttMonitor) Start() (err error) { return } mms.numberOfElements = amount - mms.registerPeriodicTasks() + go mms.runPeriodicTasks() go mms.MonitorActiveParticipants() + go mms.CleanupDB() return } func (mms *MqttMonitor) getRandomNumbers() (challenger int, challengee int) { @@ -105,18 +118,18 @@ func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger str return } randomChallenger, randomChallengee := mms.getRandomNumbers() - mms.Log("[Monitor] number of elements: " + strconv.Itoa(int(mms.numberOfElements))) - mms.Log("[Monitor] selected IDs: " + strconv.Itoa(randomChallenger) + " " + strconv.Itoa(randomChallengee)) + log.Println("[app] [Monitor] number of elements: " + strconv.Itoa(int(mms.numberOfElements))) + log.Println("[app] [Monitor] selected IDs: " + strconv.Itoa(randomChallenger) + " " + strconv.Itoa(randomChallengee)) iter := mms.db.NewIterator(nil, nil) defer iter.Release() count := 0 found := 0 var lastSeen LastSeenEvent for iter.Next() { - mms.Log("[Monitor] count: " + strconv.Itoa(count)) if count == randomChallenger { lastSeen, err = mms.getDataFromIter(iter) if err != nil { + log.Println("[app] [Monitor] could not get Data from ID" + strconv.Itoa(randomChallenger)) return } challenger = lastSeen.Address @@ -124,6 +137,7 @@ func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger str } else if count == randomChallengee { lastSeen, err = mms.getDataFromIter(iter) if err != nil { + log.Println("[app] [Monitor] could not get Data from ID" + strconv.Itoa(randomChallengee)) return } challengee = lastSeen.Address @@ -135,6 +149,7 @@ func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger str break } } + log.Println("[app] [Monitor] challenger, challengee: " + challenger + " " + challengee) return } @@ -157,59 +172,74 @@ func (mms *MqttMonitor) MqttMsgHandler(_ mqtt.Client, msg mqtt.Message) { if err != nil || !valid { return } - payload, err := util.ToJSON(msg.Payload()) - if err != nil { - return - } - timeString, ok := payload["Time"].(string) - if !ok { - return - } - unixTime, err := util.String2UnixTime(timeString) - if err != nil { - return - } + unixTime := time.Now().Unix() err = mms.AddParticipant(address, unixTime) + if err != nil { - mms.Log("[Monitor] error adding active actor to DB: " + address + " " + err.Error()) + log.Println("[app] [Monitor] error adding active actor to DB: " + address + " " + err.Error()) } else { - mms.Log("[Monitor] added active actor to DB: " + address) + log.Println("[app] [Monitor] added active actor to DB: " + address) } } func (mms *MqttMonitor) MonitorActiveParticipants() { - LazyLoadMonitorMQTTClient() - for !mms.IsTerminated() { - if !MonitorMQTTClient.IsConnected() { - if token := MonitorMQTTClient.Connect(); token.Wait() && token.Error() != nil { - mms.Log("[Monitor] error connecting to mqtt: " + token.Error().Error()) - panic(token.Error()) - } - - var messageHandler mqtt.MessageHandler = mms.MqttMsgHandler - - // Subscribe to a topic - subscriptionTopic := "tele/#" - if token := MonitorMQTTClient.Subscribe(subscriptionTopic, 0, messageHandler); token.Wait() && token.Error() != nil { - mms.Log("[Monitor] error registering the mqtt subscription: " + token.Error().Error()) - panic(token.Error()) - } - } - time.Sleep(5 * time.Second) + clientMutex.Lock() + if localMqttClient != nil { + log.Println("[app] [Monitor] client is still working") + return } + localMqttClient = mms.lazyLoadMonitorMQTTClient() + client := localMqttClient + clientMutex.Unlock() + + // Maximum reconnection attempts (adjust as needed) + mms.SetMaxRetries() + for !mms.IsTerminated() && mms.maxRetries > 0 { + if token := client.Connect(); token.Wait() && token.Error() != nil { + log.Println("[app] [Monitor] error connecting to mqtt: " + token.Error().Error()) + mms.maxRetries-- + time.Sleep(time.Second * 5) + continue + } + + var messageHandler mqtt.MessageHandler = mms.MqttMsgHandler + + // Subscribe to a topic + subscriptionTopic := "tele/#" + if token := client.Subscribe(subscriptionTopic, 0, messageHandler); token.Wait() && token.Error() != nil { + log.Println("[app] [Monitor] error registering the mqtt subscription: " + token.Error().Error()) + continue + } + + for !mms.IsTerminated() { + if !client.IsConnected() { + log.Println("[app] [Monitor] retry establishing a connection") + break // Exit inner loop on disconnect + } + mms.SetMaxRetries() + time.Sleep(60 * time.Second) // Adjust sleep time based on your needs + } + } + + if mms.maxRetries == 0 { + log.Println("[app] [Monitor] Reached maximum reconnection attempts. Exiting. New client will be activated soon.") + } + + clientMutex.Lock() + localMqttClient = nil + clientMutex.Unlock() +} + +func (mms *MqttMonitor) SetMaxRetries() { + mms.maxRetries = 5 } func (mms *MqttMonitor) Log(msg string) { mms.contextMutex.Lock() - if mms.sdkContext != nil { - util.GetAppLogger().Info(*mms.sdkContext, msg) + localContext := mms.sdkContext + mms.contextMutex.Unlock() + if localContext != nil { + util.GetAppLogger().Info(*localContext, msg) } - mms.contextMutex.Unlock() -} - -func (mms *MqttMonitor) SetContext(ctx sdk.Context) { - mms.contextMutex.Lock() - mms.sdkContext = &ctx - mms.contextMutex.Unlock() } diff --git a/monitor/mqtt_monitor_test.go b/monitor/mqtt_monitor_test.go index c36c1ed..f842669 100644 --- a/monitor/mqtt_monitor_test.go +++ b/monitor/mqtt_monitor_test.go @@ -23,7 +23,6 @@ const ( ) func TestGMonitorActiveParticipants(t *testing.T) { - monitor.LazyLoadMonitorMQTTClient() cfg := config.GetConfig() db, err := leveldb.Open(storage.NewMemStorage(), nil) assert.NoError(t, err) @@ -49,8 +48,6 @@ func TestGMonitorActiveParticipants(t *testing.T) { } func TestCleanupRemoval(t *testing.T) { - monitor.LazyLoadMonitorMQTTClient() - cfg := config.GetConfig() db, err := leveldb.Open(storage.NewMemStorage(), nil) assert.NoError(t, err) @@ -77,8 +74,6 @@ func TestCleanupRemoval(t *testing.T) { } func TestCleanupPrecisionTest(t *testing.T) { - monitor.LazyLoadMonitorMQTTClient() - cfg := config.GetConfig() db, err := leveldb.Open(storage.NewMemStorage(), nil) assert.NoError(t, err) diff --git a/util/time.go b/util/time.go deleted file mode 100644 index e718b38..0000000 --- a/util/time.go +++ /dev/null @@ -1,23 +0,0 @@ -package util - -import ( - "time" -) - -func String2UnixTime(timeInput string) (int64, error) { - // Layout specifying the format of the input string - // Note: Go uses a specific reference time (Mon Jan 2 15:04:05 MST 2006) to define format layouts - layout := "2006-01-02T15:04:05" - - // Parse the string into a time.Time struct in local time zone - parsedTime, err := time.Parse(layout, timeInput) - if err != nil { - return 0, err - } - - // Convert to UTC if not already - utcTime := parsedTime.UTC() - unixTime := utcTime.Unix() - - return unixTime, nil -} diff --git a/util/time_test.go b/util/time_test.go deleted file mode 100644 index d56c517..0000000 --- a/util/time_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package util - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestString2UnixTime(t *testing.T) { - t.Parallel() - input := "2024-03-26T11:10:41" - unixTime, err := String2UnixTime(input) - assert.NoError(t, err) - assert.Equal(t, int64(1711451441), unixTime) -} diff --git a/x/dao/abci.go b/x/dao/abci.go index 49680f0..0f562de 100644 --- a/x/dao/abci.go +++ b/x/dao/abci.go @@ -24,7 +24,6 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) hexProposerAddress := hex.EncodeToString(proposerAddress) if isPopHeight(ctx, k, currentBlockHeight) { // select PoP participants - monitor.SetContext(ctx) challenger, challengee, err := monitor.SelectPoPParticipantsOutOfActiveActors() if err != nil { util.GetAppLogger().Error(ctx, "error during PoP Participant selection ", err) From 0c05081604519a675f3803ee2612f47291cc4d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Wed, 15 May 2024 17:05:26 +0200 Subject: [PATCH 15/19] unlock mutex before return (#399) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * unlock mutex before return * added termination clause for the scheduler Signed-off-by: Jürgen Eckel --- monitor/mqtt_monitor.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/monitor/mqtt_monitor.go b/monitor/mqtt_monitor.go index d4c4bb7..096efd7 100644 --- a/monitor/mqtt_monitor.go +++ b/monitor/mqtt_monitor.go @@ -84,7 +84,7 @@ func (mms *MqttMonitor) runPeriodicTasks() { defer tickerRestablishConnection.Stop() defer tickerCleanup.Stop() - for { + for !mms.IsTerminated() { select { case <-tickerRestablishConnection.C: go mms.MonitorActiveParticipants() @@ -187,6 +187,7 @@ func (mms *MqttMonitor) MonitorActiveParticipants() { clientMutex.Lock() if localMqttClient != nil { log.Println("[app] [Monitor] client is still working") + clientMutex.Unlock() return } localMqttClient = mms.lazyLoadMonitorMQTTClient() From e99b614e4a17ce396f42e02f4743eb4c50ad18ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Thu, 16 May 2024 17:06:19 +0200 Subject: [PATCH 16/19] added connection loss handler, extended logging, mqtt msg updates (#400) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added a bit of logging * added update messages to mqtt (every second with a timestamp) * added isConnectionOpen to the interface and analysis this during execution * added connection loss handler and status check * put some global objects into an objects to avoid inter service testing issues * TestingLocker Mutex to RWMutex (increase performance) * termintationMutex became a sync.RWMutex * added logging to the mqtt mock client * made monitor Mutex a RWMutex * added Mutex protection to the numberOfElements varialbe * added another Waiting block to the machine attestation methods (CI tests) * had to adjust the test cases to the impact of that change. Signed-off-by: Jürgen Eckel --- monitor/backend.go | 9 +- monitor/interface.go | 19 ++--- monitor/mocks/mqtt_monitor.go | 4 + monitor/mqtt_monitor.go | 99 ++++++++++++++++------ tests/e2e/dao/gas/gas_consumption_suite.go | 1 + tests/e2e/dao/pop/selection_suite.go | 8 +- tests/e2e/machine/suite.go | 1 + testutil/e2e/e2e.go | 8 ++ util/logger.go | 6 +- util/mocks/mqtt.go | 24 ++++-- util/mqtt.go | 1 + 11 files changed, 125 insertions(+), 55 deletions(-) diff --git a/monitor/backend.go b/monitor/backend.go index 1471e70..ff76767 100644 --- a/monitor/backend.go +++ b/monitor/backend.go @@ -25,16 +25,13 @@ func (mms *MqttMonitor) AddParticipant(address string, lastSeenTS int64) (err er log.Println("[app] [Monitor] Error serializing ConversionRequest: " + err.Error()) return } - increaseCounter := false + // returns an error if the entry does not exist (we have to increase the counter in this case) _, err = mms.db.Get([]byte(address), nil) if err != nil { - increaseCounter = true + mms.setNumDBElements(mms.getNumDBElements() + 1) } mms.dbMutex.Lock() - if increaseCounter { - mms.numberOfElements++ - } err = mms.db.Put([]byte(address), lastSeenBytes, nil) mms.dbMutex.Unlock() if err != nil { @@ -47,9 +44,9 @@ func (mms *MqttMonitor) AddParticipant(address string, lastSeenTS int64) (err er } func (mms *MqttMonitor) deleteEntry(key []byte) (err error) { + mms.setNumDBElements(mms.getNumDBElements() - 1) mms.dbMutex.Lock() err = mms.db.Delete(key, nil) - mms.numberOfElements-- mms.dbMutex.Unlock() return } diff --git a/monitor/interface.go b/monitor/interface.go index 21879af..f967e6b 100644 --- a/monitor/interface.go +++ b/monitor/interface.go @@ -13,7 +13,7 @@ type MQTTMonitorClientI interface { Start() (err error) } -var monitorMutex sync.Mutex +var monitorMutex sync.RWMutex var mqttMonitorInstance MQTTMonitorClientI func SetMqttMonitorInstance(monitorInstance MQTTMonitorClientI) { @@ -23,9 +23,9 @@ func SetMqttMonitorInstance(monitorInstance MQTTMonitorClientI) { } func LazyMqttMonitorLoader(homeDir string) { - monitorMutex.Lock() + monitorMutex.RLock() tmpInstance := mqttMonitorInstance - monitorMutex.Unlock() + monitorMutex.RUnlock() if tmpInstance != nil { return } @@ -36,9 +36,8 @@ func LazyMqttMonitorLoader(homeDir string) { if err != nil { panic(err) } - monitorMutex.Lock() - mqttMonitorInstance = NewMqttMonitorService(aciveActorsDB, *config.GetConfig()) - monitorMutex.Unlock() + + SetMqttMonitorInstance(NewMqttMonitorService(aciveActorsDB, *config.GetConfig())) err = mqttMonitorInstance.Start() if err != nil { panic(err) @@ -46,9 +45,9 @@ func LazyMqttMonitorLoader(homeDir string) { } func SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) { - monitorMutex.Lock() + monitorMutex.RLock() challenger, challengee, err = mqttMonitorInstance.SelectPoPParticipantsOutOfActiveActors() - monitorMutex.Unlock() + monitorMutex.RUnlock() return } @@ -58,8 +57,8 @@ func Start() (err error) { } func AddParticipant(address string, lastSeenTS int64) (err error) { - monitorMutex.Lock() + monitorMutex.RLock() err = mqttMonitorInstance.AddParticipant(address, lastSeenTS) - monitorMutex.Unlock() + monitorMutex.RUnlock() return } diff --git a/monitor/mocks/mqtt_monitor.go b/monitor/mocks/mqtt_monitor.go index ea020a8..4553f00 100644 --- a/monitor/mocks/mqtt_monitor.go +++ b/monitor/mocks/mqtt_monitor.go @@ -1,5 +1,7 @@ package mocks +import "log" + // MockMQTTMonitorClientI is a mock of MQTTMonitorClientI interface. type MockMQTTMonitorClientI struct { myStringList []string @@ -7,6 +9,7 @@ type MockMQTTMonitorClientI struct { // AddParticipant mocks base method. func (m *MockMQTTMonitorClientI) AddParticipant(address string, _ int64) error { + log.Println("[app] [Monitor] [Mock] added participant: " + address) m.myStringList = append(m.myStringList, address) return nil @@ -20,6 +23,7 @@ func (m *MockMQTTMonitorClientI) SelectPoPParticipantsOutOfActiveActors() (strin challenger = m.myStringList[amount-2] challengee = m.myStringList[amount-1] } + log.Println("[app] [Monitor] [Mock] participants: " + challenger + ", " + challengee) return challenger, challengee, nil } diff --git a/monitor/mqtt_monitor.go b/monitor/mqtt_monitor.go index 096efd7..053fa78 100644 --- a/monitor/mqtt_monitor.go +++ b/monitor/mqtt_monitor.go @@ -18,20 +18,23 @@ import ( ) var MonitorMQTTClient util.MQTTClientI -var clientMutex sync.Mutex -var localMqttClient util.MQTTClientI type MqttMonitor struct { db *leveldb.DB dbMutex sync.Mutex // Mutex to synchronize write operations CleanupPeriodicityInMinutes time.Duration config config.Config + numberOfElementsMutex sync.RWMutex numberOfElements int64 sdkContext *sdk.Context contextMutex sync.Mutex isTerminated bool - terminationMutex sync.Mutex + terminationMutex sync.RWMutex maxRetries time.Duration + lostConnection bool + lostConnectionMutex sync.Mutex + clientMutex sync.Mutex + localMqttClient util.MQTTClientI } func (mms *MqttMonitor) Terminate() { @@ -41,12 +44,29 @@ func (mms *MqttMonitor) Terminate() { } func (mms *MqttMonitor) IsTerminated() (isTerminated bool) { - mms.terminationMutex.Lock() + mms.terminationMutex.RLock() isTerminated = mms.isTerminated - mms.terminationMutex.Unlock() + mms.terminationMutex.RUnlock() return } +func (mms *MqttMonitor) getNumDBElements() int64 { + mms.numberOfElementsMutex.RLock() + defer mms.numberOfElementsMutex.RUnlock() + return mms.numberOfElements +} + +func (mms *MqttMonitor) setNumDBElements(numElements int64) { + mms.numberOfElementsMutex.Lock() + defer mms.numberOfElementsMutex.Unlock() + mms.numberOfElements = numElements +} + +func getClientID() string { + conf := config.GetConfig() + return "monitor-" + conf.ValidatorAddress +} + func (mms *MqttMonitor) lazyLoadMonitorMQTTClient() util.MQTTClientI { if MonitorMQTTClient != nil { return MonitorMQTTClient @@ -59,10 +79,11 @@ func (mms *MqttMonitor) lazyLoadMonitorMQTTClient() util.MQTTClientI { uri = "ssl://" + hostPort } - opts := mqtt.NewClientOptions().AddBroker(uri).SetKeepAlive(60).SetCleanSession(true) - opts.SetClientID(conf.ValidatorAddress + "-monitor") + opts := mqtt.NewClientOptions().AddBroker(uri).SetKeepAlive(time.Second * 60).SetCleanSession(true) + opts.SetClientID(getClientID()) opts.SetUsername(conf.MqttUser) opts.SetPassword(conf.MqttPassword) + opts.SetConnectionLostHandler(mms.onConnectionLost) if conf.MqttTLS { tlsConfig := &tls.Config{} opts.SetTLSConfig(tlsConfig) @@ -99,7 +120,7 @@ func (mms *MqttMonitor) Start() (err error) { if err != nil { return } - mms.numberOfElements = amount + mms.setNumDBElements(amount) go mms.runPeriodicTasks() go mms.MonitorActiveParticipants() go mms.CleanupDB() @@ -108,17 +129,19 @@ func (mms *MqttMonitor) Start() (err error) { func (mms *MqttMonitor) getRandomNumbers() (challenger int, challengee int) { for challenger == challengee { // Generate random numbers - challenger = rand.Intn(int(mms.numberOfElements)) - challengee = rand.Intn(int(mms.numberOfElements)) + numElements := int(mms.getNumDBElements()) + challenger = rand.Intn(numElements) + challengee = rand.Intn(numElements) } return } func (mms *MqttMonitor) SelectPoPParticipantsOutOfActiveActors() (challenger string, challengee string, err error) { - if mms.numberOfElements < 2 { + numElements := int(mms.getNumDBElements()) + if numElements < 2 { return } randomChallenger, randomChallengee := mms.getRandomNumbers() - log.Println("[app] [Monitor] number of elements: " + strconv.Itoa(int(mms.numberOfElements))) + log.Println("[app] [Monitor] number of elements: " + strconv.Itoa(numElements)) log.Println("[app] [Monitor] selected IDs: " + strconv.Itoa(randomChallenger) + " " + strconv.Itoa(randomChallengee)) iter := mms.db.NewIterator(nil, nil) defer iter.Release() @@ -183,41 +206,62 @@ func (mms *MqttMonitor) MqttMsgHandler(_ mqtt.Client, msg mqtt.Message) { } } +func (mms *MqttMonitor) onConnectionLost(_ mqtt.Client, err error) { + log.Println("[app] [Monitor] Connection lost: " + err.Error()) + // Handle connection loss here (e.g., reconnect attempts, logging) + if !mms.IsTerminated() { + mms.lostConnectionMutex.Lock() + mms.lostConnection = true + mms.lostConnectionMutex.Unlock() + } +} + func (mms *MqttMonitor) MonitorActiveParticipants() { - clientMutex.Lock() - if localMqttClient != nil { + mms.clientMutex.Lock() + if mms.localMqttClient != nil { log.Println("[app] [Monitor] client is still working") - clientMutex.Unlock() + mms.clientMutex.Unlock() return } - localMqttClient = mms.lazyLoadMonitorMQTTClient() - client := localMqttClient - clientMutex.Unlock() + mms.localMqttClient = mms.lazyLoadMonitorMQTTClient() + mqttClient := mms.localMqttClient + mms.clientMutex.Unlock() // Maximum reconnection attempts (adjust as needed) mms.SetMaxRetries() for !mms.IsTerminated() && mms.maxRetries > 0 { - if token := client.Connect(); token.Wait() && token.Error() != nil { + if token := mqttClient.Connect(); token.Wait() && token.Error() != nil { log.Println("[app] [Monitor] error connecting to mqtt: " + token.Error().Error()) mms.maxRetries-- time.Sleep(time.Second * 5) continue } + mms.lostConnectionMutex.Lock() + mms.lostConnection = false + mms.lostConnectionMutex.Unlock() + + log.Println("[app] [Monitor] established connection") var messageHandler mqtt.MessageHandler = mms.MqttMsgHandler // Subscribe to a topic subscriptionTopic := "tele/#" - if token := client.Subscribe(subscriptionTopic, 0, messageHandler); token.Wait() && token.Error() != nil { + if token := mqttClient.Subscribe(subscriptionTopic, 0, messageHandler); token.Wait() && token.Error() != nil { log.Println("[app] [Monitor] error registering the mqtt subscription: " + token.Error().Error()) continue } + log.Println("[app] [Monitor] subscribed to tele/# channels") for !mms.IsTerminated() { - if !client.IsConnected() { + mms.lostConnectionMutex.Lock() + lostConnectionEvent := mms.lostConnection + mms.lostConnectionMutex.Unlock() + if !mqttClient.IsConnected() || !mqttClient.IsConnectionOpen() || lostConnectionEvent { log.Println("[app] [Monitor] retry establishing a connection") break // Exit inner loop on disconnect } + + SendUpdateMessage(mqttClient) mms.SetMaxRetries() time.Sleep(60 * time.Second) // Adjust sleep time based on your needs } @@ -227,9 +271,16 @@ func (mms *MqttMonitor) MonitorActiveParticipants() { log.Println("[app] [Monitor] Reached maximum reconnection attempts. Exiting. New client will be activated soon.") } - clientMutex.Lock() - localMqttClient = nil - clientMutex.Unlock() + mms.clientMutex.Lock() + mms.localMqttClient = nil + mms.clientMutex.Unlock() +} + +func SendUpdateMessage(mqttClient util.MQTTClientI) { + // Publish message + now := time.Now().Format("2006-01-02 15:04:05") // Adjust format as needed + token := mqttClient.Publish("tele/"+getClientID(), 1, false, now) + token.Wait() } func (mms *MqttMonitor) SetMaxRetries() { diff --git a/tests/e2e/dao/gas/gas_consumption_suite.go b/tests/e2e/dao/gas/gas_consumption_suite.go index 5ee6de7..059cb09 100644 --- a/tests/e2e/dao/gas/gas_consumption_suite.go +++ b/tests/e2e/dao/gas/gas_consumption_suite.go @@ -109,6 +109,7 @@ func (s *ConsumptionE2ETestSuite) TestValidatorConsumption() { out, err := lib.BroadcastTxWithFileLock(val.Address, msgs...) s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) _, err = clitestutil.GetRawLogFromTxOut(val, out) diff --git a/tests/e2e/dao/pop/selection_suite.go b/tests/e2e/dao/pop/selection_suite.go index fb2898f..0b001fb 100644 --- a/tests/e2e/dao/pop/selection_suite.go +++ b/tests/e2e/dao/pop/selection_suite.go @@ -164,9 +164,9 @@ func (s *SelectionE2ETestSuite) TestPopSelectionNoActors() { } func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { - err := e2etestutil.AttestMachine(s.network, machines[0].name, machines[0].mnemonic, 0, s.feeDenom) + err := monitor.AddParticipant(machines[0].address, time.Now().Unix()) s.Require().NoError(err) - err = monitor.AddParticipant(machines[0].address, time.Now().Unix()) + err = e2etestutil.AttestMachine(s.network, machines[0].name, machines[0].mnemonic, 0, s.feeDenom) s.Require().NoError(err) out := s.perpareLocalTest() @@ -176,9 +176,9 @@ func (s *SelectionE2ETestSuite) TestPopSelectionOneActors() { } func (s *SelectionE2ETestSuite) TestPopSelectionTwoActors() { - err := e2etestutil.AttestMachine(s.network, machines[1].name, machines[1].mnemonic, 1, s.feeDenom) + err := monitor.AddParticipant(machines[1].address, time.Now().Unix()) s.Require().NoError(err) - err = monitor.AddParticipant(machines[1].address, time.Now().Unix()) + err = e2etestutil.AttestMachine(s.network, machines[1].name, machines[1].mnemonic, 1, s.feeDenom) s.Require().NoError(err) out := s.perpareLocalTest() diff --git a/tests/e2e/machine/suite.go b/tests/e2e/machine/suite.go index 029f8ba..2a1008b 100644 --- a/tests/e2e/machine/suite.go +++ b/tests/e2e/machine/suite.go @@ -68,6 +68,7 @@ func (s *E2ETestSuite) TestAttestMachine() { out, err := e2etestutil.BuildSignBroadcastTx(s.T(), val.Address, msg1) s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) s.Require().NoError(s.network.WaitForNextBlock()) rawLog, err := clitestutil.GetRawLogFromTxOut(val, out) s.Require().NoError(err) diff --git a/testutil/e2e/e2e.go b/testutil/e2e/e2e.go index 92cb05a..91facf6 100644 --- a/testutil/e2e/e2e.go +++ b/testutil/e2e/e2e.go @@ -44,6 +44,10 @@ func FundAccount(network *network.Network, account *keyring.Record, tokenDenom s return err } + err = network.WaitForNextBlock() + if err != nil { + return err + } err = network.WaitForNextBlock() if err != nil { return err @@ -99,6 +103,10 @@ func AttestMachine(network *network.Network, name string, mnemonic string, num i return err } + err = network.WaitForNextBlock() + if err != nil { + return err + } err = network.WaitForNextBlock() if err != nil { return err diff --git a/util/logger.go b/util/logger.go index abf6b2c..1ad7fdf 100644 --- a/util/logger.go +++ b/util/logger.go @@ -16,7 +16,7 @@ var ( globalApplicationLoggerTag string appLogger *AppLogger initAppLogger sync.Once - syncTestingLog sync.Mutex + syncTestingLog sync.RWMutex ) func init() { @@ -48,13 +48,13 @@ func format(msg string, keyvals ...interface{}) string { } func (logger *AppLogger) testingLog(msg string, keyvals ...interface{}) { + syncTestingLog.RLock() + defer syncTestingLog.RUnlock() if logger.testingLogger == nil { return } msg = format(msg, keyvals...) - syncTestingLog.Lock() logger.testingLogger.Logf(msg) - syncTestingLog.Unlock() } func (logger *AppLogger) Info(ctx sdk.Context, msg string, keyvals ...interface{}) { diff --git a/util/mocks/mqtt.go b/util/mocks/mqtt.go index 0d6bdfd..be8e368 100644 --- a/util/mocks/mqtt.go +++ b/util/mocks/mqtt.go @@ -9,14 +9,15 @@ import ( // MockMQTTClient is the mock mqtt client type MockMQTTClient struct { - ConnectFunc func() mqtt.Token - DisconnectFunc func(quiesce uint) - PublishFunc func(topic string, qos byte, retained bool, payload interface{}) mqtt.Token - SubscribeFunc func(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token - UnsubscribeFunc func(topics ...string) mqtt.Token - IsConnectedFunc func() bool - connected bool - connectedMutex sync.Mutex + ConnectFunc func() mqtt.Token + DisconnectFunc func(quiesce uint) + PublishFunc func(topic string, qos byte, retained bool, payload interface{}) mqtt.Token + SubscribeFunc func(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token + UnsubscribeFunc func(topics ...string) mqtt.Token + IsConnectedFunc func() bool + IsConnectionOpenFunc func() bool + connected bool + connectedMutex sync.Mutex } // GetConnectFunc fetches the mock client's `Connect` func @@ -129,3 +130,10 @@ func (m *MockMQTTClient) IsConnected() bool { m.connectedMutex.Unlock() return connected } + +func (m *MockMQTTClient) IsConnectionOpen() bool { + m.connectedMutex.Lock() + connected := m.connected + m.connectedMutex.Unlock() + return connected +} diff --git a/util/mqtt.go b/util/mqtt.go index a288235..49f7305 100644 --- a/util/mqtt.go +++ b/util/mqtt.go @@ -23,6 +23,7 @@ type MQTTClientI interface { Subscribe(topic string, qos byte, callback mqtt.MessageHandler) mqtt.Token Unsubscribe(topics ...string) mqtt.Token IsConnected() bool + IsConnectionOpen() bool } var ( From dd2621afde52e729d26c27f430146d9b013ab8be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Tue, 28 May 2024 14:54:31 +0200 Subject: [PATCH 17/19] hot fix for the tasmota PoP issues (#403) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * hot fix for the RDDL-Tasmota PoP issues * adjusted test case Signed-off-by: Jürgen Eckel --- x/asset/keeper/asset.go | 1 + x/asset/keeper/asset_test.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/x/asset/keeper/asset.go b/x/asset/keeper/asset.go index 6e680c9..4d3b9f1 100644 --- a/x/asset/keeper/asset.go +++ b/x/asset/keeper/asset.go @@ -35,6 +35,7 @@ func (k Keeper) GetCidsByAddress(ctx sdk.Context, address string) (cids []string if string(addressBytes) == address { cids = append(cids, string(cidBytes)) + break } } return cids, len(cids) > 0 diff --git a/x/asset/keeper/asset_test.go b/x/asset/keeper/asset_test.go index 9864a79..a7eba8c 100644 --- a/x/asset/keeper/asset_test.go +++ b/x/asset/keeper/asset_test.go @@ -45,8 +45,8 @@ func TestGetAssetByPubKeys(t *testing.T) { _ = createNAsset(keeper, ctx, 10) assets, found := keeper.GetCidsByAddress(ctx, "plmnt_address") assert.True(t, found) - assert.Equal(t, len(assets), 5) + assert.Equal(t, len(assets), 1) // TODO: just for HF: before 5 assets, found = keeper.GetCidsByAddress(ctx, "plmnt_address1") assert.True(t, found) - assert.Equal(t, len(assets), 5) + assert.Equal(t, len(assets), 1) // TODO: just for HF: before 5 } From 1462b6ee88088da332ea1adb236ee4c0914b7589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Eckel?= Date: Thu, 6 Jun 2024 14:37:09 +0200 Subject: [PATCH 18/19] add only legit machine addresses to the PoPSelection process (#404) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add only legit machine addresses to the PoPSelection process Signed-off-by: Jürgen Eckel --- monitor/mqtt_monitor.go | 84 ++++++++++++++++++++++++++++++++++++ monitor/mqtt_monitor_test.go | 7 +++ 2 files changed, 91 insertions(+) diff --git a/monitor/mqtt_monitor.go b/monitor/mqtt_monitor.go index 053fa78..c56aff9 100644 --- a/monitor/mqtt_monitor.go +++ b/monitor/mqtt_monitor.go @@ -1,10 +1,14 @@ package monitor import ( + "context" "crypto/tls" + "encoding/json" + "io" "log" "math/rand" "net" + "net/http" "strconv" "strings" "sync" @@ -196,6 +200,11 @@ func (mms *MqttMonitor) MqttMsgHandler(_ mqtt.Client, msg mqtt.Message) { return } + active, err := IsLegitMachineAddress(address) + if err != nil || !active { + return + } + unixTime := time.Now().Unix() err = mms.AddParticipant(address, unixTime) @@ -206,6 +215,81 @@ func (mms *MqttMonitor) MqttMsgHandler(_ mqtt.Client, msg mqtt.Message) { } } +func IsLegitMachineAddress(address string) (active bool, err error) { + url := "http://localhost:1317/planetmint/machine/address/" + address + + // Create a new HTTP client + client := &http.Client{} + + // Create a new request + ctx := context.Background() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + log.Println("[app] [Monitor] cannot send machine query request " + err.Error()) + return + } + + // Set the header + req.Header.Set("Accept", "application/json") + + // Send the request + resp, err := client.Do(req) + if err != nil { + log.Println("[app] [Monitor] cannot connect to server: " + err.Error()) + return + } + + // Close the response body + defer resp.Body.Close() + + // Read the response body + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Println("[app] [Monitor] cannot read response: " + err.Error()) + return + } + + // Check the status code + if resp.StatusCode != http.StatusOK { + log.Printf("[app] [Monitor] Error: unexpected status code: " + string(body)) + return + } + + // Unmarshal the response body into a map + var data map[string]interface{} + err = json.Unmarshal(body, &data) + if err != nil { + log.Println("[app] [Monitor] cannot unmarshal response " + err.Error()) + return + } + + // Check if the "info" key exists + machineValue, ok := data["machine"] + if !ok { + log.Println("[app] [Monitor] response does not contain the required machine") + return + } + machineMap, ok := machineValue.(map[string]interface{}) + if !ok { + log.Println("[app] [Monitor] cannot convert machine map") + return + } + addressMap, ok := machineMap["address"] + if !ok { + log.Println("[app] [Monitor] response does not contain the required name") + return + } + value, ok := addressMap.(string) + if !ok || value != address { + log.Println("[app] [Monitor] return machine is not the required one") + return + } + + err = nil + active = true + return +} + func (mms *MqttMonitor) onConnectionLost(_ mqtt.Client, err error) { log.Println("[app] [Monitor] Connection lost: " + err.Error()) // Handle connection loss here (e.g., reconnect attempts, logging) diff --git a/monitor/mqtt_monitor_test.go b/monitor/mqtt_monitor_test.go index f842669..3ca1a0b 100644 --- a/monitor/mqtt_monitor_test.go +++ b/monitor/mqtt_monitor_test.go @@ -99,3 +99,10 @@ func TestCleanupPrecisionTest(t *testing.T) { assert.Contains(t, challengee, "plmnt") mqttMonitor.Terminate() } + +func TestIsLegitMachineAddress(t *testing.T) { + t.SkipNow() + active, err := monitor.IsLegitMachineAddress("plmnt1z6xmwqfnn9mvean9gsd57segawgjykpxw8hq5t") + assert.NoError(t, err) + assert.Equal(t, active, true) +} From 468fbb530534694598060d7d5f310ac4b4fea49b Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger <64837895+LaurentMontBlanc@users.noreply.github.com> Date: Thu, 6 Jun 2024 14:39:05 +0200 Subject: [PATCH 19/19] 402 bug asset query does not repsect lookupperiodinmin value (#405) * chore: remove unused asset.proto and asset.pb.go files * feat: add AssetByAddress store functionality * fix: asset query now returns numElements passed in req * chore: add migration for new store mechanics * chore: set upgradehandler for assetmodule migration * chore: removed obsolete GetCIDsByAddress function * chore: adjust cmd usage --------- Signed-off-by: Lorenz Herzberger --- app/app.go | 3 + docs/static/openapi.yml | 4 +- proto/planetmintgo/asset/asset.proto | 8 - proto/planetmintgo/asset/query.proto | 4 +- util/kv_serialize.go | 13 ++ x/asset/client/cli/query_address.go | 8 +- x/asset/keeper/asset.go | 53 ++++- x/asset/keeper/asset_test.go | 42 +++- x/asset/keeper/migrations.go | 18 ++ x/asset/keeper/query_address.go | 3 +- x/asset/keeper/query_address_test.go | 5 +- x/asset/migrations/v2/store.go | 39 ++++ x/asset/module.go | 7 +- x/asset/types/asset.pb.go | 313 --------------------------- x/asset/types/keys.go | 15 ++ x/asset/types/query.pb.go | 93 ++++---- x/asset/types/query.pb.gw.go | 20 +- 17 files changed, 241 insertions(+), 407 deletions(-) delete mode 100644 proto/planetmintgo/asset/asset.proto create mode 100644 x/asset/keeper/migrations.go create mode 100644 x/asset/migrations/v2/store.go delete mode 100644 x/asset/types/asset.pb.go diff --git a/app/app.go b/app/app.go index 04aae52..2315181 100644 --- a/app/app.go +++ b/app/app.go @@ -996,4 +996,7 @@ func (app *App) setupUpgradeHandlers() { fromVM[machinemoduletypes.ModuleName] = machinemodule.AppModule{}.ConsensusVersion() return app.mm.RunMigrations(ctx, app.configurator, fromVM) }) + app.UpgradeKeeper.SetUpgradeHandler("v0.10.0", func(ctx sdk.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return app.mm.RunMigrations(ctx, app.configurator, fromVM) + }) } diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml index e0d11ec..88419cc 100644 --- a/docs/static/openapi.yml +++ b/docs/static/openapi.yml @@ -46437,7 +46437,7 @@ paths: } tags: - Query - /planetmint/asset/address/{address}/{lookupPeriodInMin}: + /planetmint/asset/address/{address}/{numElements}: get: summary: Queries a list of GetCIDsByAddress items. operationId: PlanetmintgoAssetGetCIDsByAddress @@ -46502,7 +46502,7 @@ paths: in: path required: true type: string - - name: lookupPeriodInMin + - name: numElements in: path required: true type: string diff --git a/proto/planetmintgo/asset/asset.proto b/proto/planetmintgo/asset/asset.proto deleted file mode 100644 index 8ef5375..0000000 --- a/proto/planetmintgo/asset/asset.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; -package planetmintgo.asset; - -option go_package = "github.com/planetmint/planetmint-go/x/asset/types"; - -message Asset { - string cid = 1; -} diff --git a/proto/planetmintgo/asset/query.proto b/proto/planetmintgo/asset/query.proto index cfa3ab4..655c6e2 100644 --- a/proto/planetmintgo/asset/query.proto +++ b/proto/planetmintgo/asset/query.proto @@ -20,7 +20,7 @@ service Query { // Queries a list of GetCIDsByAddress items. rpc GetCIDsByAddress (QueryGetCIDsByAddressRequest) returns (QueryGetCIDsByAddressResponse) { - option (google.api.http).get = "/planetmint/asset/address/{address}/{lookupPeriodInMin}"; + option (google.api.http).get = "/planetmint/asset/address/{address}/{numElements}"; } @@ -42,7 +42,7 @@ message QueryParamsResponse { message QueryGetCIDsByAddressRequest { string address = 1; - uint64 lookupPeriodInMin = 2; + uint64 numElements = 2; cosmos.base.query.v1beta1.PageRequest pagination = 3; } diff --git a/util/kv_serialize.go b/util/kv_serialize.go index 764ee4e..9aad528 100644 --- a/util/kv_serialize.go +++ b/util/kv_serialize.go @@ -19,6 +19,19 @@ func DeserializeInt64(value []byte) int64 { return int64(integer - 1) } +func SerializeUint64(value uint64) []byte { + buf := make([]byte, 8) + // Adding 1 because 0 will be interpreted as nil, which is an invalid key + binary.BigEndian.PutUint64(buf, value+1) + return buf +} + +func DeserializeUint64(value []byte) uint64 { + integer := binary.BigEndian.Uint64(value) + // Subtract 1 because addition in serialization + return integer - 1 +} + func SerializeString(value string) []byte { byteArray := []byte(value) return byteArray diff --git a/x/asset/client/cli/query_address.go b/x/asset/client/cli/query_address.go index e9c886f..cdefe0a 100644 --- a/x/asset/client/cli/query_address.go +++ b/x/asset/client/cli/query_address.go @@ -14,12 +14,12 @@ var _ = strconv.Itoa(0) func CmdGetByAddress() *cobra.Command { cmd := &cobra.Command{ - Use: "address [address] [lookup-period-in-min]", + Use: "address [address] [num-elements]", Short: "Query for assets by address", Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) (err error) { reqAddress := args[0] - reqLookupPeriodInMin, err := cast.ToUint64E(args[1]) + reqNumElements, err := cast.ToUint64E(args[1]) if err != nil { return err } @@ -33,8 +33,8 @@ func CmdGetByAddress() *cobra.Command { params := &types.QueryGetCIDsByAddressRequest{ - Address: reqAddress, - LookupPeriodInMin: reqLookupPeriodInMin, + Address: reqAddress, + NumElements: reqNumElements, } pageReq, err := client.ReadPageRequest(cmd.Flags()) diff --git a/x/asset/keeper/asset.go b/x/asset/keeper/asset.go index 4d3b9f1..6ab90ad 100644 --- a/x/asset/keeper/asset.go +++ b/x/asset/keeper/asset.go @@ -8,9 +8,36 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +func (k Keeper) setAddresAssetCount(ctx sdk.Context, address string, count uint64) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) + store.Set(types.AddressCountKey(address), util.SerializeUint64(count)) +} + +func (k Keeper) GetAddressAssetCount(ctx sdk.Context, address string) (count uint64, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) + countBytes := store.Get(types.AddressCountKey(address)) + if countBytes == nil { + return 0, false + } + return util.DeserializeUint64(countBytes), true +} + +func (k Keeper) incrementAddressAssetCount(ctx sdk.Context, address string) uint64 { + count, _ := k.GetAddressAssetCount(ctx, address) + k.setAddresAssetCount(ctx, address, count+1) + return count + 1 +} + +func (k Keeper) StoreAddressAsset(ctx sdk.Context, msg types.MsgNotarizeAsset) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressPrefix(msg.GetCreator())) + count := k.incrementAddressAssetCount(ctx, msg.GetCreator()) + store.Set(util.SerializeUint64(count), []byte(msg.GetCid())) +} + func (k Keeper) StoreAsset(ctx sdk.Context, msg types.MsgNotarizeAsset) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) store.Set(util.SerializeString(msg.GetCid()), []byte(msg.GetCreator())) + k.StoreAddressAsset(ctx, msg) } func (k Keeper) GetAsset(ctx sdk.Context, cid string) (msg types.MsgNotarizeAsset, found bool) { @@ -24,19 +51,23 @@ func (k Keeper) GetAsset(ctx sdk.Context, cid string) (msg types.MsgNotarizeAsse return msg, true } -func (k Keeper) GetCidsByAddress(ctx sdk.Context, address string) (cids []string, found bool) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.AssetKey)) +func (k Keeper) GetAssetByAddressAndID(ctx sdk.Context, address string, id uint64) (cid string, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressPrefix(address)) + cidBytes := store.Get(util.SerializeUint64(id)) + if cidBytes == nil { + return cid, false + } + return string(cidBytes), true +} - reverseIterator := store.ReverseIterator(nil, nil) - defer reverseIterator.Close() - for ; reverseIterator.Valid(); reverseIterator.Next() { - addressBytes := reverseIterator.Value() - cidBytes := reverseIterator.Key() +func (k Keeper) GetAssetsByAddress(ctx sdk.Context, address string, start []byte, end []byte) (cids []string, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressPrefix(address)) - if string(addressBytes) == address { - cids = append(cids, string(cidBytes)) - break - } + iterator := store.ReverseIterator(start, end) + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + cidBytes := iterator.Value() + cids = append(cids, string(cidBytes)) } return cids, len(cids) > 0 } diff --git a/x/asset/keeper/asset_test.go b/x/asset/keeper/asset_test.go index a7eba8c..68d2a58 100644 --- a/x/asset/keeper/asset_test.go +++ b/x/asset/keeper/asset_test.go @@ -6,6 +6,7 @@ import ( "testing" keepertest "github.com/planetmint/planetmint-go/testutil/keeper" + "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/asset/keeper" "github.com/planetmint/planetmint-go/x/asset/types" @@ -39,14 +40,43 @@ func TestGetAssetbyCid(t *testing.T) { } } -func TestGetAssetByPubKeys(t *testing.T) { +func TestAssetCount(t *testing.T) { t.Parallel() keeper, ctx := keepertest.AssetKeeper(t) - _ = createNAsset(keeper, ctx, 10) - assets, found := keeper.GetCidsByAddress(ctx, "plmnt_address") + numItems := 10 + items := createNAsset(keeper, ctx, numItems) + count, found := keeper.GetAddressAssetCount(ctx, items[0].Creator) assert.True(t, found) - assert.Equal(t, len(assets), 1) // TODO: just for HF: before 5 - assets, found = keeper.GetCidsByAddress(ctx, "plmnt_address1") + assert.Equal(t, uint64(5), count) + count, found = keeper.GetAddressAssetCount(ctx, items[1].Creator) assert.True(t, found) - assert.Equal(t, len(assets), 1) // TODO: just for HF: before 5 + assert.Equal(t, uint64(5), count) +} + +func TestGetAssetByAddressAndID(t *testing.T) { + t.Parallel() + keeper, ctx := keepertest.AssetKeeper(t) + items := createNAsset(keeper, ctx, 1) + cid, found := keeper.GetAssetByAddressAndID(ctx, items[0].Creator, 1) + assert.True(t, found) + assert.Equal(t, items[0].Cid, cid) +} + +func TestGetAssetsByAddress(t *testing.T) { + t.Parallel() + keeper, ctx := keepertest.AssetKeeper(t) + items := createNAsset(keeper, ctx, 10) + cids, found := keeper.GetAssetsByAddress(ctx, items[0].Creator, nil, nil) + assert.True(t, found) + assert.Equal(t, items[8].Cid, cids[0]) + assert.Equal(t, items[4].Cid, cids[2]) + cids, found = keeper.GetAssetsByAddress(ctx, items[1].Creator, nil, nil) + assert.True(t, found) + assert.Equal(t, items[9].Cid, cids[0]) + assert.Equal(t, items[5].Cid, cids[2]) + + cids, found = keeper.GetAssetsByAddress(ctx, items[0].Creator, util.SerializeUint64(3), nil) + assert.True(t, found) + assert.Equal(t, 3, len(cids)) + assert.Equal(t, items[8].Cid, cids[0]) } diff --git a/x/asset/keeper/migrations.go b/x/asset/keeper/migrations.go new file mode 100644 index 0000000..9b0d35b --- /dev/null +++ b/x/asset/keeper/migrations.go @@ -0,0 +1,18 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + v2 "github.com/planetmint/planetmint-go/x/asset/migrations/v2" +) + +type Migrator struct { + keeper Keeper +} + +func NewMigrator(keeper Keeper) Migrator { + return Migrator{keeper: keeper} +} + +func (m Migrator) Migrate1to2(ctx sdk.Context) error { + return v2.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc) +} diff --git a/x/asset/keeper/query_address.go b/x/asset/keeper/query_address.go index ccf5777..6bb7c05 100644 --- a/x/asset/keeper/query_address.go +++ b/x/asset/keeper/query_address.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/planetmint/planetmint-go/errormsg" + "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/asset/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -17,7 +18,7 @@ func (k Keeper) GetCIDsByAddress(goCtx context.Context, req *types.QueryGetCIDsB ctx := sdk.UnwrapSDKContext(goCtx) - cids, found := k.GetCidsByAddress(ctx, req.GetAddress()) + cids, found := k.GetAssetsByAddress(ctx, req.GetAddress(), nil, util.SerializeUint64(req.GetNumElements())) if !found { return nil, status.Error(codes.NotFound, "no CIDs found") } diff --git a/x/asset/keeper/query_address_test.go b/x/asset/keeper/query_address_test.go index 8529dc1..dea2dbd 100644 --- a/x/asset/keeper/query_address_test.go +++ b/x/asset/keeper/query_address_test.go @@ -4,6 +4,7 @@ import ( "testing" keepertest "github.com/planetmint/planetmint-go/testutil/keeper" + "github.com/planetmint/planetmint-go/util" "github.com/planetmint/planetmint-go/x/asset/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -16,7 +17,7 @@ func TestGetNotarizedAssetByAddress(t *testing.T) { keeper, ctx := keepertest.AssetKeeper(t) wctx := sdk.WrapSDKContext(ctx) _ = createNAsset(keeper, ctx, 10) - assets, _ := keeper.GetCidsByAddress(ctx, "plmnt_address") + assets, _ := keeper.GetAssetsByAddress(ctx, "plmnt_address", nil, util.SerializeUint64(3)) for _, tc := range []struct { desc string request *types.QueryGetCIDsByAddressRequest @@ -25,7 +26,7 @@ func TestGetNotarizedAssetByAddress(t *testing.T) { }{ { desc: "cid found", - request: &types.QueryGetCIDsByAddressRequest{Address: "plmnt_address"}, + request: &types.QueryGetCIDsByAddressRequest{Address: "plmnt_address", NumElements: 3}, response: &types.QueryGetCIDsByAddressResponse{Cids: assets}, }, { diff --git a/x/asset/migrations/v2/store.go b/x/asset/migrations/v2/store.go new file mode 100644 index 0000000..87452b9 --- /dev/null +++ b/x/asset/migrations/v2/store.go @@ -0,0 +1,39 @@ +package v2 + +import ( + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/planetmint/planetmint-go/util" + "github.com/planetmint/planetmint-go/x/asset/types" +) + +func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey, _ codec.BinaryCodec) error { + store := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.AssetKey)) + + mapping := make(map[string][][]byte) + + // read all cids + iterator := store.Iterator(nil, nil) + defer iterator.Close() + for ; iterator.Valid(); iterator.Next() { + addressBytes := iterator.Value() + cidBytes := iterator.Key() + + // map all cids by address + mapping[string(addressBytes)] = append(mapping[string(addressBytes)], cidBytes) + } + + // store all cids with new key + for address, cids := range mapping { + assetByAddressStore := prefix.NewStore(ctx.KVStore(storeKey), types.AddressPrefix(address)) + for i, cid := range cids { + assetByAddressStore.Set(util.SerializeUint64(uint64(i)), cid) + } + addressAssetCountStore := prefix.NewStore(ctx.KVStore(storeKey), types.KeyPrefix(types.AssetKey)) + addressAssetCountStore.Set(types.AddressCountKey(address), util.SerializeUint64(uint64(len(cids)))) + } + + return nil +} diff --git a/x/asset/module.go b/x/asset/module.go index b79e807..99a108b 100644 --- a/x/asset/module.go +++ b/x/asset/module.go @@ -116,6 +116,11 @@ func NewAppModule( func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) + + m := keeper.NewMigrator(am.keeper) + if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { + panic(fmt.Errorf("failed to register migration of %s to v2: %w", types.ModuleName, err)) + } } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) @@ -141,7 +146,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion is a sequence number for state-breaking change of the module. It should be incremented on each consensus-breaking change introduced by the module. To avoid wrong/empty versions, the initial version should be set to 1 -func (AppModule) ConsensusVersion() uint64 { return 1 } +func (AppModule) ConsensusVersion() uint64 { return 2 } // BeginBlock contains the logic that is automatically triggered at the beginning of each block func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) { diff --git a/x/asset/types/asset.pb.go b/x/asset/types/asset.pb.go deleted file mode 100644 index 8ec2af3..0000000 --- a/x/asset/types/asset.pb.go +++ /dev/null @@ -1,313 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: planetmintgo/asset/asset.proto - -package types - -import ( - fmt "fmt" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Asset struct { - Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` -} - -func (m *Asset) Reset() { *m = Asset{} } -func (m *Asset) String() string { return proto.CompactTextString(m) } -func (*Asset) ProtoMessage() {} -func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_03dd37a25f684e6e, []int{0} -} -func (m *Asset) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Asset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Asset.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Asset) XXX_Merge(src proto.Message) { - xxx_messageInfo_Asset.Merge(m, src) -} -func (m *Asset) XXX_Size() int { - return m.Size() -} -func (m *Asset) XXX_DiscardUnknown() { - xxx_messageInfo_Asset.DiscardUnknown(m) -} - -var xxx_messageInfo_Asset proto.InternalMessageInfo - -func (m *Asset) GetCid() string { - if m != nil { - return m.Cid - } - return "" -} - -func init() { - proto.RegisterType((*Asset)(nil), "planetmintgo.asset.Asset") -} - -func init() { proto.RegisterFile("planetmintgo/asset/asset.proto", fileDescriptor_03dd37a25f684e6e) } - -var fileDescriptor_03dd37a25f684e6e = []byte{ - // 143 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2b, 0xc8, 0x49, 0xcc, - 0x4b, 0x2d, 0xc9, 0xcd, 0xcc, 0x2b, 0x49, 0xcf, 0xd7, 0x4f, 0x2c, 0x2e, 0x4e, 0x2d, 0x81, 0x90, - 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x42, 0xc8, 0xf2, 0x7a, 0x60, 0x19, 0x25, 0x49, 0x2e, - 0x56, 0x47, 0x10, 0x43, 0x48, 0x80, 0x8b, 0x39, 0x39, 0x33, 0x45, 0x82, 0x51, 0x81, 0x51, 0x83, - 0x33, 0x08, 0xc4, 0x74, 0xf2, 0x3e, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, - 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, - 0xc3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x84, 0x99, 0x48, 0x4c, - 0xdd, 0xf4, 0x7c, 0xfd, 0x0a, 0xa8, 0x0b, 0x4a, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x4e, - 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x38, 0x8c, 0xdf, 0xa4, 0x00, 0x00, 0x00, -} - -func (m *Asset) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Asset) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Asset) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Cid) > 0 { - i -= len(m.Cid) - copy(dAtA[i:], m.Cid) - i = encodeVarintAsset(dAtA, i, uint64(len(m.Cid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintAsset(dAtA []byte, offset int, v uint64) int { - offset -= sovAsset(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Asset) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Cid) - if l > 0 { - n += 1 + l + sovAsset(uint64(l)) - } - return n -} - -func sovAsset(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozAsset(x uint64) (n int) { - return sovAsset(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Asset) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAsset - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Asset: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Asset: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Cid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAsset - } - 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 ErrInvalidLengthAsset - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAsset - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Cid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAsset(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAsset - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipAsset(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowAsset - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowAsset - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowAsset - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthAsset - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupAsset - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthAsset - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthAsset = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowAsset = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupAsset = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/asset/types/keys.go b/x/asset/types/keys.go index 814a661..cb6cd08 100644 --- a/x/asset/types/keys.go +++ b/x/asset/types/keys.go @@ -14,8 +14,23 @@ const ( MemStoreKey = "mem_asset" AssetKey = "Asset/value/" + CountKey = "count/" ) +func AddressCountKey(address string) (prefix []byte) { + addressPrefix := AddressPrefix(address) + prefix = append(prefix, addressPrefix...) + prefix = append(prefix, []byte(CountKey)...) + return +} + +func AddressPrefix(address string) (prefix []byte) { + addressBytes := []byte(address) + prefix = append(prefix, addressBytes...) + prefix = append(prefix, []byte("/")...) + return +} + func KeyPrefix(p string) []byte { return []byte(p) } diff --git a/x/asset/types/query.pb.go b/x/asset/types/query.pb.go index 94edffb..c81be35 100644 --- a/x/asset/types/query.pb.go +++ b/x/asset/types/query.pb.go @@ -114,9 +114,9 @@ func (m *QueryParamsResponse) GetParams() Params { } type QueryGetCIDsByAddressRequest struct { - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - LookupPeriodInMin uint64 `protobuf:"varint,2,opt,name=lookupPeriodInMin,proto3" json:"lookupPeriodInMin,omitempty"` - Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + NumElements uint64 `protobuf:"varint,2,opt,name=numElements,proto3" json:"numElements,omitempty"` + Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` } func (m *QueryGetCIDsByAddressRequest) Reset() { *m = QueryGetCIDsByAddressRequest{} } @@ -159,9 +159,9 @@ func (m *QueryGetCIDsByAddressRequest) GetAddress() string { return "" } -func (m *QueryGetCIDsByAddressRequest) GetLookupPeriodInMin() uint64 { +func (m *QueryGetCIDsByAddressRequest) GetNumElements() uint64 { if m != nil { - return m.LookupPeriodInMin + return m.NumElements } return 0 } @@ -333,42 +333,41 @@ func init() { func init() { proto.RegisterFile("planetmintgo/asset/query.proto", fileDescriptor_5832a953a81817c0) } var fileDescriptor_5832a953a81817c0 = []byte{ - // 547 bytes of a gzipped FileDescriptorProto + // 541 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcf, 0x6e, 0xd3, 0x30, - 0x18, 0x6f, 0xda, 0x52, 0x34, 0x73, 0xd9, 0xcc, 0x0e, 0x51, 0xd8, 0xb2, 0x2a, 0x48, 0x5b, 0x85, - 0x20, 0x26, 0xe5, 0x00, 0x9c, 0xd0, 0x0a, 0x62, 0x9a, 0xf8, 0x57, 0x72, 0xe4, 0xe6, 0x26, 0x56, - 0xb0, 0x68, 0xed, 0x2c, 0x76, 0x11, 0xa5, 0xf4, 0xc2, 0x13, 0x20, 0xf1, 0x00, 0xbc, 0x01, 0x67, - 0x1e, 0x61, 0xc7, 0x49, 0x5c, 0x38, 0x21, 0x68, 0x79, 0x10, 0x14, 0xdb, 0x55, 0x1b, 0xd2, 0x32, - 0xed, 0xf6, 0xd5, 0xdf, 0xf7, 0xfb, 0xd3, 0xdf, 0xf7, 0x29, 0xc0, 0x4d, 0xfb, 0x98, 0x11, 0x39, - 0xa0, 0x4c, 0x26, 0x1c, 0x61, 0x21, 0x88, 0x44, 0x27, 0x43, 0x92, 0x8d, 0xfc, 0x34, 0xe3, 0x92, - 0x43, 0xb8, 0xdc, 0xf7, 0x55, 0xdf, 0xd9, 0x4e, 0x78, 0xc2, 0x55, 0x1b, 0xe5, 0x95, 0x9e, 0x74, - 0x76, 0x12, 0xce, 0x93, 0x3e, 0x41, 0x38, 0xa5, 0x08, 0x33, 0xc6, 0x25, 0x96, 0x94, 0x33, 0x61, - 0xba, 0x37, 0x22, 0x2e, 0x06, 0x5c, 0xa0, 0x1e, 0x16, 0x44, 0x0b, 0xa0, 0xb7, 0x41, 0x8f, 0x48, - 0x1c, 0xa0, 0x14, 0x27, 0x94, 0xa9, 0x61, 0x33, 0xbb, 0xb7, 0xc2, 0x53, 0x8a, 0x33, 0x3c, 0x30, - 0x64, 0xde, 0x36, 0x80, 0x2f, 0x73, 0x8a, 0xae, 0x7a, 0x0c, 0xc9, 0xc9, 0x90, 0x08, 0xe9, 0xbd, - 0x00, 0x57, 0x0b, 0xaf, 0x22, 0xe5, 0x4c, 0x10, 0x78, 0x0f, 0x34, 0x34, 0xd8, 0xb6, 0x9a, 0x56, - 0xeb, 0x4a, 0xdb, 0xf1, 0xcb, 0x7f, 0xc9, 0xd7, 0x98, 0x4e, 0xfd, 0xf4, 0xe7, 0x5e, 0x25, 0x34, - 0xf3, 0xde, 0x57, 0x0b, 0xec, 0x28, 0xc6, 0x23, 0x22, 0x1f, 0x1e, 0x3f, 0x12, 0x9d, 0xd1, 0x61, - 0x1c, 0x67, 0x44, 0xcc, 0x15, 0xa1, 0x0d, 0x2e, 0x63, 0xfd, 0xa2, 0xb8, 0x37, 0xc2, 0xf9, 0x4f, - 0x78, 0x13, 0x6c, 0xf5, 0x39, 0x7f, 0x33, 0x4c, 0xbb, 0x24, 0xa3, 0x3c, 0x3e, 0x66, 0xcf, 0x28, - 0xb3, 0xab, 0x4d, 0xab, 0x55, 0x0f, 0xcb, 0x0d, 0xf8, 0x18, 0x80, 0x45, 0x08, 0x76, 0x4d, 0xd9, - 0xdc, 0xf7, 0x75, 0x62, 0x7e, 0x9e, 0x98, 0xaf, 0x57, 0x62, 0x12, 0xf3, 0xbb, 0x38, 0x21, 0xc6, - 0x43, 0xb8, 0x84, 0xf4, 0x3e, 0x80, 0xdd, 0x35, 0x7e, 0x4d, 0x16, 0x10, 0xd4, 0x23, 0x1a, 0xe7, - 0x6e, 0x6b, 0xad, 0x8d, 0x50, 0xd5, 0xf0, 0xa8, 0x20, 0x5e, 0x55, 0xe2, 0x07, 0xe7, 0x8a, 0x6b, - 0xc2, 0x82, 0x7a, 0xb0, 0x50, 0x7f, 0xce, 0x25, 0xce, 0xe8, 0x7b, 0x12, 0x1f, 0xe6, 0xe9, 0xce, - 0xe3, 0xda, 0x04, 0xb5, 0x88, 0xc6, 0x26, 0xaa, 0xbc, 0xf4, 0x9e, 0x02, 0x77, 0x1d, 0xc4, 0x38, - 0x2e, 0x61, 0x96, 0x43, 0xaf, 0x16, 0x42, 0x6f, 0xff, 0xae, 0x81, 0x4b, 0x8a, 0x0e, 0x8e, 0x41, - 0x43, 0x6f, 0x14, 0xee, 0xaf, 0xda, 0x76, 0xf9, 0x78, 0x9c, 0x83, 0x73, 0xe7, 0xb4, 0x21, 0xaf, - 0xf9, 0xf1, 0xfb, 0x9f, 0xcf, 0x55, 0x07, 0xda, 0x68, 0x01, 0x28, 0xdc, 0x28, 0xfc, 0x66, 0x81, - 0xcd, 0x7f, 0x37, 0x00, 0x6f, 0xaf, 0xe5, 0x5f, 0x73, 0x5c, 0x4e, 0x70, 0x01, 0x84, 0xf1, 0xf6, - 0x40, 0x79, 0xbb, 0x0f, 0xef, 0x96, 0xbd, 0x99, 0x8c, 0xd0, 0xd8, 0x14, 0x13, 0x34, 0x2e, 0xdd, - 0xe1, 0x04, 0x7e, 0xb1, 0xc0, 0x56, 0x69, 0x17, 0xf0, 0xbf, 0x4e, 0x56, 0xae, 0xda, 0x69, 0x5f, - 0x04, 0x62, 0xdc, 0x5f, 0x57, 0xee, 0x77, 0xe1, 0xb5, 0xb2, 0xfb, 0x88, 0xc6, 0x68, 0x1c, 0xd1, - 0x78, 0xd2, 0x79, 0x72, 0x3a, 0x75, 0xad, 0xb3, 0xa9, 0x6b, 0xfd, 0x9a, 0xba, 0xd6, 0xa7, 0x99, - 0x5b, 0x39, 0x9b, 0xb9, 0x95, 0x1f, 0x33, 0xb7, 0xf2, 0x2a, 0x48, 0xa8, 0x7c, 0x3d, 0xec, 0xf9, - 0x11, 0x1f, 0x2c, 0x13, 0x2c, 0xca, 0x5b, 0x09, 0x47, 0xef, 0x0c, 0xa1, 0x1c, 0xa5, 0x44, 0xf4, - 0x1a, 0xea, 0x73, 0x72, 0xe7, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x76, 0xa1, 0xdb, 0x5c, 0x05, - 0x05, 0x00, 0x00, + 0x18, 0x6f, 0xda, 0x51, 0x34, 0xef, 0x32, 0xcc, 0x0e, 0x51, 0xd8, 0xb2, 0x2a, 0x48, 0x5b, 0x85, + 0x44, 0x4c, 0xba, 0x0b, 0x1c, 0x57, 0xfe, 0x4c, 0x08, 0x04, 0x23, 0x47, 0x6e, 0x6e, 0x62, 0x05, + 0x4b, 0x8d, 0x9d, 0xc5, 0x2e, 0xa2, 0x94, 0x5e, 0x78, 0x02, 0x24, 0x1e, 0x00, 0x89, 0x47, 0xe0, + 0x29, 0x76, 0x9c, 0xc4, 0x05, 0x09, 0x09, 0xa1, 0x96, 0x07, 0x41, 0xb1, 0x5d, 0x35, 0x21, 0x2d, + 0xd3, 0x6e, 0x5f, 0xec, 0xef, 0xf7, 0xc7, 0xbf, 0xef, 0x53, 0x80, 0x9b, 0x0d, 0x31, 0x23, 0x32, + 0xa5, 0x4c, 0x26, 0x1c, 0x61, 0x21, 0x88, 0x44, 0x67, 0x23, 0x92, 0x8f, 0xfd, 0x2c, 0xe7, 0x92, + 0x43, 0x58, 0xbe, 0xf7, 0xd5, 0xbd, 0xb3, 0x93, 0xf0, 0x84, 0xab, 0x6b, 0x54, 0x54, 0xba, 0xd3, + 0xd9, 0x4d, 0x38, 0x4f, 0x86, 0x04, 0xe1, 0x8c, 0x22, 0xcc, 0x18, 0x97, 0x58, 0x52, 0xce, 0x84, + 0xb9, 0xbd, 0x13, 0x71, 0x91, 0x72, 0x81, 0x06, 0x58, 0x10, 0x2d, 0x80, 0xde, 0x06, 0x03, 0x22, + 0x71, 0x80, 0x32, 0x9c, 0x50, 0xa6, 0x9a, 0x4d, 0xef, 0xfe, 0x0a, 0x4f, 0x19, 0xce, 0x71, 0x6a, + 0xc8, 0xbc, 0x1d, 0x00, 0x5f, 0x15, 0x14, 0xa7, 0xea, 0x30, 0x24, 0x67, 0x23, 0x22, 0xa4, 0xf7, + 0x12, 0xdc, 0xac, 0x9c, 0x8a, 0x8c, 0x33, 0x41, 0xe0, 0x7d, 0xd0, 0xd6, 0x60, 0xdb, 0xea, 0x58, + 0xdd, 0xad, 0x9e, 0xe3, 0xd7, 0x9f, 0xe4, 0x6b, 0x4c, 0x7f, 0xe3, 0xfc, 0xd7, 0x7e, 0x23, 0x34, + 0xfd, 0xde, 0x57, 0x0b, 0xec, 0x2a, 0xc6, 0x13, 0x22, 0x1f, 0x3e, 0x7d, 0x24, 0xfa, 0xe3, 0xe3, + 0x38, 0xce, 0x89, 0x58, 0x28, 0x42, 0x1b, 0x5c, 0xc7, 0xfa, 0x44, 0x71, 0x6f, 0x86, 0x8b, 0x4f, + 0xd8, 0x01, 0x5b, 0x6c, 0x94, 0x3e, 0x1e, 0x92, 0x94, 0x30, 0x29, 0xec, 0x66, 0xc7, 0xea, 0x6e, + 0x84, 0xe5, 0x23, 0xf8, 0x04, 0x80, 0xe5, 0xc3, 0xed, 0x96, 0xb2, 0x76, 0xe0, 0xeb, 0x94, 0xfc, + 0x22, 0x25, 0x5f, 0x8f, 0xc1, 0xa4, 0xe4, 0x9f, 0xe2, 0x84, 0x18, 0xdd, 0xb0, 0x84, 0xf4, 0x3e, + 0x80, 0xbd, 0x35, 0x1e, 0xcd, 0xfb, 0x21, 0xd8, 0x88, 0x68, 0x5c, 0x38, 0x6c, 0x75, 0x37, 0x43, + 0x55, 0xc3, 0x93, 0x8a, 0x78, 0x53, 0x89, 0x1f, 0x5e, 0x2a, 0xae, 0x09, 0x2b, 0xea, 0xc1, 0x52, + 0xfd, 0x05, 0x97, 0x38, 0xa7, 0xef, 0x49, 0x7c, 0x5c, 0x24, 0xba, 0x88, 0x68, 0x1b, 0xb4, 0x22, + 0x1a, 0x9b, 0x78, 0x8a, 0xd2, 0x7b, 0x0e, 0xdc, 0x75, 0x10, 0xe3, 0xb8, 0x86, 0x29, 0x07, 0xdd, + 0xac, 0x04, 0xdd, 0xfb, 0xd9, 0x02, 0xd7, 0x14, 0x1d, 0x9c, 0x80, 0xb6, 0x9e, 0x22, 0x3c, 0x58, + 0x35, 0xe1, 0xfa, 0xc2, 0x38, 0x87, 0x97, 0xf6, 0x69, 0x43, 0x5e, 0xe7, 0xe3, 0xf7, 0x3f, 0x9f, + 0x9b, 0x0e, 0xb4, 0xd1, 0x12, 0x50, 0xd9, 0x4b, 0xf8, 0xcd, 0x02, 0xdb, 0xff, 0x4e, 0x00, 0xde, + 0x5b, 0xcb, 0xbf, 0x66, 0xa1, 0x9c, 0xe0, 0x0a, 0x08, 0xe3, 0xed, 0x81, 0xf2, 0x76, 0x04, 0x83, + 0xba, 0x37, 0x93, 0x11, 0x9a, 0x98, 0x62, 0x8a, 0x26, 0xa5, 0x0d, 0x9c, 0xc2, 0x2f, 0x16, 0xb8, + 0x51, 0x9b, 0x02, 0xfc, 0xaf, 0x87, 0x95, 0x43, 0x76, 0x7a, 0x57, 0x81, 0x18, 0xdf, 0xb7, 0x95, + 0xef, 0x3d, 0x78, 0xab, 0xee, 0x3b, 0xa2, 0x31, 0x9a, 0x44, 0x34, 0x9e, 0xf6, 0x9f, 0x9d, 0xcf, + 0x5c, 0xeb, 0x62, 0xe6, 0x5a, 0xbf, 0x67, 0xae, 0xf5, 0x69, 0xee, 0x36, 0x2e, 0xe6, 0x6e, 0xe3, + 0xc7, 0xdc, 0x6d, 0xbc, 0x0e, 0x12, 0x2a, 0xdf, 0x8c, 0x06, 0x7e, 0xc4, 0xd3, 0x32, 0xc1, 0xb2, + 0xbc, 0x9b, 0x70, 0xf4, 0xce, 0x10, 0xca, 0x71, 0x46, 0xc4, 0xa0, 0xad, 0x7e, 0x1e, 0x47, 0x7f, + 0x03, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x7e, 0xf6, 0x2a, 0xf3, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -617,8 +616,8 @@ func (m *QueryGetCIDsByAddressRequest) MarshalToSizedBuffer(dAtA []byte) (int, e i-- dAtA[i] = 0x1a } - if m.LookupPeriodInMin != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.LookupPeriodInMin)) + if m.NumElements != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.NumElements)) i-- dAtA[i] = 0x10 } @@ -784,8 +783,8 @@ func (m *QueryGetCIDsByAddressRequest) Size() (n int) { if l > 0 { n += 1 + l + sovQuery(uint64(l)) } - if m.LookupPeriodInMin != 0 { - n += 1 + sovQuery(uint64(m.LookupPeriodInMin)) + if m.NumElements != 0 { + n += 1 + sovQuery(uint64(m.NumElements)) } if m.Pagination != nil { l = m.Pagination.Size() @@ -1045,9 +1044,9 @@ func (m *QueryGetCIDsByAddressRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LookupPeriodInMin", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NumElements", wireType) } - m.LookupPeriodInMin = 0 + m.NumElements = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowQuery @@ -1057,7 +1056,7 @@ func (m *QueryGetCIDsByAddressRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.LookupPeriodInMin |= uint64(b&0x7F) << shift + m.NumElements |= uint64(b&0x7F) << shift if b < 0x80 { break } diff --git a/x/asset/types/query.pb.gw.go b/x/asset/types/query.pb.gw.go index 3dc0c73..d8d9132 100644 --- a/x/asset/types/query.pb.gw.go +++ b/x/asset/types/query.pb.gw.go @@ -52,7 +52,7 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal } var ( - filter_Query_GetCIDsByAddress_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0, "lookupPeriodInMin": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Query_GetCIDsByAddress_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0, "numElements": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} ) func request_Query_GetCIDsByAddress_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -77,15 +77,15 @@ func request_Query_GetCIDsByAddress_0(ctx context.Context, marshaler runtime.Mar return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } - val, ok = pathParams["lookupPeriodInMin"] + val, ok = pathParams["numElements"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lookupPeriodInMin") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "numElements") } - protoReq.LookupPeriodInMin, err = runtime.Uint64(val) + protoReq.NumElements, err = runtime.Uint64(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lookupPeriodInMin", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "numElements", err) } if err := req.ParseForm(); err != nil { @@ -122,15 +122,15 @@ func local_request_Query_GetCIDsByAddress_0(ctx context.Context, marshaler runti return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) } - val, ok = pathParams["lookupPeriodInMin"] + val, ok = pathParams["numElements"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lookupPeriodInMin") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "numElements") } - protoReq.LookupPeriodInMin, err = runtime.Uint64(val) + protoReq.NumElements, err = runtime.Uint64(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lookupPeriodInMin", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "numElements", err) } if err := req.ParseForm(); err != nil { @@ -381,7 +381,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie var ( pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"planetmint", "asset", "params"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_GetCIDsByAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"planetmint", "asset", "address", "lookupPeriodInMin"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_GetCIDsByAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"planetmint", "asset", "address", "numElements"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_GetNotarizedAsset_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 2}, []string{"planetmint", "asset", "cid"}, "", runtime.AssumeColonVerbOpt(true))) )