Skip to content

Commit ae16fa0

Browse files
authored
Merge pull request #649 from bnb-chain/develop
release: prepare for v1.10.0
2 parents eb6e32a + 1fa7d0f commit ae16fa0

File tree

7 files changed

+171
-4
lines changed

7 files changed

+171
-4
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## V1.10.0
4+
This release introduces the Savanna upgrade.
5+
6+
Fixes:
7+
* [#647] https://github.com/bnb-chain/greenfield/pull/647 fix: fail to resume frozen payment account when netflow is zero
8+
39
## V1.9.1
410
This release introduces the Altai upgrade.
511

app/upgrade.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func (app *App) RegisterUpgradeHandlers(chainID string, serverCfg *serverconfig.
3737
app.registerVeldUpgradeHandler()
3838
app.registerMongolianUpgradeHandler()
3939
app.registerAltaiUpgradeHandler()
40+
app.registerSavannaUpgradeHandler()
4041
// app.register...()
4142
// ...
4243
return nil
@@ -313,3 +314,19 @@ func (app *App) registerAltaiUpgradeHandler() {
313314
return nil
314315
})
315316
}
317+
318+
func (app *App) registerSavannaUpgradeHandler() {
319+
// Register the upgrade handler
320+
app.UpgradeKeeper.SetUpgradeHandler(upgradetypes.Savanna,
321+
func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
322+
app.Logger().Info("upgrade to ", plan.Name)
323+
return app.mm.RunMigrations(ctx, app.configurator, fromVM)
324+
})
325+
326+
// Register the upgrade initializer
327+
app.UpgradeKeeper.SetUpgradeInitializer(upgradetypes.Savanna,
328+
func() error {
329+
app.Logger().Info("Init Savanna upgrade")
330+
return nil
331+
})
332+
}

deployment/localup/localup.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ function generate_genesis() {
182182
echo -e '[[upgrade]]\nname = "Erdos"\nheight = 25\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml
183183
echo -e '[[upgrade]]\nname = "Veld"\nheight = 26\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml
184184
echo -e '[[upgrade]]\nname = "Mongolian"\nheight = 27\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml
185+
echo -e '[[upgrade]]\nname = "Savanna"\nheight = 28\ninfo = ""' >> ${workspace}/.local/validator${i}/config/app.toml
185186
done
186187

187188
# enable swagger API for validator0

e2e/tests/payment_test.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ func (s *PaymentTestSuite) TestDeposit_ActiveAccount() {
376376
Add(paymentAccountStreamRecordAfter.BufferBalance.Sub(paymentAccountStreamRecord.BufferBalance))
377377
s.Require().Equal(settledBalance.Add(paymentBalanceChange).Int64(), paymentAccountBNBNeeded.Int64())
378378
s.Require().Equal(paymentAccountBNBNeeded.MulRaw(3), settledBalance.Add(paymentAccountStreamRecordAfter.StaticBalance.Add(paymentAccountStreamRecordAfter.BufferBalance)))
379+
380+
_ = s.deleteBucket(user, bucketName)
379381
}
380382

381383
func (s *PaymentTestSuite) TestDeposit_FromBankAccount() {
@@ -2170,6 +2172,138 @@ func (s *PaymentTestSuite) TestDiscontinue_MultiBuckets() {
21702172
s.Require().True(streamRecordsAfter.User.LockBalance.IsZero())
21712173
}
21722174

2175+
func (s *PaymentTestSuite) TestDeposit_FrozenAccount_NetflowIsZero() {
2176+
defer s.revertParams()
2177+
2178+
ctx := context.Background()
2179+
sp := s.PickStorageProvider()
2180+
gvg, found := sp.GetFirstGlobalVirtualGroup()
2181+
s.Require().True(found)
2182+
queryFamilyResponse, err := s.Client.GlobalVirtualGroupFamily(ctx, &virtualgrouptypes.QueryGlobalVirtualGroupFamilyRequest{
2183+
FamilyId: gvg.FamilyId,
2184+
})
2185+
s.Require().NoError(err)
2186+
family := queryFamilyResponse.GlobalVirtualGroupFamily
2187+
user := s.GenAndChargeAccounts(1, 1000000)[0]
2188+
2189+
streamAddresses := []string{
2190+
user.GetAddr().String(),
2191+
family.VirtualPaymentAddress,
2192+
gvg.VirtualPaymentAddress,
2193+
paymenttypes.ValidatorTaxPoolAddress.String(),
2194+
}
2195+
2196+
// update params
2197+
params := s.queryParams()
2198+
params.VersionedParams.ReserveTime = 8
2199+
params.ForcedSettleTime = 5
2200+
s.updateParams(params)
2201+
2202+
// create bucket
2203+
bucketName := s.createBucket(sp, gvg, user, 0)
2204+
2205+
// create & seal objects
2206+
for i := 0; i < 2; i++ {
2207+
_, _, objectName1, objectId1, checksums1, _ := s.createObject(user, bucketName, false)
2208+
s.sealObject(sp, gvg, bucketName, objectName1, objectId1, checksums1)
2209+
queryHeadObjectRequest := storagetypes.QueryHeadObjectRequest{
2210+
BucketName: bucketName,
2211+
ObjectName: objectName1,
2212+
}
2213+
queryHeadObjectResponse, err := s.Client.HeadObject(ctx, &queryHeadObjectRequest)
2214+
s.Require().NoError(err)
2215+
s.Require().Equal(queryHeadObjectResponse.ObjectInfo.ObjectStatus, storagetypes.OBJECT_STATUS_SEALED)
2216+
time.Sleep(200 * time.Millisecond)
2217+
}
2218+
2219+
// transfer out all balance
2220+
queryBalanceRequest := banktypes.QueryBalanceRequest{Denom: s.Config.Denom, Address: user.GetAddr().String()}
2221+
queryBalanceResponse, err := s.Client.BankQueryClient.Balance(ctx, &queryBalanceRequest)
2222+
s.Require().NoError(err)
2223+
2224+
msgSend := banktypes.NewMsgSend(user.GetAddr(), core.GenRandomAddr(), sdk.NewCoins(
2225+
sdk.NewCoin(s.Config.Denom, queryBalanceResponse.Balance.Amount.SubRaw(5*types.DecimalGwei)),
2226+
))
2227+
2228+
simulateResponse := s.SimulateTx(msgSend, user)
2229+
gasLimit := simulateResponse.GasInfo.GetGasUsed()
2230+
gasPrice, err := sdk.ParseCoinNormalized(simulateResponse.GasInfo.GetMinGasPrice())
2231+
s.Require().NoError(err)
2232+
2233+
msgSend.Amount = sdk.NewCoins(
2234+
sdk.NewCoin(s.Config.Denom, queryBalanceResponse.Balance.Amount.Sub(gasPrice.Amount.Mul(sdk.NewInt(int64(gasLimit))))),
2235+
)
2236+
s.SendTxBlock(user, msgSend)
2237+
queryBalanceResponse, err = s.Client.BankQueryClient.Balance(ctx, &queryBalanceRequest)
2238+
s.Require().NoError(err)
2239+
s.Require().Equal(int64(0), queryBalanceResponse.Balance.Amount.Int64())
2240+
2241+
// wait account to be frozen
2242+
time.Sleep(8 * time.Second)
2243+
streamRecord := s.getStreamRecord(user.GetAddr().String())
2244+
s.Require().True(streamRecord.Status == paymenttypes.STREAM_ACCOUNT_STATUS_FROZEN)
2245+
s.Require().True(streamRecord.NetflowRate.IsZero())
2246+
s.Require().True(streamRecord.FrozenNetflowRate.IsNegative())
2247+
2248+
// force delete bucket
2249+
msgDiscontinueBucket := storagetypes.NewMsgDiscontinueBucket(sp.GcKey.GetAddr(), bucketName, "test")
2250+
txRes := s.SendTxBlock(sp.GcKey, msgDiscontinueBucket)
2251+
deleteAt := filterDiscontinueBucketEventFromTx(txRes).DeleteAt
2252+
2253+
for {
2254+
time.Sleep(200 * time.Millisecond)
2255+
statusRes, err := s.TmClient.TmClient.Status(context.Background())
2256+
s.Require().NoError(err)
2257+
blockTime := statusRes.SyncInfo.LatestBlockTime.Unix()
2258+
2259+
s.T().Logf("current blockTime: %d, delete blockTime: %d", blockTime, deleteAt)
2260+
2261+
if blockTime > deleteAt {
2262+
break
2263+
}
2264+
}
2265+
2266+
_, err = s.Client.HeadBucket(ctx, &storagetypes.QueryHeadBucketRequest{BucketName: bucketName})
2267+
s.Require().ErrorContains(err, "No such bucket")
2268+
streamRecordsAfter := s.getStreamRecords(streamAddresses)
2269+
s.Require().True(streamRecordsAfter.User.NetflowRate.IsZero())
2270+
s.Require().True(streamRecordsAfter.User.FrozenNetflowRate.IsZero())
2271+
s.Require().True(streamRecordsAfter.User.LockBalance.IsZero())
2272+
s.Require().True(streamRecordsAfter.User.StaticBalance.IsZero())
2273+
s.Require().True(streamRecordsAfter.User.BufferBalance.IsZero())
2274+
2275+
// deposit payment account
2276+
helper := s.GenAndChargeAccounts(1, 1000000)[0]
2277+
msgSend = banktypes.NewMsgSend(helper.GetAddr(), user.GetAddr(), sdk.NewCoins(
2278+
sdk.NewCoin(s.Config.Denom, sdk.NewInt(2e18)),
2279+
))
2280+
s.SendTxBlock(helper, msgSend)
2281+
_, err = s.Client.BankQueryClient.Balance(ctx, &queryBalanceRequest)
2282+
s.Require().NoError(err)
2283+
2284+
msgDeposit := &paymenttypes.MsgDeposit{
2285+
Creator: user.GetAddr().String(),
2286+
To: user.GetAddr().String(),
2287+
Amount: sdk.NewInt(1e18),
2288+
}
2289+
_ = s.SendTxBlock(user, msgDeposit)
2290+
streamRecordsAfter = s.getStreamRecords(streamAddresses)
2291+
s.Require().True(streamRecordsAfter.User.Status == paymenttypes.STREAM_ACCOUNT_STATUS_ACTIVE)
2292+
s.Require().True(streamRecordsAfter.User.StaticBalance.Equal(sdk.NewInt(1e18)))
2293+
s.Require().True(streamRecordsAfter.User.SettleTimestamp == 0)
2294+
2295+
// create bucket with quota again
2296+
bucketName = s.createBucket(sp, gvg, user, 100)
2297+
streamRecordsAfter = s.getStreamRecords(streamAddresses)
2298+
s.Require().True(streamRecordsAfter.User.StaticBalance.LT(sdk.NewInt(1e18)))
2299+
s.Require().True(streamRecordsAfter.User.BufferBalance.GT(sdk.NewInt(0)))
2300+
s.Require().True(streamRecordsAfter.User.SettleTimestamp > 0)
2301+
2302+
// delete bucket
2303+
err = s.deleteBucket(user, bucketName)
2304+
s.Require().Error(err)
2305+
}
2306+
21732307
func TestPaymentTestSuite(t *testing.T) {
21742308
suite.Run(t, new(PaymentTestSuite))
21752309
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ replace (
176176
github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-cometbft v1.3.0
177177
github.com/cometbft/cometbft-db => github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1
178178
github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0
179-
github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v1.9.2
179+
github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v1.10.0
180180
github.com/cosmos/iavl => github.com/bnb-chain/greenfield-iavl v0.20.1
181181
github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
182182
github.com/wercker/journalhook => github.com/wercker/journalhook v0.0.0-20230927020745-64542ffa4117

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ github.com/bnb-chain/greenfield-cometbft v1.3.0 h1:v3nZ16ledTZGF5Csys7fTQGZcEV78
163163
github.com/bnb-chain/greenfield-cometbft v1.3.0/go.mod h1:0D+VPivZTeBldjtGGi9LKbBnKEO/RtMRJikie92LkYI=
164164
github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1 h1:XcWulGacHVRiSCx90Q8Y//ajOrLNBQWR/KDB89dy3cU=
165165
github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1/go.mod h1:ey1CiK4bYo1RBNJLRiVbYr5CMdSxci9S/AZRINLtppI=
166-
github.com/bnb-chain/greenfield-cosmos-sdk v1.9.2 h1:hqZ4v4M3nkBNs1dXbAQkMBrNQuP9maQOSU+rBwzAemQ=
167-
github.com/bnb-chain/greenfield-cosmos-sdk v1.9.2/go.mod h1:2bwmwdXYBISnQoMwgAcZTVGt21lMsHZSeeeMByTvDlQ=
166+
github.com/bnb-chain/greenfield-cosmos-sdk v1.10.0 h1:uWmy80c8kvvvmUb50hgo2kX4QLcmvqs9J5tLvCgXnIs=
167+
github.com/bnb-chain/greenfield-cosmos-sdk v1.10.0/go.mod h1:2bwmwdXYBISnQoMwgAcZTVGt21lMsHZSeeeMByTvDlQ=
168168
github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230816082903-b48770f5e210 h1:GHPbV2bC+gmuO6/sG0Tm8oGal3KKSRlyE+zPscDjlA8=
169169
github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230816082903-b48770f5e210/go.mod h1:vhsZxXE9tYJeYB5JR4hPhd6Pc/uPf7j1T8IJ7p9FdeM=
170170
github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230816082903-b48770f5e210 h1:FLVOn4+OVbsKi2+YJX5kmD27/4dRu4FW7xCXFhzDO5s=

x/payment/keeper/stream_record.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,16 +380,25 @@ func (k Keeper) TryResumeStreamRecord(ctx sdk.Context, streamRecord *types.Strea
380380
reserveTime := params.VersionedParams.ReserveTime
381381
forcedSettleTime := params.ForcedSettleTime
382382

383+
now := ctx.BlockTime().Unix()
383384
totalRate := streamRecord.NetflowRate.Add(streamRecord.FrozenNetflowRate)
384385
streamRecord.StaticBalance = streamRecord.StaticBalance.Add(depositBalance)
386+
387+
if totalRate.IsZero() && ctx.IsUpgraded(upgradetypes.Savanna) {
388+
streamRecord.Status = types.STREAM_ACCOUNT_STATUS_ACTIVE
389+
streamRecord.CrudTimestamp = now
390+
streamRecord.SettleTimestamp = 0
391+
k.SetStreamRecord(ctx, streamRecord)
392+
return nil
393+
}
394+
385395
expectedBalanceToResume := totalRate.Neg().Mul(sdkmath.NewIntFromUint64(reserveTime))
386396
if streamRecord.StaticBalance.LT(expectedBalanceToResume) {
387397
// deposit balance is not enough to resume, only add static balance
388398
k.SetStreamRecord(ctx, streamRecord)
389399
return nil
390400
}
391401

392-
now := ctx.BlockTime().Unix()
393402
prevSettleTime := streamRecord.SettleTimestamp
394403
streamRecord.SettleTimestamp = now + streamRecord.StaticBalance.Quo(totalRate.Abs()).Int64() - int64(forcedSettleTime)
395404
streamRecord.BufferBalance = expectedBalanceToResume

0 commit comments

Comments
 (0)