2022-10-05 18:43:16 +00:00
// stm: #integration
package itests
import (
"bytes"
"context"
"fmt"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
2022-10-05 22:45:43 +00:00
migration "github.com/filecoin-project/go-state-types/builtin/v9/migration/test"
2022-10-05 18:43:16 +00:00
verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/go-state-types/crypto"
"github.com/filecoin-project/go-state-types/exitcode"
lapi "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
"github.com/filecoin-project/lotus/chain/actors/builtin/verifreg"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet/key"
"github.com/filecoin-project/lotus/itests/kit"
"github.com/filecoin-project/lotus/node/impl"
)
func TestGetAllocationForPendingDeal ( t * testing . T ) {
ctx := context . Background ( )
rootKey , err := key . GenerateKey ( types . KTSecp256k1 )
require . NoError ( t , err )
verifierKey , err := key . GenerateKey ( types . KTSecp256k1 )
require . NoError ( t , err )
verifiedClientKey , err := key . GenerateKey ( types . KTBLS )
require . NoError ( t , err )
bal , err := types . ParseFIL ( "100fil" )
require . NoError ( t , err )
node , miner , ens := kit . EnsembleMinimal ( t , kit . MockProofs ( ) ,
kit . RootVerifier ( rootKey , abi . NewTokenAmount ( bal . Int64 ( ) ) ) ,
kit . Account ( verifierKey , abi . NewTokenAmount ( bal . Int64 ( ) ) ) , // assign some balance to the verifier so they can send an AddClient message.
kit . Account ( verifiedClientKey , abi . NewTokenAmount ( bal . Int64 ( ) ) ) ,
)
ens . InterconnectAll ( ) . BeginMining ( 250 * time . Millisecond )
api := node . FullNode . ( * impl . FullNodeAPI )
ctx , cancel := context . WithCancel ( context . Background ( ) )
defer cancel ( )
// get VRH
//stm: @CHAIN_STATE_VERIFIED_REGISTRY_ROOT_KEY_001
vrh , err := api . StateVerifiedRegistryRootKey ( ctx , types . TipSetKey { } )
fmt . Println ( vrh . String ( ) )
require . NoError ( t , err )
// import the root key.
rootAddr , err := api . WalletImport ( ctx , & rootKey . KeyInfo )
require . NoError ( t , err )
// import the verifier's key.
verifierAddr , err := api . WalletImport ( ctx , & verifierKey . KeyInfo )
require . NoError ( t , err )
// import the verified client's key.
verifiedClientAddr , err := api . WalletImport ( ctx , & verifiedClientKey . KeyInfo )
require . NoError ( t , err )
params , err := actors . SerializeParams ( & verifregtypes . AddVerifierParams { Address : verifierAddr , Allowance : big . NewInt ( 100000000000 ) } )
require . NoError ( t , err )
msg := & types . Message {
From : rootAddr ,
To : verifreg . Address ,
Method : verifreg . Methods . AddVerifier ,
Params : params ,
Value : big . Zero ( ) ,
}
sm , err := api . MpoolPushMessage ( ctx , msg , nil )
require . NoError ( t , err , "AddVerifier failed" )
//stm: @CHAIN_STATE_WAIT_MSG_001
res , err := api . StateWaitMsg ( ctx , sm . Cid ( ) , 1 , lapi . LookbackNoLimit , true )
require . NoError ( t , err )
require . EqualValues ( t , 0 , res . Receipt . ExitCode )
// assign datacap to a client
datacap := big . NewInt ( 10000 )
params , err = actors . SerializeParams ( & verifregtypes . AddVerifiedClientParams { Address : verifiedClientAddr , Allowance : datacap } )
require . NoError ( t , err )
msg = & types . Message {
From : verifierAddr ,
To : verifreg . Address ,
Method : verifreg . Methods . AddVerifiedClient ,
Params : params ,
Value : big . Zero ( ) ,
}
sm , err = api . MpoolPushMessage ( ctx , msg , nil )
require . NoError ( t , err )
//stm: @CHAIN_STATE_WAIT_MSG_001
res , err = api . StateWaitMsg ( ctx , sm . Cid ( ) , 1 , lapi . LookbackNoLimit , true )
require . NoError ( t , err )
require . EqualValues ( t , 0 , res . Receipt . ExitCode )
// check datacap balance
//stm: @CHAIN_STATE_VERIFIED_CLIENT_STATUS_001
dcap , err := api . StateVerifiedClientStatus ( ctx , verifiedClientAddr , types . EmptyTSK )
require . NoError ( t , err )
require . Equal ( t , * dcap , datacap )
2022-10-05 22:45:43 +00:00
pieceCid := migration . MakeCID ( "1" , & markettypes . PieceCIDPrefix )
2022-10-05 18:43:16 +00:00
label , err := markettypes . NewLabelFromString ( "" )
require . NoError ( t , err )
dealProposal := markettypes . DealProposal {
2022-10-05 22:45:43 +00:00
PieceCID : pieceCid ,
PieceSize : 1024 ,
2022-10-05 18:43:16 +00:00
Client : verifiedClientAddr ,
Provider : miner . ActorAddr ,
Label : label ,
StartEpoch : abi . ChainEpoch ( 1000_000 ) ,
EndEpoch : abi . ChainEpoch ( 2000_000 ) ,
StoragePricePerEpoch : big . Zero ( ) ,
ProviderCollateral : big . Zero ( ) ,
ClientCollateral : big . Zero ( ) ,
VerifiedDeal : true ,
}
serializedProposal := new ( bytes . Buffer )
err = dealProposal . MarshalCBOR ( serializedProposal )
require . NoError ( t , err )
sig , err := api . WalletSign ( ctx , verifiedClientAddr , serializedProposal . Bytes ( ) )
publishDealParams := markettypes . PublishStorageDealsParams {
Deals : [ ] markettypes . ClientDealProposal { {
Proposal : dealProposal ,
ClientSignature : crypto . Signature {
Type : crypto . SigTypeBLS ,
Data : sig . Data ,
} ,
} } ,
}
serializedParams := new ( bytes . Buffer )
require . NoError ( t , publishDealParams . MarshalCBOR ( serializedParams ) )
m , err := node . MpoolPushMessage ( ctx , & types . Message {
To : builtin . StorageMarketActorAddr ,
From : miner . OwnerKey . Address ,
Value : types . FromFil ( 0 ) ,
Method : builtin . MethodsMarket . PublishStorageDeals ,
Params : serializedParams . Bytes ( ) ,
} , nil )
require . NoError ( t , err )
r , err := node . StateWaitMsg ( ctx , m . Cid ( ) , 2 , lapi . LookbackNoLimit , true )
require . NoError ( t , err )
require . Equal ( t , exitcode . Ok , r . Receipt . ExitCode )
ret , err := market . DecodePublishStorageDealsReturn ( r . Receipt . Return , build . TestNetworkVersion )
require . NoError ( t , err )
valid , _ , err := ret . IsDealValid ( 0 )
require . NoError ( t , err )
require . True ( t , valid )
dealIds , err := ret . DealIDs ( )
require . NoError ( t , err )
dealInfo , err := api . StateMarketStorageDeal ( ctx , dealIds [ 0 ] , types . EmptyTSK )
require . NoError ( t , err )
require . Equal ( t , verifregtypes . AllocationId ( 0 ) , dealInfo . State . VerifiedClaim ) // Allocation in State should not be set yet, because it's in the allocation map
allocation , err := api . StateGetAllocationForPendingDeal ( ctx , dealIds [ 0 ] , types . EmptyTSK )
require . NoError ( t , err )
require . Equal ( t , dealProposal . PieceCID , allocation . Data )
2022-10-05 22:45:43 +00:00
allocations , err := api . StateGetAllocations ( ctx , verifiedClientAddr , types . EmptyTSK )
require . NoError ( t , err )
for _ , alloc := range allocations {
require . Equal ( t , alloc , * allocation )
}
2022-10-05 18:43:16 +00:00
}