@@ -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
381383func (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+
21732307func TestPaymentTestSuite (t * testing.T ) {
21742308 suite .Run (t , new (PaymentTestSuite ))
21752309}
0 commit comments