Skip to content

Commit

Permalink
feat: add one-time grain restoration vote (#1339)
Browse files Browse the repository at this point in the history
# Related Github tickets

VolumeFi#2570 (comment) 

# Background

This change introduces a new vote which can be used to recreate the 1.3b
GRAIN tokens which are lost forever on BASE. They will be funded to the
Paloma Foundation wallets.

# Testing completed

- [x] test coverage exists or has been added/updated
- [x] tested in a private testnet

# Breaking changes

- [x] I have checked my code for breaking changes
- [x] If there are breaking changes, there is a supporting migration.
  • Loading branch information
byte-bandit authored Feb 10, 2025
1 parent 6b317f3 commit 59e5771
Show file tree
Hide file tree
Showing 11 changed files with 445 additions and 149 deletions.
9 changes: 9 additions & 0 deletions proto/palomachain/paloma/skyway/msgs.proto
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ service Msg {
"/palomachain/paloma/skyway/erc20-to-token-denom";
}

rpc ReplenishLostGrainsProposal(MsgReplenishLostGrainsProposal) returns (google.protobuf.Empty);
rpc OverrideNonceProposal(MsgNonceOverrideProposal) returns (google.protobuf.Empty);
}

Expand All @@ -85,6 +86,14 @@ message MsgNonceOverrideProposal {
uint64 nonce = 3;
}

// TODO: Remove this message after usage
message MsgReplenishLostGrainsProposal {
option deprecated = true;
option (cosmos.msg.v1.signer) = "metadata";
palomachain.paloma.valset.MsgMetadata metadata = 1
[ (gogoproto.nullable) = false ];
}

// MsgSendToRemote
// This is the message that a user calls when they want to bridge an asset
// it will later be removed when it is included in a batch and successfully
Expand Down
41 changes: 41 additions & 0 deletions x/skyway/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"

sdkerrors "cosmossdk.io/errors"
"cosmossdk.io/math"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
errorsmod "github.com/cosmos/cosmos-sdk/types/errors"
Expand Down Expand Up @@ -425,6 +426,46 @@ func (k *msgServer) OverrideNonceProposal(ctx context.Context, req *types.MsgNon
return &emptypb.Empty{}, k.overrideNonce(ctx, req.ChainReferenceId, req.Nonce)
}

func (k *msgServer) ReplenishLostGrainsProposal(ctx context.Context, req *types.MsgReplenishLostGrainsProposal) (*emptypb.Empty, error) {
if err := req.ValidateBasic(); err != nil {
return nil, sdkerrors.Wrapf(govtypes.ErrInvalidSigner, "message validation failed: %v", err)
}
if req.Metadata.Creator != k.authority {
return nil, sdkerrors.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.authority, req.Metadata.Creator)
}

ctx, commit := sdk.UnwrapSDKContext(ctx).CacheContext()
store := k.GetStore(ctx, types.StoreModulePrefix)
if store.Get(types.ReplenishedGrainRecordsKey) != nil {
return nil, fmt.Errorf("operation may only be run once.")
}

for _, addr := range []string{
"paloma17t5pd5l0d8a3p54r0p92src8tx2tvs7l2afmd9",
"paloma1vlrsw0hf6ddkje99jtnzh4raaa4dqpwqapeaz6",
} {

amount := sdk.NewCoin("ugrain", math.NewInt(665625000000000))
err := k.bankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(amount))
if err != nil {
return nil, fmt.Errorf("MintCoins: %w", err)
}

receiver := sdk.MustAccAddressFromBech32(addr)
err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName,
receiver,
sdk.NewCoins(amount))
if err != nil {
return nil, fmt.Errorf("SendCoinsFromModuleToAccount: %w", err)
}
}

store.Set(types.ReplenishedGrainRecordsKey, []byte("1"))

commit()
return &emptypb.Empty{}, nil
}

func (k *msgServer) SetERC20ToTokenDenom(ctx context.Context, msg *types.MsgSetERC20ToTokenDenom) (*emptypb.Empty, error) {
sdkCtx := sdk.UnwrapSDKContext(ctx)
sender, err := sdk.AccAddressFromBech32(msg.Metadata.Creator)
Expand Down
1 change: 1 addition & 0 deletions x/skyway/types/attestation.pb.go

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

1 change: 1 addition & 0 deletions x/skyway/types/batch.pb.go

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

1 change: 1 addition & 0 deletions x/skyway/types/bridge_transfer_limit.pb.go

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

1 change: 1 addition & 0 deletions x/skyway/types/bridge_transfer_limit_proposal.pb.go

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

2 changes: 2 additions & 0 deletions x/skyway/types/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) {
&MsgSubmitBadSignatureEvidence{},
&MsgLightNodeSaleClaim{},
&MsgNonceOverrideProposal{},
&MsgReplenishLostGrainsProposal{},
&MsgSetERC20ToTokenDenom{},
)

Expand Down Expand Up @@ -86,5 +87,6 @@ func RegisterCodec(cdc *codec.LegacyAmino) {
cdc.RegisterConcrete(&MsgLightNodeSaleClaim{}, "skyway/MsgLightNodeSaleClaim", nil)
cdc.RegisterConcrete(&SetLightNodeSaleContractsProposal{}, "skyway/SetLightNodeSaleContractsProposal", nil)
cdc.RegisterConcrete(&MsgNonceOverrideProposal{}, "skyway/MsgNonceOverrideProposal", nil)
cdc.RegisterConcrete(&MsgReplenishLostGrainsProposal{}, "skyway/MsgReplenishLostGrainsProposal", nil)
cdc.RegisterConcrete(&MsgSetERC20ToTokenDenom{}, "skyway/MsgSetERC20ToTokenDenom", nil)
}

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

2 changes: 2 additions & 0 deletions x/skyway/types/key.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ var (
// [0x06a6b30651341e80276e0d2e19449250]
LastUnBondingBlockHeight = HashString("LastUnBondingBlockHeight")

ReplenishedGrainRecordsKey = HashString("ReplenishedGrainRecordsKey")

// PastEthSignatureCheckpointKey indexes eth signature checkpoints that have existed
// [0x1cbe0be407a979331b98e599eeedd09f]
PastEthSignatureCheckpointKey = HashString("PastEthSignatureCheckpointKey")
Expand Down
15 changes: 15 additions & 0 deletions x/skyway/types/msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ var (
_ sdk.Msg = &MsgUpdateParams{}
_ sdk.Msg = &MsgLightNodeSaleClaim{}
_ sdk.Msg = &MsgSetERC20ToTokenDenom{}
_ sdk.Msg = &MsgReplenishLostGrainsProposal{}
)

// NewMsgSendToRemote returns a new msgSendToRemote
Expand Down Expand Up @@ -481,3 +482,17 @@ func (msg *MsgSetERC20ToTokenDenom) GetSigners() []sdk.AccAddress {

func (msg MsgSetERC20ToTokenDenom) Type() string { return "set-erc20-to-denom" }
func (msg MsgSetERC20ToTokenDenom) Route() string { return RouterKey }

func (msg MsgReplenishLostGrainsProposal) Route() string { return RouterKey }
func (msg MsgReplenishLostGrainsProposal) Type() string { return "replenish_lost_grains_proposal" }
func (msg MsgReplenishLostGrainsProposal) ValidateBasic() error {
return libmeta.ValidateBasic(&msg)
}

func (msg MsgReplenishLostGrainsProposal) GetSignBytes() []byte {
return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
}

func (msg MsgReplenishLostGrainsProposal) GetSigners() []sdk.AccAddress {
return libmeta.GetSigners(&msg)
}
Loading

0 comments on commit 59e5771

Please sign in to comment.