diff --git a/go.mod b/go.mod index 23080d06..0519be13 100644 --- a/go.mod +++ b/go.mod @@ -99,6 +99,7 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/getsentry/sentry-go v0.17.0 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/go-critic/go-critic v0.6.5 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -115,6 +116,7 @@ require ( github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/gateway v1.1.0 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/golang/snappy v0.0.4 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect @@ -137,6 +139,7 @@ require ( github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect github.com/gostaticanalysis/nilerr v0.1.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect diff --git a/go.sum b/go.sum index bd2604ca..5fd2428c 100644 --- a/go.sum +++ b/go.sum @@ -154,6 +154,7 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -261,6 +262,7 @@ github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvA github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -395,6 +397,7 @@ github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TB github.com/getsentry/sentry-go v0.17.0 h1:UustVWnOoDFHBS7IJUB2QK/nB5pap748ZEp0swnQJak= github.com/getsentry/sentry-go v0.17.0/go.mod h1:B82dxtBvxG0KaPD8/hfSV+VcHD+Lg/xUS4JuQn1P4cM= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -487,11 +490,13 @@ github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzq github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 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= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -499,6 +504,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -633,6 +639,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -648,6 +656,7 @@ github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -657,6 +666,7 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -1314,6 +1324,7 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1321,6 +1332,7 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= diff --git a/proto/rewards/genesis.proto b/proto/rewards/genesis.proto index eaa541fc..166fb651 100644 --- a/proto/rewards/genesis.proto +++ b/proto/rewards/genesis.proto @@ -20,5 +20,7 @@ message GenesisState { repeated TradingReward trading_reward_list = 5 [(gogoproto.nullable) = false]; repeated StakingRewardParticipant staking_reward_participant_list = 6 [(gogoproto.nullable) = false]; repeated PendingUnlockParticipant pending_unlock_participant_list = 7 [(gogoproto.nullable) = false]; + repeated TradingRewardLeaderboard trading_reward_leaderboard_list = 8 [(gogoproto.nullable) = false]; + repeated TradingRewardCandidate trading_reward_candidate_list = 9 [(gogoproto.nullable) = false]; // this line is used by starport scaffolding # genesis/proto/state } diff --git a/proto/rewards/trading_reward.proto b/proto/rewards/trading_reward.proto index da24e318..e5101c57 100644 --- a/proto/rewards/trading_reward.proto +++ b/proto/rewards/trading_reward.proto @@ -1,6 +1,8 @@ syntax = "proto3"; package bze.v1.rewards; +import "gogoproto/gogo.proto"; + option go_package = "github.com/bze-alphateam/bze/x/rewards/types"; message TradingReward { @@ -12,3 +14,19 @@ message TradingReward { uint32 slots = 6; } +message TradingRewardLeaderboard { + string reward_id = 1; + repeated TradingRewardLeaderboardEntry list = 2 [(gogoproto.nullable) = false]; +} + +message TradingRewardLeaderboardEntry { + string amount = 1; + string address = 2; + int64 created_at = 3; +} + +message TradingRewardCandidate { + string reward_id = 1; + string amount = 2; + string address = 3; +} diff --git a/testutil/simapp/app.go b/testutil/simapp/app.go index 4d7ab989..7568bb8e 100644 --- a/testutil/simapp/app.go +++ b/testutil/simapp/app.go @@ -478,6 +478,12 @@ func New( app.EpochsKeeper, ) + app.TradebinKeeper.SetOnOrderFillHooks( + []tradebintypes.OnMarketOrderFill{ + app.RewardsKeeper.GetOnOrderFillHook(), + }, + ) + app.EpochsKeeper.SetHooks( []epochstypes.EpochHook{ app.RewardsKeeper.GetDistributeAllStakingRewardsHook(), diff --git a/x/rewards/genesis.go b/x/rewards/genesis.go index 5e849342..90aa8a9c 100644 --- a/x/rewards/genesis.go +++ b/x/rewards/genesis.go @@ -16,6 +16,15 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) // Set all the tradingReward for _, elem := range genState.TradingRewardList { k.SetTradingReward(ctx, elem) + k.SetMarketIdRewardId(ctx, elem) + } + + for _, elem := range genState.TradingRewardLeaderboardList { + k.SetTradingRewardLeaderboard(ctx, elem) + } + + for _, elem := range genState.TradingRewardCandidateList { + k.SetTradingRewardCandidate(ctx, elem) } // Set all the stakingRewardParticipant @@ -45,6 +54,8 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis.TradingRewardList = k.GetAllTradingReward(ctx) genesis.StakingRewardParticipantList = k.GetAllStakingRewardParticipant(ctx) genesis.PendingUnlockParticipantList = k.GetAllPendingUnlockParticipant(ctx) + genesis.TradingRewardLeaderboardList = k.GetAllTradingRewardLeaderboard(ctx) + genesis.TradingRewardCandidateList = k.GetAllTradingRewardCandidate(ctx) // this line is used by starport scaffolding # genesis/module/export return genesis diff --git a/x/rewards/keeper/hooks.go b/x/rewards/keeper/hooks.go index 8b1a3ad9..c48a0e17 100644 --- a/x/rewards/keeper/hooks.go +++ b/x/rewards/keeper/hooks.go @@ -3,6 +3,7 @@ package keeper import ( "github.com/bze-alphateam/bze/x/rewards/types" sdk "github.com/cosmos/cosmos-sdk/types" + "sort" ) func (k Keeper) GetDistributeAllStakingRewardsHook() types.EpochHook { @@ -38,3 +39,109 @@ func (k Keeper) GetUnlockPendingUnlockParticipantsHook() types.EpochHook { return nil }) } + +func (k Keeper) GetOnOrderFillHook() func(ctx sdk.Context, marketId, amountTraded, userAddress string) { + return func(ctx sdk.Context, marketId, amountTraded, userAddress string) { + logger := ctx.Logger().With("market_id", marketId) + existingRewardId, found := k.GetMarketIdRewardId(ctx, marketId) + if !found { + logger.Debug("no rewards found for this market id") + return + } + + reward, found := k.GetTradingReward(ctx, existingRewardId) + if !found { + logger.With("reward_id", existingRewardId). + Error("the reward id found for this market does not exist in trading reward store") + return + } + logger = logger.With("reward", reward) + + candidate, found := k.GetTradingRewardCandidate(ctx, reward.RewardId, userAddress) + if !found { + logger.Debug("candidate not found. creating a new one") + candidate = types.TradingRewardCandidate{ + RewardId: reward.RewardId, + Amount: "0", + Address: userAddress, + } + } + candidateAmount, ok := sdk.NewIntFromString(candidate.Amount) + if !ok { + logger.Error("could not parse candidate amount") + + return + } + + tradedAmount, ok := sdk.NewIntFromString(amountTraded) + if !ok { + logger.Error("could not parse traded amount") + + return + } + + candidateAmount = candidateAmount.Add(tradedAmount) + candidate.Amount = candidateAmount.String() + k.SetTradingRewardCandidate(ctx, candidate) + logger.Debug("trading reward candidate saved") + + //try to add to leaderboard + leaderboard, found := k.GetTradingRewardLeaderboard(ctx, reward.RewardId) + if !found { + logger.Debug("leaderboard does not exist. creating new one") + leaderboard = types.TradingRewardLeaderboard{ + RewardId: reward.RewardId, + List: []types.TradingRewardLeaderboardEntry{}, + } + } + + addedToList := false + for i, entry := range leaderboard.List { + if candidate.Address != entry.Address { + continue + } + + entry.Amount = candidateAmount.String() + leaderboard.List[i] = entry + addedToList = true + + logger.Debug("candidate already exists in leaderboard") + + break + } + + //not found in leaderboard, let's add it + if !addedToList { + logger.Debug("candidate does not exists in leaderboard. creating new entry") + newEntry := types.TradingRewardLeaderboardEntry{ + Amount: candidate.Amount, + Address: candidate.Address, + CreatedAt: ctx.BlockTime().Unix(), + } + leaderboard.List = append(leaderboard.List, newEntry) + } + + //sort the slice + sort.SliceStable(leaderboard.List[:], func(i, j int) bool { + iAmt, _ := sdk.NewIntFromString(amountTraded) + jAmt, _ := sdk.NewIntFromString(amountTraded) + if iAmt.GT(jAmt) { + return true + } + if iAmt.LT(jAmt) { + return false + } + + return leaderboard.List[i].CreatedAt < leaderboard.List[j].CreatedAt + }) + + //trim slice if it's longer than the rewarded slots + if reward.Slots < uint32(len(leaderboard.List)) { + logger.Debug("trimming leaderboard list") + leaderboard.List = leaderboard.List[:reward.Slots] + } + + k.SetTradingRewardLeaderboard(ctx, leaderboard) + logger.Debug("leaderboard set into storage") + } +} diff --git a/x/rewards/keeper/msg_server_trading_reward.go b/x/rewards/keeper/msg_server_trading_reward.go index b5cd2b76..a38e7247 100644 --- a/x/rewards/keeper/msg_server_trading_reward.go +++ b/x/rewards/keeper/msg_server_trading_reward.go @@ -56,6 +56,7 @@ func (k msgServer) CreateTradingReward(goCtx context.Context, msg *types.MsgCrea ctx, tradingReward, ) + k.SetMarketIdRewardId(ctx, tradingReward) return &types.MsgCreateTradingRewardResponse{RewardId: tradingReward.RewardId}, nil } diff --git a/x/rewards/keeper/trading_reward.go b/x/rewards/keeper/trading_reward.go index 74e434e8..e1e80b6d 100644 --- a/x/rewards/keeper/trading_reward.go +++ b/x/rewards/keeper/trading_reward.go @@ -47,3 +47,27 @@ func (k Keeper) GetAllTradingReward(ctx sdk.Context) (list []types.TradingReward return } + +// SetMarketIdRewardId save a reward id on a market id key +func (k Keeper) SetMarketIdRewardId(ctx sdk.Context, tradingReward types.TradingReward) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.MarketIdRewardIdKeyPrefix)) + val := []byte(tradingReward.RewardId) + store.Set(types.MarketIdRewardIdKey(tradingReward.MarketId), val) +} + +// GetMarketIdRewardId get a reward id for a market id key +func (k Keeper) GetMarketIdRewardId(ctx sdk.Context, marketId string) (string, bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.MarketIdRewardIdKeyPrefix)) + val := store.Get(types.MarketIdRewardIdKey(marketId)) + if val == nil { + return "", false + } + + return string(val), true +} + +// RemoveMarketIdRewardId removes the reward id stored for a market id +func (k Keeper) RemoveMarketIdRewardId(ctx sdk.Context, marketId string) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.MarketIdRewardIdKeyPrefix)) + store.Delete(types.MarketIdRewardIdKey(marketId)) +} diff --git a/x/rewards/keeper/trading_reward_leaderboard.go b/x/rewards/keeper/trading_reward_leaderboard.go new file mode 100644 index 00000000..304c561c --- /dev/null +++ b/x/rewards/keeper/trading_reward_leaderboard.go @@ -0,0 +1,78 @@ +package keeper + +import ( + "github.com/bze-alphateam/bze/x/rewards/types" + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// SetTradingRewardLeaderboard set a specific types.TradingRewardLeaderboard in the store from its index +func (k Keeper) SetTradingRewardLeaderboard(ctx sdk.Context, leaderboard types.TradingRewardLeaderboard) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.LeaderboardKeyPrefix)) + b := k.cdc.MustMarshal(&leaderboard) + store.Set(types.TradingRewardKey(leaderboard.RewardId), b) +} + +// GetTradingRewardLeaderboard returns a types.TradingRewardLeaderboard from its index +func (k Keeper) GetTradingRewardLeaderboard(ctx sdk.Context, rewardId string) (val types.TradingRewardLeaderboard, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.LeaderboardKeyPrefix)) + + b := store.Get(types.TradingRewardKey(rewardId)) + if b == nil { + return val, false + } + + k.cdc.MustUnmarshal(b, &val) + return val, true +} + +// GetAllTradingRewardLeaderboard returns all []types.TradingRewardLeaderboard +func (k Keeper) GetAllTradingRewardLeaderboard(ctx sdk.Context) (list []types.TradingRewardLeaderboard) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.LeaderboardKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var val types.TradingRewardLeaderboard + k.cdc.MustUnmarshal(iterator.Value(), &val) + list = append(list, val) + } + + return +} + +// SetTradingRewardCandidate set a specific types.TradingRewardCandidate in the store from its index +func (k Keeper) SetTradingRewardCandidate(ctx sdk.Context, entry types.TradingRewardCandidate) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.RewardCandidateKeyPrefix)) + b := k.cdc.MustMarshal(&entry) + store.Set(types.TradingRewardCandidateKey(entry.RewardId, entry.Address), b) +} + +func (k Keeper) GetTradingRewardCandidate(ctx sdk.Context, rewardId, address string) (val types.TradingRewardCandidate, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.RewardCandidateKeyPrefix)) + + b := store.Get(types.TradingRewardCandidateKey(rewardId, address)) + if b == nil { + return val, false + } + + k.cdc.MustUnmarshal(b, &val) + return val, true +} + +// GetAllTradingRewardCandidate returns all []types.TradingRewardCandidate +func (k Keeper) GetAllTradingRewardCandidate(ctx sdk.Context) (list []types.TradingRewardCandidate) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.RewardCandidateKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var val types.TradingRewardCandidate + k.cdc.MustUnmarshal(iterator.Value(), &val) + list = append(list, val) + } + + return +} diff --git a/x/rewards/types/genesis.pb.go b/x/rewards/types/genesis.pb.go index 0fb6d557..84cf279a 100644 --- a/x/rewards/types/genesis.pb.go +++ b/x/rewards/types/genesis.pb.go @@ -32,6 +32,8 @@ type GenesisState struct { TradingRewardList []TradingReward `protobuf:"bytes,5,rep,name=trading_reward_list,json=tradingRewardList,proto3" json:"trading_reward_list"` StakingRewardParticipantList []StakingRewardParticipant `protobuf:"bytes,6,rep,name=staking_reward_participant_list,json=stakingRewardParticipantList,proto3" json:"staking_reward_participant_list"` PendingUnlockParticipantList []PendingUnlockParticipant `protobuf:"bytes,7,rep,name=pending_unlock_participant_list,json=pendingUnlockParticipantList,proto3" json:"pending_unlock_participant_list"` + TradingRewardLeaderboardList []TradingRewardLeaderboard `protobuf:"bytes,8,rep,name=trading_reward_leaderboard_list,json=tradingRewardLeaderboardList,proto3" json:"trading_reward_leaderboard_list"` + TradingRewardCandidateList []TradingRewardCandidate `protobuf:"bytes,9,rep,name=trading_reward_candidate_list,json=tradingRewardCandidateList,proto3" json:"trading_reward_candidate_list"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -116,6 +118,20 @@ func (m *GenesisState) GetPendingUnlockParticipantList() []PendingUnlockParticip return nil } +func (m *GenesisState) GetTradingRewardLeaderboardList() []TradingRewardLeaderboard { + if m != nil { + return m.TradingRewardLeaderboardList + } + return nil +} + +func (m *GenesisState) GetTradingRewardCandidateList() []TradingRewardCandidate { + if m != nil { + return m.TradingRewardCandidateList + } + return nil +} + func init() { proto.RegisterType((*GenesisState)(nil), "bze.v1.rewards.GenesisState") } @@ -123,31 +139,35 @@ func init() { func init() { proto.RegisterFile("rewards/genesis.proto", fileDescriptor_04e261dd19d07881) } var fileDescriptor_04e261dd19d07881 = []byte{ - // 383 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x4f, 0x4f, 0xfa, 0x30, - 0x1c, 0xc6, 0xb7, 0x1f, 0xfb, 0x61, 0x32, 0x8c, 0x89, 0x03, 0x94, 0x10, 0x1c, 0xc4, 0xd3, 0x0e, - 0xba, 0x45, 0x34, 0xbe, 0x00, 0x4c, 0xf4, 0xe2, 0x81, 0x30, 0xbd, 0x78, 0x21, 0xdd, 0x68, 0x46, - 0x03, 0xac, 0x4d, 0xdb, 0xf9, 0x87, 0x57, 0xe1, 0xcb, 0xe2, 0xe0, 0x81, 0xa3, 0x27, 0x63, 0xe0, - 0x8d, 0x18, 0xda, 0x4d, 0xd8, 0x18, 0xde, 0xd6, 0x3e, 0xdf, 0xcf, 0xf3, 0xf4, 0xe9, 0xaa, 0x57, - 0x29, 0x7c, 0x01, 0x74, 0xc0, 0x9c, 0x00, 0x86, 0x90, 0x21, 0x66, 0x13, 0x8a, 0x39, 0x36, 0x0e, - 0xbc, 0x29, 0xb4, 0x9f, 0x2f, 0xec, 0x58, 0xad, 0x57, 0x02, 0x1c, 0x60, 0x21, 0x39, 0xab, 0x2f, - 0x39, 0x55, 0xaf, 0x24, 0x30, 0x01, 0x14, 0x4c, 0x62, 0xb6, 0xde, 0x48, 0x76, 0x19, 0x07, 0x23, - 0x14, 0x06, 0x7d, 0xb9, 0xce, 0xaa, 0x9c, 0x82, 0xc1, 0x96, 0x6a, 0xe5, 0xb3, 0x7d, 0x02, 0x28, - 0x47, 0x3e, 0x22, 0x20, 0xe4, 0x72, 0xf2, 0xf4, 0x43, 0xd3, 0xf7, 0xef, 0xe4, 0x99, 0x5d, 0x0e, - 0x38, 0x34, 0xae, 0xf4, 0xa2, 0x3c, 0x46, 0x4d, 0x6d, 0xa9, 0x56, 0xa9, 0x7d, 0x64, 0xa7, 0x3b, - 0xd8, 0x5d, 0xa1, 0x76, 0xb4, 0xd9, 0x57, 0x53, 0xe9, 0xc5, 0xb3, 0x86, 0xab, 0x97, 0x33, 0x51, - 0x63, 0xc4, 0x78, 0xed, 0x5f, 0xab, 0x60, 0x95, 0xda, 0x27, 0x59, 0x0b, 0x57, 0x8e, 0xf6, 0xc4, - 0x32, 0x76, 0x3a, 0x64, 0x9b, 0x9b, 0xf7, 0x88, 0x71, 0xe3, 0x5a, 0x3f, 0x4e, 0x9b, 0xb2, 0xbe, - 0x8f, 0xa3, 0x90, 0x43, 0x5a, 0x2b, 0xb4, 0x54, 0x4b, 0xeb, 0x55, 0x53, 0x0c, 0xbb, 0x91, 0xe2, - 0x8a, 0x4b, 0xdf, 0xca, 0x9a, 0xd3, 0x24, 0x17, 0xcb, 0x19, 0xce, 0xd5, 0xcb, 0x69, 0x4e, 0x96, - 0xf8, 0x9f, 0x5f, 0xe2, 0x61, 0xd3, 0x23, 0x29, 0x91, 0x32, 0x16, 0x25, 0x22, 0xbd, 0xb9, 0xfb, - 0x27, 0xc8, 0x80, 0xa2, 0x08, 0xb0, 0xfe, 0xbc, 0xa5, 0xee, 0x1a, 0x8a, 0xb3, 0x1a, 0x6c, 0x87, - 0x9e, 0xc4, 0x12, 0x18, 0x8a, 0x2e, 0x51, 0x38, 0xc6, 0xfe, 0x68, 0x3b, 0x76, 0x2f, 0x3f, 0xb6, - 0x2b, 0xb1, 0x47, 0x41, 0xe5, 0xc4, 0x92, 0x1d, 0xfa, 0x2a, 0xb6, 0x73, 0x3b, 0x5b, 0x98, 0xea, - 0x7c, 0x61, 0xaa, 0xdf, 0x0b, 0x53, 0x7d, 0x5f, 0x9a, 0xca, 0x7c, 0x69, 0x2a, 0x9f, 0x4b, 0x53, - 0x79, 0x3a, 0x0b, 0x10, 0x1f, 0x46, 0x9e, 0xed, 0xe3, 0x89, 0xe3, 0x4d, 0xe1, 0x39, 0x18, 0x93, - 0x21, 0xe0, 0x10, 0x88, 0x95, 0xf3, 0xea, 0xfc, 0xbe, 0xe7, 0x37, 0x02, 0x99, 0x57, 0x14, 0xaf, - 0xf3, 0xf2, 0x27, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x32, 0xae, 0x81, 0x58, 0x03, 0x00, 0x00, + // 437 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xcf, 0xae, 0xd2, 0x40, + 0x14, 0x87, 0x5b, 0x2f, 0x56, 0x9d, 0x6b, 0x4c, 0xec, 0x05, 0x25, 0x0d, 0x14, 0xe2, 0xc2, 0x74, + 0xa1, 0x6d, 0x44, 0xe3, 0x03, 0x40, 0xa2, 0x1b, 0x16, 0x84, 0xea, 0xc6, 0x0d, 0x99, 0xb6, 0x93, + 0x32, 0x01, 0x3a, 0x93, 0x99, 0xa9, 0x7f, 0x78, 0x0a, 0x1f, 0xc6, 0x87, 0x60, 0xc9, 0xd2, 0x95, + 0x31, 0xf0, 0x22, 0x37, 0xcc, 0xb4, 0x40, 0x4b, 0xcb, 0x8e, 0xe9, 0xef, 0x7c, 0xe7, 0x9b, 0x73, + 0xc8, 0x80, 0x16, 0x43, 0x3f, 0x20, 0x8b, 0xb8, 0x17, 0xa3, 0x04, 0x71, 0xcc, 0x5d, 0xca, 0x88, + 0x20, 0xe6, 0xb3, 0x60, 0x8d, 0xdc, 0xef, 0xef, 0xdc, 0x2c, 0xb5, 0x9a, 0x31, 0x89, 0x89, 0x8c, + 0xbc, 0xc3, 0x2f, 0x55, 0x65, 0x35, 0x73, 0x98, 0x42, 0x06, 0x57, 0x19, 0x6b, 0x75, 0xf2, 0xaf, + 0x5c, 0xc0, 0x05, 0x4e, 0xe2, 0x99, 0x3a, 0x97, 0x53, 0xc1, 0x60, 0x74, 0x91, 0x3a, 0xd5, 0xec, + 0x8c, 0x42, 0x26, 0x70, 0x88, 0x29, 0x4c, 0x84, 0xaa, 0x7c, 0xf5, 0xc7, 0x00, 0x4f, 0x3f, 0xab, + 0x3b, 0xfb, 0x02, 0x0a, 0x64, 0x7e, 0x00, 0x86, 0xba, 0x46, 0x5b, 0xef, 0xeb, 0xce, 0xed, 0xe0, + 0x85, 0x5b, 0x9c, 0xc1, 0x9d, 0xc8, 0x74, 0xd8, 0xd8, 0xfc, 0xeb, 0x69, 0xd3, 0xac, 0xd6, 0xf4, + 0xc1, 0x5d, 0x49, 0xb5, 0xc4, 0x5c, 0xb4, 0x1f, 0xf4, 0x6f, 0x9c, 0xdb, 0x41, 0xb7, 0xdc, 0xc2, + 0x57, 0xa5, 0x53, 0x79, 0xcc, 0x3a, 0x3d, 0xe7, 0xe7, 0x1f, 0xc7, 0x98, 0x0b, 0xf3, 0x23, 0x78, + 0x59, 0x6c, 0xca, 0x67, 0x21, 0x49, 0x13, 0x81, 0x58, 0xfb, 0xa6, 0xaf, 0x3b, 0x8d, 0x69, 0xab, + 0xc0, 0xf0, 0x91, 0x0a, 0x0f, 0x5c, 0x71, 0x2b, 0x27, 0xae, 0xa1, 0xb8, 0x2c, 0x2e, 0x71, 0x3e, + 0xb8, 0x2b, 0x72, 0x6a, 0x88, 0x87, 0xd5, 0x43, 0x7c, 0x39, 0xef, 0x91, 0x0f, 0x51, 0x68, 0x2c, + 0x87, 0x48, 0x41, 0xaf, 0xfe, 0x4f, 0x50, 0x02, 0x43, 0x0a, 0x9c, 0xab, 0x5b, 0x9a, 0x9c, 0xa0, + 0xcc, 0xd5, 0xe1, 0x35, 0x79, 0xae, 0xa5, 0x28, 0x91, 0xb3, 0xa4, 0xc9, 0x92, 0x84, 0x8b, 0x4b, + 0xed, 0xa3, 0x6a, 0xed, 0x44, 0x61, 0x5f, 0x25, 0x55, 0xa1, 0xa5, 0x35, 0x79, 0xae, 0x2d, 0xaf, + 0x10, 0xc1, 0x08, 0xb1, 0x80, 0x1c, 0xd7, 0xf9, 0xb8, 0x5a, 0x5b, 0x58, 0xe7, 0xf8, 0x04, 0xe5, + 0x5a, 0x51, 0x93, 0x4b, 0x2d, 0x01, 0xdd, 0x92, 0x36, 0x84, 0x49, 0x84, 0x23, 0x28, 0x90, 0x92, + 0x3e, 0x91, 0xd2, 0xd7, 0x57, 0xa5, 0xa3, 0x1c, 0xc9, 0x94, 0x96, 0xa8, 0x4c, 0x0f, 0xc2, 0xe1, + 0xa7, 0xcd, 0xce, 0xd6, 0xb7, 0x3b, 0x5b, 0xff, 0xbf, 0xb3, 0xf5, 0xdf, 0x7b, 0x5b, 0xdb, 0xee, + 0x6d, 0xed, 0xef, 0xde, 0xd6, 0xbe, 0xbd, 0x89, 0xb1, 0x98, 0xa7, 0x81, 0x1b, 0x92, 0x95, 0x17, + 0xac, 0xd1, 0x5b, 0xb8, 0xa4, 0x73, 0x28, 0x10, 0x94, 0x27, 0xef, 0xa7, 0x77, 0x7c, 0xb7, 0xbf, + 0x28, 0xe2, 0x81, 0x21, 0x5f, 0xe1, 0xfb, 0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0xd5, 0x14, + 0x50, 0x40, 0x04, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -170,6 +190,34 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.TradingRewardCandidateList) > 0 { + for iNdEx := len(m.TradingRewardCandidateList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TradingRewardCandidateList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } + if len(m.TradingRewardLeaderboardList) > 0 { + for iNdEx := len(m.TradingRewardLeaderboardList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TradingRewardLeaderboardList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + } if len(m.PendingUnlockParticipantList) > 0 { for iNdEx := len(m.PendingUnlockParticipantList) - 1; iNdEx >= 0; iNdEx-- { { @@ -298,6 +346,18 @@ func (m *GenesisState) Size() (n int) { n += 1 + l + sovGenesis(uint64(l)) } } + if len(m.TradingRewardLeaderboardList) > 0 { + for _, e := range m.TradingRewardLeaderboardList { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.TradingRewardCandidateList) > 0 { + for _, e := range m.TradingRewardCandidateList { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } return n } @@ -543,6 +603,74 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TradingRewardLeaderboardList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TradingRewardLeaderboardList = append(m.TradingRewardLeaderboardList, TradingRewardLeaderboard{}) + if err := m.TradingRewardLeaderboardList[len(m.TradingRewardLeaderboardList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TradingRewardCandidateList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TradingRewardCandidateList = append(m.TradingRewardCandidateList, TradingRewardCandidate{}) + if err := m.TradingRewardCandidateList[len(m.TradingRewardCandidateList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/rewards/types/key_trading_reward.go b/x/rewards/types/key_trading_reward.go index e397d7f8..46fd95ba 100644 --- a/x/rewards/types/key_trading_reward.go +++ b/x/rewards/types/key_trading_reward.go @@ -7,8 +7,24 @@ var _ binary.ByteOrder const ( // TradingRewardKeyPrefix is the prefix to retrieve all TradingReward TradingRewardKeyPrefix = "tr/value/" + // MarketIdRewardIdKeyPrefix is the prefix to retrieve a reward id for a market id + MarketIdRewardIdKeyPrefix = "tr/mr/" + // LeaderboardKeyPrefix is the prefix of a leaderboard for a trading reward + LeaderboardKeyPrefix = "tr/lb/" + // RewardCandidateKeyPrefix prefix that holds entries/participants for trading rewards + RewardCandidateKeyPrefix = "tr/r/" ) +// TradingRewardCandidateKey returns the store key to retrieve a reward candidate +func TradingRewardCandidateKey(rewardId, address string) []byte { + return []byte(rewardId + "/" + address) +} + +// MarketIdRewardIdKey returns the store key to retrieve a TradingReward.RewardId from the index fields +func MarketIdRewardIdKey(marketId string) []byte { + return []byte(marketId) +} + // TradingRewardKey returns the store key to retrieve a TradingReward from the index fields func TradingRewardKey(rewardId string) []byte { return []byte(rewardId) diff --git a/x/rewards/types/messages_trading_reward.go b/x/rewards/types/messages_trading_reward.go index 3e17a9b7..6a70ee85 100644 --- a/x/rewards/types/messages_trading_reward.go +++ b/x/rewards/types/messages_trading_reward.go @@ -9,7 +9,7 @@ import ( const ( TypeMsgCreateTradingReward = "create_trading_reward" - maxAllowedSlots = 100 + maxAllowedSlots = 10 ) var _ sdk.Msg = &MsgCreateTradingReward{} diff --git a/x/rewards/types/trading_reward.pb.go b/x/rewards/types/trading_reward.pb.go index af70f821..feacf296 100644 --- a/x/rewards/types/trading_reward.pb.go +++ b/x/rewards/types/trading_reward.pb.go @@ -5,6 +5,7 @@ package types import ( fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -106,31 +107,214 @@ func (m *TradingReward) GetSlots() uint32 { return 0 } +type TradingRewardLeaderboard struct { + RewardId string `protobuf:"bytes,1,opt,name=reward_id,json=rewardId,proto3" json:"reward_id,omitempty"` + List []TradingRewardLeaderboardEntry `protobuf:"bytes,2,rep,name=list,proto3" json:"list"` +} + +func (m *TradingRewardLeaderboard) Reset() { *m = TradingRewardLeaderboard{} } +func (m *TradingRewardLeaderboard) String() string { return proto.CompactTextString(m) } +func (*TradingRewardLeaderboard) ProtoMessage() {} +func (*TradingRewardLeaderboard) Descriptor() ([]byte, []int) { + return fileDescriptor_e96afcb90471b82d, []int{1} +} +func (m *TradingRewardLeaderboard) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TradingRewardLeaderboard) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TradingRewardLeaderboard.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 *TradingRewardLeaderboard) XXX_Merge(src proto.Message) { + xxx_messageInfo_TradingRewardLeaderboard.Merge(m, src) +} +func (m *TradingRewardLeaderboard) XXX_Size() int { + return m.Size() +} +func (m *TradingRewardLeaderboard) XXX_DiscardUnknown() { + xxx_messageInfo_TradingRewardLeaderboard.DiscardUnknown(m) +} + +var xxx_messageInfo_TradingRewardLeaderboard proto.InternalMessageInfo + +func (m *TradingRewardLeaderboard) GetRewardId() string { + if m != nil { + return m.RewardId + } + return "" +} + +func (m *TradingRewardLeaderboard) GetList() []TradingRewardLeaderboardEntry { + if m != nil { + return m.List + } + return nil +} + +type TradingRewardLeaderboardEntry struct { + Amount string `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + CreatedAt int64 `protobuf:"varint,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` +} + +func (m *TradingRewardLeaderboardEntry) Reset() { *m = TradingRewardLeaderboardEntry{} } +func (m *TradingRewardLeaderboardEntry) String() string { return proto.CompactTextString(m) } +func (*TradingRewardLeaderboardEntry) ProtoMessage() {} +func (*TradingRewardLeaderboardEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_e96afcb90471b82d, []int{2} +} +func (m *TradingRewardLeaderboardEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TradingRewardLeaderboardEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TradingRewardLeaderboardEntry.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 *TradingRewardLeaderboardEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_TradingRewardLeaderboardEntry.Merge(m, src) +} +func (m *TradingRewardLeaderboardEntry) XXX_Size() int { + return m.Size() +} +func (m *TradingRewardLeaderboardEntry) XXX_DiscardUnknown() { + xxx_messageInfo_TradingRewardLeaderboardEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_TradingRewardLeaderboardEntry proto.InternalMessageInfo + +func (m *TradingRewardLeaderboardEntry) GetAmount() string { + if m != nil { + return m.Amount + } + return "" +} + +func (m *TradingRewardLeaderboardEntry) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *TradingRewardLeaderboardEntry) GetCreatedAt() int64 { + if m != nil { + return m.CreatedAt + } + return 0 +} + +type TradingRewardCandidate struct { + RewardId string `protobuf:"bytes,1,opt,name=reward_id,json=rewardId,proto3" json:"reward_id,omitempty"` + Amount string `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"` + Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *TradingRewardCandidate) Reset() { *m = TradingRewardCandidate{} } +func (m *TradingRewardCandidate) String() string { return proto.CompactTextString(m) } +func (*TradingRewardCandidate) ProtoMessage() {} +func (*TradingRewardCandidate) Descriptor() ([]byte, []int) { + return fileDescriptor_e96afcb90471b82d, []int{3} +} +func (m *TradingRewardCandidate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TradingRewardCandidate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TradingRewardCandidate.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 *TradingRewardCandidate) XXX_Merge(src proto.Message) { + xxx_messageInfo_TradingRewardCandidate.Merge(m, src) +} +func (m *TradingRewardCandidate) XXX_Size() int { + return m.Size() +} +func (m *TradingRewardCandidate) XXX_DiscardUnknown() { + xxx_messageInfo_TradingRewardCandidate.DiscardUnknown(m) +} + +var xxx_messageInfo_TradingRewardCandidate proto.InternalMessageInfo + +func (m *TradingRewardCandidate) GetRewardId() string { + if m != nil { + return m.RewardId + } + return "" +} + +func (m *TradingRewardCandidate) GetAmount() string { + if m != nil { + return m.Amount + } + return "" +} + +func (m *TradingRewardCandidate) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + func init() { proto.RegisterType((*TradingReward)(nil), "bze.v1.rewards.TradingReward") + proto.RegisterType((*TradingRewardLeaderboard)(nil), "bze.v1.rewards.TradingRewardLeaderboard") + proto.RegisterType((*TradingRewardLeaderboardEntry)(nil), "bze.v1.rewards.TradingRewardLeaderboardEntry") + proto.RegisterType((*TradingRewardCandidate)(nil), "bze.v1.rewards.TradingRewardCandidate") } func init() { proto.RegisterFile("rewards/trading_reward.proto", fileDescriptor_e96afcb90471b82d) } var fileDescriptor_e96afcb90471b82d = []byte{ - // 259 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x3c, 0x90, 0xbd, 0x4e, 0xc3, 0x30, - 0x14, 0x85, 0x63, 0xa0, 0x55, 0x6b, 0x28, 0x83, 0xc5, 0x60, 0x01, 0x32, 0x85, 0xa9, 0x03, 0x24, - 0x42, 0x3c, 0x01, 0x08, 0x21, 0x75, 0x8d, 0x98, 0x58, 0x22, 0x07, 0x5b, 0xad, 0x45, 0x13, 0x47, - 0xb6, 0xc3, 0x4f, 0x9e, 0x82, 0x37, 0x62, 0x65, 0xec, 0xc8, 0x88, 0x92, 0x17, 0x41, 0xb9, 0x17, - 0x65, 0xfc, 0xbe, 0x7b, 0xae, 0x8e, 0x74, 0xe8, 0xa9, 0xd3, 0x6f, 0xd2, 0x29, 0x9f, 0x04, 0x27, - 0x95, 0x29, 0x57, 0x19, 0x72, 0x5c, 0x39, 0x1b, 0x2c, 0x3b, 0xcc, 0x1b, 0x1d, 0xbf, 0x5e, 0xc7, - 0xff, 0xa1, 0x8b, 0x2f, 0x42, 0x67, 0x8f, 0x18, 0x4c, 0x41, 0xb1, 0x13, 0x3a, 0xc5, 0x63, 0x66, - 0x14, 0x27, 0x73, 0xb2, 0x98, 0xa6, 0x13, 0x14, 0x4b, 0xc5, 0xce, 0xe9, 0x41, 0xe5, 0x4c, 0xa3, - 0x33, 0x59, 0xd8, 0xba, 0x0c, 0x7c, 0x07, 0xee, 0xfb, 0xe0, 0x6e, 0x41, 0xb1, 0x33, 0x8a, 0x98, - 0x29, 0x5d, 0xda, 0x82, 0xef, 0x42, 0x82, 0x82, 0xba, 0xef, 0x0d, 0x3b, 0xa6, 0x13, 0x55, 0x3b, - 0x19, 0x8c, 0x2d, 0xf9, 0xde, 0x9c, 0x2c, 0x66, 0xe9, 0xc0, 0x7d, 0x79, 0x21, 0xdd, 0x8b, 0x0e, - 0x7d, 0xf9, 0x08, 0xcb, 0x51, 0x2c, 0x15, 0x3b, 0xa2, 0x23, 0xbf, 0xb1, 0xc1, 0xf3, 0x31, 0x7c, - 0x21, 0xdc, 0x3d, 0x7c, 0xb7, 0x82, 0x6c, 0x5b, 0x41, 0x7e, 0x5b, 0x41, 0x3e, 0x3b, 0x11, 0x6d, - 0x3b, 0x11, 0xfd, 0x74, 0x22, 0x7a, 0xba, 0x5c, 0x99, 0xb0, 0xae, 0xf3, 0xf8, 0xd9, 0x16, 0x49, - 0xde, 0xe8, 0x2b, 0xb9, 0xa9, 0xd6, 0x32, 0x68, 0x09, 0x94, 0xbc, 0x27, 0xc3, 0x50, 0x1f, 0x95, - 0xf6, 0xf9, 0x18, 0x06, 0xba, 0xf9, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x98, 0xd8, 0x03, 0xb5, 0x40, - 0x01, 0x00, 0x00, + // 391 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcd, 0x8e, 0xda, 0x30, + 0x18, 0x8c, 0x09, 0x50, 0xf8, 0x28, 0x3d, 0x58, 0x08, 0x45, 0xb4, 0x04, 0x9a, 0x13, 0x87, 0x92, + 0xa8, 0xed, 0x13, 0x40, 0xff, 0x84, 0xd4, 0x53, 0xd4, 0x53, 0x2f, 0x91, 0x83, 0xad, 0x10, 0x95, + 0xc4, 0x91, 0x63, 0xda, 0xc2, 0xa9, 0x8f, 0xd0, 0x37, 0xda, 0x2b, 0x47, 0x8e, 0x7b, 0x5a, 0xad, + 0xe0, 0x45, 0x56, 0xb1, 0xb3, 0xac, 0x72, 0x80, 0xbd, 0x79, 0xc6, 0xf3, 0xf9, 0x9b, 0x19, 0x19, + 0xde, 0x08, 0xf6, 0x87, 0x08, 0x9a, 0x7b, 0x52, 0x10, 0x1a, 0xa7, 0x51, 0xa0, 0xb1, 0x9b, 0x09, + 0x2e, 0x39, 0x7e, 0x15, 0xee, 0x98, 0xfb, 0xfb, 0xbd, 0x5b, 0x8a, 0x06, 0xbd, 0x88, 0x47, 0x5c, + 0x5d, 0x79, 0xc5, 0x49, 0xab, 0x9c, 0x1b, 0x04, 0xdd, 0x1f, 0x7a, 0xdc, 0x57, 0x42, 0xfc, 0x1a, + 0xda, 0x7a, 0x24, 0x88, 0xa9, 0x85, 0xc6, 0x68, 0xd2, 0xf6, 0x5b, 0x9a, 0x58, 0x50, 0xfc, 0x16, + 0x5e, 0x66, 0x22, 0xde, 0xb1, 0x80, 0x24, 0x7c, 0x93, 0x4a, 0xab, 0xa6, 0xee, 0x3b, 0x8a, 0x9b, + 0x29, 0x0a, 0x8f, 0x40, 0xc3, 0x80, 0xb2, 0x94, 0x27, 0x96, 0xa9, 0x14, 0xa0, 0xa8, 0xcf, 0x05, + 0x83, 0x07, 0xd0, 0xa2, 0x1b, 0x41, 0x64, 0xcc, 0x53, 0xab, 0x3e, 0x46, 0x93, 0xae, 0x7f, 0xc6, + 0xc5, 0xf2, 0x84, 0x88, 0x5f, 0x4c, 0x16, 0xcb, 0x1b, 0x7a, 0xb9, 0x26, 0x16, 0x14, 0xf7, 0xa0, + 0x91, 0xaf, 0xb9, 0xcc, 0xad, 0xa6, 0x9a, 0xd2, 0xc0, 0xf9, 0x87, 0xc0, 0xaa, 0x24, 0xf8, 0xce, + 0x08, 0x65, 0x22, 0xe4, 0xcf, 0x86, 0xf9, 0x06, 0xf5, 0x75, 0x9c, 0x17, 0x21, 0xcc, 0x49, 0xe7, + 0xc3, 0xd4, 0xad, 0x16, 0xe6, 0x5e, 0x7a, 0xf4, 0x4b, 0x2a, 0xc5, 0x76, 0x5e, 0xdf, 0xdf, 0x8d, + 0x0c, 0x5f, 0x3d, 0xe0, 0x64, 0x30, 0xbc, 0x2a, 0xc6, 0x7d, 0x68, 0x96, 0x85, 0x69, 0x0f, 0x25, + 0xc2, 0x16, 0xbc, 0x20, 0x94, 0x0a, 0x96, 0xe7, 0x65, 0x93, 0x8f, 0x10, 0x0f, 0x01, 0x96, 0x82, + 0x11, 0xc9, 0x68, 0x40, 0xa4, 0x2a, 0xd1, 0xf4, 0xdb, 0x25, 0x33, 0x93, 0x4e, 0x04, 0xfd, 0xca, + 0xc6, 0x4f, 0x24, 0xa5, 0x31, 0x25, 0x92, 0x5d, 0x4f, 0xfc, 0xe4, 0xa3, 0x76, 0xc9, 0x87, 0x59, + 0xf1, 0x31, 0xff, 0xba, 0x3f, 0xda, 0xe8, 0x70, 0xb4, 0xd1, 0xfd, 0xd1, 0x46, 0xff, 0x4f, 0xb6, + 0x71, 0x38, 0xd9, 0xc6, 0xed, 0xc9, 0x36, 0x7e, 0xbe, 0x8b, 0x62, 0xb9, 0xda, 0x84, 0xee, 0x92, + 0x27, 0x5e, 0xb8, 0x63, 0x53, 0xb2, 0xce, 0x56, 0x44, 0x32, 0xa2, 0x90, 0xf7, 0xd7, 0x3b, 0x7f, + 0xce, 0x6d, 0xc6, 0xf2, 0xb0, 0xa9, 0xbe, 0xdb, 0xc7, 0x87, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, + 0xda, 0x67, 0xaf, 0xb4, 0x02, 0x00, 0x00, } func (m *TradingReward) Marshal() (dAtA []byte, err error) { @@ -194,6 +378,136 @@ func (m *TradingReward) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TradingRewardLeaderboard) 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 *TradingRewardLeaderboard) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TradingRewardLeaderboard) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.List) > 0 { + for iNdEx := len(m.List) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.List[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTradingReward(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.RewardId) > 0 { + i -= len(m.RewardId) + copy(dAtA[i:], m.RewardId) + i = encodeVarintTradingReward(dAtA, i, uint64(len(m.RewardId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TradingRewardLeaderboardEntry) 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 *TradingRewardLeaderboardEntry) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TradingRewardLeaderboardEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CreatedAt != 0 { + i = encodeVarintTradingReward(dAtA, i, uint64(m.CreatedAt)) + i-- + dAtA[i] = 0x18 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTradingReward(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x12 + } + if len(m.Amount) > 0 { + i -= len(m.Amount) + copy(dAtA[i:], m.Amount) + i = encodeVarintTradingReward(dAtA, i, uint64(len(m.Amount))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TradingRewardCandidate) 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 *TradingRewardCandidate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TradingRewardCandidate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTradingReward(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0x1a + } + if len(m.Amount) > 0 { + i -= len(m.Amount) + copy(dAtA[i:], m.Amount) + i = encodeVarintTradingReward(dAtA, i, uint64(len(m.Amount))) + i-- + dAtA[i] = 0x12 + } + if len(m.RewardId) > 0 { + i -= len(m.RewardId) + copy(dAtA[i:], m.RewardId) + i = encodeVarintTradingReward(dAtA, i, uint64(len(m.RewardId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintTradingReward(dAtA []byte, offset int, v uint64) int { offset -= sovTradingReward(v) base := offset @@ -236,6 +550,66 @@ func (m *TradingReward) Size() (n int) { return n } +func (m *TradingRewardLeaderboard) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RewardId) + if l > 0 { + n += 1 + l + sovTradingReward(uint64(l)) + } + if len(m.List) > 0 { + for _, e := range m.List { + l = e.Size() + n += 1 + l + sovTradingReward(uint64(l)) + } + } + return n +} + +func (m *TradingRewardLeaderboardEntry) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Amount) + if l > 0 { + n += 1 + l + sovTradingReward(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTradingReward(uint64(l)) + } + if m.CreatedAt != 0 { + n += 1 + sovTradingReward(uint64(m.CreatedAt)) + } + return n +} + +func (m *TradingRewardCandidate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RewardId) + if l > 0 { + n += 1 + l + sovTradingReward(uint64(l)) + } + l = len(m.Amount) + if l > 0 { + n += 1 + l + sovTradingReward(uint64(l)) + } + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTradingReward(uint64(l)) + } + return n +} + func sovTradingReward(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -458,6 +832,401 @@ func (m *TradingReward) Unmarshal(dAtA []byte) error { } return nil } +func (m *TradingRewardLeaderboard) 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 ErrIntOverflowTradingReward + } + 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: TradingRewardLeaderboard: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TradingRewardLeaderboard: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RewardId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + 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 ErrInvalidLengthTradingReward + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTradingReward + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RewardId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field List", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTradingReward + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTradingReward + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.List = append(m.List, TradingRewardLeaderboardEntry{}) + if err := m.List[len(m.List)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTradingReward(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTradingReward + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TradingRewardLeaderboardEntry) 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 ErrIntOverflowTradingReward + } + 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: TradingRewardLeaderboardEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TradingRewardLeaderboardEntry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + 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 ErrInvalidLengthTradingReward + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTradingReward + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Amount = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + 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 ErrInvalidLengthTradingReward + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTradingReward + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreatedAt", wireType) + } + m.CreatedAt = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CreatedAt |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTradingReward(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTradingReward + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TradingRewardCandidate) 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 ErrIntOverflowTradingReward + } + 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: TradingRewardCandidate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TradingRewardCandidate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RewardId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + 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 ErrInvalidLengthTradingReward + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTradingReward + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RewardId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + 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 ErrInvalidLengthTradingReward + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTradingReward + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Amount = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTradingReward + } + 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 ErrInvalidLengthTradingReward + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTradingReward + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTradingReward(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTradingReward + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTradingReward(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/tradebin/keeper/keeper.go b/x/tradebin/keeper/keeper.go index b6c376e9..ceade6db 100644 --- a/x/tradebin/keeper/keeper.go +++ b/x/tradebin/keeper/keeper.go @@ -20,6 +20,8 @@ type ( bankKeeper types.BankKeeper distrKeeper types.DistrKeeper + + onOrderFillHooks []types.OnMarketOrderFill } ) @@ -47,6 +49,14 @@ func NewKeeper( } } +func (k *Keeper) SetOnOrderFillHooks(hooks []types.OnMarketOrderFill) { + k.onOrderFillHooks = hooks +} + +func (k Keeper) GetOnOrderFillHooks() []types.OnMarketOrderFill { + return k.onOrderFillHooks +} + func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } diff --git a/x/tradebin/keeper/queue_message_processor.go b/x/tradebin/keeper/queue_message_processor.go index c61def55..5ed48dfe 100644 --- a/x/tradebin/keeper/queue_message_processor.go +++ b/x/tradebin/keeper/queue_message_processor.go @@ -35,6 +35,8 @@ type ProcessingKeeper interface { GetOrderCoins(orderType, orderPrice string, orderAmount sdk.Int, market *types.Market) (sdk.Coin, error) Logger(ctx sdk.Context) log.Logger + + GetOnOrderFillHooks() []types.OnMarketOrderFill } type BankKeeper interface { @@ -232,7 +234,7 @@ func (pe *ProcessingEngine) addOrder(ctx sdk.Context, message types.QueueMessage } pe.addHistoryOrder(ctx, &orderToFill, amountToExecute, &message) - pe.emitOrderExecutedEvent(ctx, &orderToFill, amountToExecute.String()) + pe.emitOrderExecutedEvent(ctx, &orderToFill, amountToExecute.String(), message.Owner) } if aggAmountInt.GT(zeroInt) { @@ -416,7 +418,7 @@ func (pe *ProcessingEngine) addOrderToAggregate(ctx sdk.Context, order *types.Or pe.k.SetAggregatedOrder(ctx, agg) } -func (pe *ProcessingEngine) emitOrderExecutedEvent(ctx sdk.Context, order *types.Order, amount string) { +func (pe *ProcessingEngine) emitOrderExecutedEvent(ctx sdk.Context, order *types.Order, amount, userAddress string) { err := ctx.EventManager().EmitTypedEvent( &types.OrderExecutedEvent{ Id: order.Id, @@ -430,6 +432,20 @@ func (pe *ProcessingEngine) emitOrderExecutedEvent(ctx sdk.Context, order *types if err != nil { pe.logger.Error(err.Error()) } + + //call hooks for the filled order + for _, h := range pe.k.GetOnOrderFillHooks() { + wrappedFn := func(ctx sdk.Context) error { + h(ctx, order.MarketId, amount, userAddress) + + return nil + } + + err = bzeutils.ApplyFuncIfNoError(ctx, wrappedFn) + if err != nil { + pe.k.Logger(ctx).Error(err.Error()) + } + } } func (pe *ProcessingEngine) emitOrderCanceledEvent(ctx sdk.Context, order *types.Order) { diff --git a/x/tradebin/types/hooks.go b/x/tradebin/types/hooks.go new file mode 100644 index 00000000..80c7d4ac --- /dev/null +++ b/x/tradebin/types/hooks.go @@ -0,0 +1,5 @@ +package types + +import sdk "github.com/cosmos/cosmos-sdk/types" + +type OnMarketOrderFill func(ctx sdk.Context, marketId, amountTraded, userAddress string)