Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: bc fusion hardfork implementation #983

Merged
merged 17 commits into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -918,6 +918,7 @@ func (app *BNBBeaconChain) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock)
tokens.EndBreatheBlock(ctx, app.swapKeeper)
} else {
app.Logger.Debug("normal block", "height", height)
tokens.EndBlocker(ctx, app.timeLockKeeper, app.swapKeeper)
}

app.DexKeeper.StoreTradePrices(ctx)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ require (

replace (
github.com/Shopify/sarama v1.26.1 => github.com/Shopify/sarama v1.21.0
github.com/cosmos/cosmos-sdk => github.com/bnb-chain/bnc-cosmos-sdk v0.26.6
github.com/cosmos/cosmos-sdk => github.com/j75689/bnc-cosmos-sdk v0.0.0-20230828031047-de8de0dae3cf //github.com/bnb-chain/bnc-cosmos-sdk v0.26.6
github.com/grpc-ecosystem/grpc-gateway/v2 => github.com/prysmaticlabs/grpc-gateway/v2 v2.3.1-0.20210702154020-550e1cd83ec1
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
github.com/tendermint/go-amino => github.com/bnb-chain/bnc-go-amino v0.14.1-binance.2
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,6 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
github.com/bnb-chain/bnc-cosmos-sdk v0.26.6 h1:5NrdUXplI2cqWZlLOovSqm+xO5ja03ZPCPT4bQqCD1Y=
github.com/bnb-chain/bnc-cosmos-sdk v0.26.6/go.mod h1:OjdXpDHofs6gcPLM9oGD+mm8DPc6Lsevz0Kia53zt3Q=
github.com/bnb-chain/bnc-go-amino v0.14.1-binance.2 h1:iAlp9gqG0f2LGAauf3ZiijWlT6NI+W2r9y70HH9LI3k=
github.com/bnb-chain/bnc-go-amino v0.14.1-binance.2/go.mod h1:LiCO7jev+3HwLGAiN9gpD0z+jTz95RqgSavbse55XOY=
github.com/bnb-chain/bnc-tendermint v0.32.3-bc.10 h1:E4iSwEbJCLYchHiHE1gnOM3jjmJXLBxARhy/RCl8CpI=
Expand Down Expand Up @@ -789,6 +787,8 @@ github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5Uybo
github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g=
github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA=
github.com/j75689/bnc-cosmos-sdk v0.0.0-20230828031047-de8de0dae3cf h1:V7pDFgJSxT0EBqD0ZNB6tJjey1YatkVwkxhmYboCN3Q=
github.com/j75689/bnc-cosmos-sdk v0.0.0-20230828031047-de8de0dae3cf/go.mod h1:OjdXpDHofs6gcPLM9oGD+mm8DPc6Lsevz0Kia53zt3Q=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
Expand Down
3 changes: 3 additions & 0 deletions plugins/bridge/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ func NewHandler(keeper Keeper) sdk.Handler {
}

func handleUnbindMsg(ctx sdk.Context, keeper Keeper, msg UnbindMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
// check is native symbol
if msg.Symbol == cmmtypes.NativeTokenSymbol {
return types.ErrInvalidSymbol("can not unbind native symbol").Result()
Expand Down
4 changes: 4 additions & 0 deletions plugins/dex/order/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ func NewHandler(dexKeeper *DexKeeper) sdk.Handler {
}
return handleNewOrder(ctx, dexKeeper, msg)
case CancelOrderMsg:
if sdk.IsUpgrade(sdk.BEPXXX) {
unclezoro marked this conversation as resolved.
Show resolved Hide resolved
return sdk.ErrMsgNotSupported("").Result()
}
return handleCancelOrder(ctx, dexKeeper, msg)
default:
errMsg := fmt.Sprintf("Unrecognized dex msg type: %v", reflect.TypeOf(msg).Name())
Expand Down Expand Up @@ -104,6 +107,7 @@ func validateQtyAndLockBalance(ctx sdk.Context, keeper *DexKeeper, acc common.Na
func handleNewOrder(
ctx sdk.Context, dexKeeper *DexKeeper, msg NewOrderMsg,
) sdk.Result {

if _, ok := dexKeeper.OrderExists(msg.Symbol, msg.Id); ok {
errString := fmt.Sprintf("Duplicated order [%v] on symbol [%v]", msg.Id, msg.Symbol)
return sdk.NewError(types.DefaultCodespace, types.CodeDuplicatedOrder, errString).Result()
Expand Down
3 changes: 3 additions & 0 deletions plugins/tokens/freeze/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ func NewHandler(tokenMapper store.Mapper, accKeeper auth.AccountKeeper, keeper b
}

func handleFreezeToken(ctx sdk.Context, tokenMapper store.Mapper, accKeeper auth.AccountKeeper, keeper bank.Keeper, msg FreezeMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
freezeAmount := msg.Amount
symbol := strings.ToUpper(msg.Symbol)
logger := log.With("module", "token", "symbol", symbol, "amount", freezeAmount, "addr", msg.From)
Expand Down
8 changes: 7 additions & 1 deletion plugins/tokens/issue/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ func NewHandler(tokenMapper store.Mapper, keeper bank.Keeper) sdk.Handler {
}

func handleIssueToken(ctx sdk.Context, tokenMapper store.Mapper, bankKeeper bank.Keeper, msg IssueMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
errLogMsg := "issue token failed"
symbol := strings.ToUpper(msg.Symbol)
logger := log.With("module", "token", "symbol", symbol, "name", msg.Name, "total_supply", msg.TotalSupply, "issuer", msg.From)
Expand All @@ -62,8 +65,11 @@ func handleIssueToken(ctx sdk.Context, tokenMapper store.Mapper, bankKeeper bank
return issue(ctx, logger, tokenMapper, bankKeeper, token)
}

//Mint MiniToken is also handled by this function
// Mint MiniToken is also handled by this function
func handleMintToken(ctx sdk.Context, tokenMapper store.Mapper, bankKeeper bank.Keeper, msg MintMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
symbol := strings.ToUpper(msg.Symbol)
logger := log.With("module", "token", "symbol", symbol, "amount", msg.Amount, "minter", msg.From)

Expand Down
6 changes: 6 additions & 0 deletions plugins/tokens/issue/handler_mini.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ import (
)

func handleIssueMiniToken(ctx sdk.Context, tokenMapper store.Mapper, bankKeeper bank.Keeper, msg IssueMiniMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
errLogMsg := "issue miniToken failed"
origSymbol := strings.ToUpper(msg.Symbol)
logger := log.With("module", "mini-token", "symbol", origSymbol, "name", msg.Name, "total_supply", msg.TotalSupply, "issuer", msg.From)
Expand All @@ -34,6 +37,9 @@ func handleIssueMiniToken(ctx sdk.Context, tokenMapper store.Mapper, bankKeeper
}

func handleIssueTinyToken(ctx sdk.Context, tokenMapper store.Mapper, bankKeeper bank.Keeper, msg IssueTinyMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
errLogMsg := "issue tinyToken failed"
origSymbol := strings.ToUpper(msg.Symbol)
logger := log.With("module", "mini-token", "symbol", origSymbol, "name", msg.Name, "total_supply", msg.TotalSupply, "issuer", msg.From)
Expand Down
43 changes: 43 additions & 0 deletions plugins/tokens/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,49 @@
return createAbciQueryHandler(mapper, queryPrefix)
}

const (
MaxUnlockItems = 100
unclezoro marked this conversation as resolved.
Show resolved Hide resolved
)

func EndBlocker(ctx sdk.Context, timelockKeeper timelock.Keeper, swapKeeper swap.Keeper) {
logger := bnclog.With("module", "tokens")
logger.Info("unlock the time locks", "blockHeight", ctx.BlockHeight())

iterator := timelockKeeper.GetTimeLockRecordIterator(ctx)
defer iterator.Close()
i := 0
for ; iterator.Valid(); iterator.Next() {
if i >= MaxUnlockItems {
break
}
addr, id, err := timelock.ParseKeyRecord(iterator.Key())
if err != nil {
logger.Error("ParseKeyRecord error", "error", err)
continue
}
timelockKeeper.TimeUnlock(ctx, addr, id)

Check failure on line 74 in plugins/tokens/plugin.go

View workflow job for this annotation

GitHub Actions / lint

Error return value of `timelockKeeper.TimeUnlock` is not checked (errcheck)
unclezoro marked this conversation as resolved.
Show resolved Hide resolved
i++
}

iterator = swapKeeper.GetSwapIterator(ctx)
defer iterator.Close()
unclezoro marked this conversation as resolved.
Show resolved Hide resolved
i = 0
for ; iterator.Valid(); iterator.Next() {
if i >= MaxUnlockItems {
break
}
var automaticSwap swap.AtomicSwap
swapKeeper.CDC().MustUnmarshalBinaryBare(iterator.Value(), &automaticSwap)
swapID := iterator.Key()[len(swap.HashKey):]
err := swapKeeper.Refound(ctx, swapID, &automaticSwap)
if err != nil {
logger.Error("Refound error", "error", err)
continue
}
i++
}
}

// EndBreatheBlock processes the breathe block lifecycle event.
func EndBreatheBlock(ctx sdk.Context, swapKeeper swap.Keeper) {
logger := bnclog.With("module", "tokens")
Expand Down
6 changes: 6 additions & 0 deletions plugins/tokens/swap/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ func NewHandler(kp Keeper) sdk.Handler {
}

func handleHashTimerLockedTransfer(ctx sdk.Context, kp Keeper, msg HTLTMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
header := ctx.BlockHeader()
blockTime := header.Time.Unix()
if msg.Timestamp < blockTime-ThirtyMinutes || msg.Timestamp > blockTime+FifteenMinutes {
Expand Down Expand Up @@ -66,6 +69,9 @@ func handleHashTimerLockedTransfer(ctx sdk.Context, kp Keeper, msg HTLTMsg) sdk.
}

func handleDepositHashTimerLockedTransfer(ctx sdk.Context, kp Keeper, msg DepositHTLTMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
swap := kp.GetSwap(ctx, msg.SwapID)
if swap == nil {
return ErrNonExistSwapID(fmt.Sprintf("No matched swap with swapID %v", msg.SwapID)).Result()
Expand Down
35 changes: 35 additions & 0 deletions plugins/tokens/swap/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, ck bank.Keeper, addrPool *sdk
}
}

func (keeper Keeper) CDC() *codec.Codec {
return keeper.cdc
}

func (kp *Keeper) CreateSwap(ctx sdk.Context, swapID SwapBytes, swap *AtomicSwap) sdk.Error {
if swap == nil {
return sdk.ErrInternal("empty atomic swap pointer")
Expand Down Expand Up @@ -137,6 +141,11 @@ func (kp *Keeper) GetSwap(ctx sdk.Context, swapID SwapBytes) *AtomicSwap {
return &swap
}

func (kp *Keeper) GetSwapIterator(ctx sdk.Context) (iterator store.Iterator) {
kvStore := ctx.KVStore(kp.storeKey)
return sdk.KVStorePrefixIterator(kvStore, HashKey)
}

func (kp *Keeper) GetSwapCreatorIterator(ctx sdk.Context, addr sdk.AccAddress) (iterator store.Iterator) {
kvStore := ctx.KVStore(kp.storeKey)
return sdk.KVStorePrefixIterator(kvStore, BuildSwapCreatorQueueKey(addr))
Expand All @@ -160,3 +169,29 @@ func (kp *Keeper) getIndex(ctx sdk.Context) int64 {
}
return int64(binary.BigEndian.Uint64(bz))
}

func (kp *Keeper) Refound(ctx sdk.Context, swapID SwapBytes, swap *AtomicSwap) error {
unclezoro marked this conversation as resolved.
Show resolved Hide resolved
if swap.Status != Open {
return fmt.Errorf(fmt.Sprint("Invalid swap status", "status", swap.Status))
}
if !swap.OutAmount.IsZero() {
_, err := kp.ck.SendCoins(ctx, AtomicSwapCoinsAccAddr, swap.From, swap.OutAmount)
if err != nil {
return fmt.Errorf(fmt.Sprint("Failed to send coins", "sender", AtomicSwapCoinsAccAddr.String(), "recipient", swap.From.String(), "amount", swap.OutAmount.String(), "err", err.Error()))
}
}
if !swap.InAmount.IsZero() {
_, err := kp.ck.SendCoins(ctx, AtomicSwapCoinsAccAddr, swap.To, swap.InAmount)
if err != nil {
return fmt.Errorf(fmt.Sprint("Failed to send coins", "sender", AtomicSwapCoinsAccAddr.String(), "recipient", swap.To.String(), "amount", swap.InAmount.String(), "err", err.Error()))
}
}

swap.Status = Completed
swap.ClosedTime = ctx.BlockHeader().Time.Unix()
err := kp.CloseSwap(ctx, swapID, swap)
if err != nil {
return fmt.Errorf(fmt.Sprint("Failed to close swap", "err", err.Error()))
}
return nil
}
6 changes: 6 additions & 0 deletions plugins/tokens/timelock/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ func NewHandler(keeper Keeper) sdk.Handler {
}

func handleTimeLock(ctx sdk.Context, keeper Keeper, msg TimeLockMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
record, err := keeper.TimeLock(ctx, msg.From, msg.Description, msg.Amount, time.Unix(msg.LockTime, 0))
if err != nil {
return err.Result()
Expand All @@ -36,6 +39,9 @@ func handleTimeLock(ctx sdk.Context, keeper Keeper, msg TimeLockMsg) sdk.Result
}

func handleTimeRelock(ctx sdk.Context, keeper Keeper, msg TimeRelockMsg) sdk.Result {
if sdk.IsUpgrade(sdk.BEPXXX) {
return sdk.ErrMsgNotSupported("").Result()
}
newRecord := TimeLockRecord{
Description: msg.Description,
Amount: msg.Amount,
Expand Down
6 changes: 6 additions & 0 deletions plugins/tokens/timelock/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"time"

"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/bank"
Expand Down Expand Up @@ -88,6 +89,11 @@ func (keeper Keeper) GetTimeLockRecords(ctx sdk.Context, addr sdk.AccAddress) []
return records
}

func (kp *Keeper) GetTimeLockRecordIterator(ctx sdk.Context) (iterator store.Iterator) {
kvStore := ctx.KVStore(kp.storeKey)
return sdk.KVStorePrefixIterator(kvStore, []byte{})
}

func (keeper Keeper) getTimeLockId(ctx sdk.Context, from sdk.AccAddress) int64 {
acc := keeper.ak.GetAccount(ctx, from)
return acc.GetSequence()
Expand Down
13 changes: 13 additions & 0 deletions plugins/tokens/timelock/keys.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package timelock

import (
"bytes"
"fmt"
"strconv"

sdk "github.com/cosmos/cosmos-sdk/types"
)
Expand All @@ -13,3 +15,14 @@ func KeyRecord(addr sdk.AccAddress, id int64) []byte {
func KeyRecordSubSpace(addr sdk.AccAddress) []byte {
return []byte(fmt.Sprintf("record:%d", addr))
}

func ParseKeyRecord(key []byte) (sdk.AccAddress, int64, error) {
key = bytes.TrimPrefix(key, []byte("record:"))
addr := sdk.AccAddress(key[:sdk.AddrLen])

id, err := strconv.ParseInt(string(key[sdk.AddrLen+1:]), 10, 64)
if err != nil {
return []byte{}, 0, err
}
return addr, id, nil
}
forcodedancing marked this conversation as resolved.
Show resolved Hide resolved
Loading