Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/release/v1.x.x' into keefer/fix-…
Browse files Browse the repository at this point in the history
…addr-prefix
  • Loading branch information
keefertaylor committed Jul 11, 2023
2 parents 5d48bf9 + 8a42a8b commit 72241fc
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 21 deletions.
3 changes: 2 additions & 1 deletion api/pob/builder/module/v1/module.pulsar.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions proto/pob/builder/module/v1/module.proto
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import "cosmos/app/v1alpha1/module.proto";
// Module is the config object of the builder module.
message Module {
option (cosmos.app.v1alpha1.module) = {
go_import: "github.com/skip-mev/pob/x/builder"
go_import : "github.com/skip-mev/pob/x/builder"
};

// Authority defines the custom module authority. If not set, defaults to the governance module.
// Authority defines the custom module authority. If not set, defaults to the
// governance module.
string authority = 2;
}
10 changes: 4 additions & 6 deletions proto/pob/builder/v1/genesis.proto
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ import "amino/amino.proto";
option go_package = "github.com/skip-mev/pob/x/builder/types";

// GenesisState defines the genesis state of the x/builder module.
message GenesisState {
Params params = 1 [(gogoproto.nullable) = false];
}
message GenesisState { Params params = 1 [ (gogoproto.nullable) = false ]; }

// Params defines the parameters of the x/builder module.
message Params {
Expand All @@ -26,12 +24,12 @@ message Params {

// reserve_fee specifies the bid floor for the auction.
cosmos.base.v1beta1.Coin reserve_fee = 3
[(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
[ (gogoproto.nullable) = false, (amino.dont_omitempty) = true ];

// min_bid_increment specifies the minimum amount that the next bid must be
// greater than the previous bid.
cosmos.base.v1beta1.Coin min_bid_increment = 4
[(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
[ (gogoproto.nullable) = false, (amino.dont_omitempty) = true ];

// front_running_protection specifies whether front running and sandwich
// attack protection is enabled.
Expand All @@ -40,7 +38,7 @@ message Params {
// proposer_fee defines the portion of the winning bid that goes to the block
// proposer that proposed the block.
string proposer_fee = 6 [
(gogoproto.nullable) = false,
(gogoproto.nullable) = false,
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec"
];
}
42 changes: 33 additions & 9 deletions x/builder/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,23 @@ import (
"github.com/cosmos/cosmos-sdk/codec"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
rewardsaddressprovider "github.com/skip-mev/pob/x/builder/rewards_address_provider"
"github.com/skip-mev/pob/x/builder/types"
)

type Keeper struct {
cdc codec.BinaryCodec
storeKey storetypes.StoreKey

bankKeeper types.BankKeeper
distrKeeper types.DistributionKeeper
stakingKeeper types.StakingKeeper
bankKeeper types.BankKeeper
rewardsAddressProvider types.RewardsAddressProvider

// The address that is capable of executing a MsgUpdateParams message.
// Typically this will be the governance module's address.
authority string
}

// NewKeeper is a wrapper around NewKeeperWithRewardsAddressProvider for backwards compatibility.
func NewKeeper(
cdc codec.BinaryCodec,
storeKey storetypes.StoreKey,
Expand All @@ -32,6 +33,30 @@ func NewKeeper(
distrKeeper types.DistributionKeeper,
stakingKeeper types.StakingKeeper,
authority string,
) Keeper {
// Build a rewards address provider
rewardsAddressProvider := rewardsaddressprovider.NewProposerRewardsAddressProvider(
distrKeeper,
stakingKeeper,
)

return NewKeeperWithRewardsAddressProvider(
cdc,
storeKey,
accountKeeper,
bankKeeper,
rewardsAddressProvider,
authority,
)
}

func NewKeeperWithRewardsAddressProvider(
cdc codec.BinaryCodec,
storeKey storetypes.StoreKey,
accountKeeper types.AccountKeeper,
bankKeeper types.BankKeeper,
rewardsAddressProvider types.RewardsAddressProvider,
authority string,
) Keeper {
// Ensure that the authority address is valid.
if _, err := sdk.AccAddressFromBech32(authority); err != nil {
Expand All @@ -44,12 +69,11 @@ func NewKeeper(
}

return Keeper{
cdc: cdc,
storeKey: storeKey,
bankKeeper: bankKeeper,
distrKeeper: distrKeeper,
stakingKeeper: stakingKeeper,
authority: authority,
cdc: cdc,
storeKey: storeKey,
bankKeeper: bankKeeper,
rewardsAddressProvider: rewardsAddressProvider,
authority: authority,
}
}

Expand Down
5 changes: 2 additions & 3 deletions x/builder/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,13 @@ func (m MsgServer) AuctionBid(goCtx context.Context, msg *types.MsgAuctionBid) (
return nil, err
}
} else {
prevPropConsAddr := m.distrKeeper.GetPreviousProposerConsAddr(ctx)
prevProposer := m.stakingKeeper.ValidatorByConsAddr(ctx, prevPropConsAddr)
rewardsAddress := m.rewardsAddressProvider.GetRewardsAddress(ctx)

// determine the amount of the bid that goes to the (previous) proposer
bid := sdk.NewDecCoinsFromCoins(msg.Bid)
proposerReward, _ = bid.MulDecTruncate(params.ProposerFee).TruncateDecimal()

if err := m.bankKeeper.SendCoins(ctx, bidder, sdk.AccAddress(prevProposer.GetOperator()), proposerReward); err != nil {
if err := m.bankKeeper.SendCoins(ctx, bidder, rewardsAddress, proposerReward); err != nil {
return nil, err
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package rewardsaddressprovider

import (
"cosmossdk.io/depinject"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/skip-mev/pob/x/builder/types"
)

// FixedAddressRewardsAddressProvider provides auction profits to a fixed address
type FixedAddressRewardsAddressProvider struct {
rewardsAddress sdk.AccAddress
}

// NewFixedAddressRewardsAddressProvider creates a reward provider for a fixed address.
func NewFixedAddressRewardsAddressProvider(
rewardsAddress sdk.AccAddress,
) types.RewardsAddressProvider {
return &FixedAddressRewardsAddressProvider{
rewardsAddress: rewardsAddress,
}
}

func (p *FixedAddressRewardsAddressProvider) GetRewardsAddress(_ sdk.Context) sdk.AccAddress {
return p.rewardsAddress
}

// Dependency injection

type FixedAddressDepInjectInput struct {
depinject.In

AccountKeeper types.AccountKeeper
}

type FixedAddressDepInjectOutput struct {
depinject.Out

RewardsAddressProvider types.RewardsAddressProvider
}

func ProvideModuleAddress(in FixedAddressDepInjectInput) FixedAddressDepInjectOutput {
rewardAddressProvider := NewFixedAddressRewardsAddressProvider(
in.AccountKeeper.GetModuleAddress(types.ModuleName),
)

return FixedAddressDepInjectOutput{RewardsAddressProvider: rewardAddressProvider}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package rewardsaddressprovider

import (
"cosmossdk.io/depinject"
sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/skip-mev/pob/x/builder/types"
)

// ProposerRewardsAddressProvider provides auction profits to the block proposer.
type ProposerRewardsAddressProvider struct {
distrKeeper types.DistributionKeeper
stakingKeeper types.StakingKeeper
}

// NewFixedAddressRewardsAddressProvider creates a reward provider for a fixed address.
func NewProposerRewardsAddressProvider(
distrKeeper types.DistributionKeeper,
stakingKeeper types.StakingKeeper,
) types.RewardsAddressProvider {
return &ProposerRewardsAddressProvider{
distrKeeper: distrKeeper,
stakingKeeper: stakingKeeper,
}
}

func (p *ProposerRewardsAddressProvider) GetRewardsAddress(context sdk.Context) sdk.AccAddress {
prevPropConsAddr := p.distrKeeper.GetPreviousProposerConsAddr(context)
prevProposer := p.stakingKeeper.ValidatorByConsAddr(context, prevPropConsAddr)

return sdk.AccAddress(prevProposer.GetOperator())
}

// Dependency injection

type ProposerRewardsDepInjectInput struct {
depinject.In

types.DistributionKeeper
types.StakingKeeper
}

type ProposerRewardsDepInjectOutput struct {
depinject.Out

RewardsAddressProvider types.RewardsAddressProvider
}

func ProvideProposerRewards(in ProposerRewardsDepInjectInput) ProposerRewardsDepInjectOutput {
rewardAddressProvider := NewProposerRewardsAddressProvider(
in.DistributionKeeper,
in.StakingKeeper,
)

return ProposerRewardsDepInjectOutput{RewardsAddressProvider: rewardAddressProvider}
}
5 changes: 5 additions & 0 deletions x/builder/types/expected_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,8 @@ type DistributionKeeper interface {
type StakingKeeper interface {
ValidatorByConsAddr(sdk.Context, sdk.ConsAddress) stakingtypes.ValidatorI
}

// RewardsAddressProvider is an interface that provides an address where auction profits are sent.
type RewardsAddressProvider interface {
GetRewardsAddress(context sdk.Context) sdk.AccAddress
}

0 comments on commit 72241fc

Please sign in to comment.