github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/builtin/verifreg/verified_registry_test.go (about)

     1  package verifreg_test
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/filecoin-project/go-address"
     8  	"github.com/filecoin-project/go-state-types/abi"
     9  	"github.com/filecoin-project/go-state-types/big"
    10  	"github.com/filecoin-project/go-state-types/exitcode"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/filecoin-project/specs-actors/v4/actors/builtin"
    15  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg"
    16  	"github.com/filecoin-project/specs-actors/v4/actors/util/adt"
    17  	"github.com/filecoin-project/specs-actors/v4/support/mock"
    18  	tutil "github.com/filecoin-project/specs-actors/v4/support/testing"
    19  )
    20  
    21  func TestExports(t *testing.T) {
    22  	mock.CheckActorExports(t, verifreg.Actor{})
    23  }
    24  
    25  func TestConstruction(t *testing.T) {
    26  	receiver := tutil.NewIDAddr(t, 100)
    27  
    28  	builder := mock.NewBuilder(receiver).
    29  		WithCaller(builtin.SystemActorAddr, builtin.InitActorCodeID)
    30  
    31  	t.Run("successful construction with root ID address", func(t *testing.T) {
    32  		rt := builder.Build(t)
    33  		raddr := tutil.NewIDAddr(t, 101)
    34  
    35  		actor := verifRegActorTestHarness{t: t, rootkey: raddr}
    36  		actor.constructAndVerify(rt)
    37  
    38  		emptyMap, err := adt.StoreEmptyMap(rt.AdtStore(), builtin.DefaultHamtBitwidth)
    39  		require.NoError(t, err)
    40  
    41  		state := actor.state(rt)
    42  		assert.Equal(t, emptyMap, state.VerifiedClients)
    43  		assert.Equal(t, emptyMap, state.Verifiers)
    44  		assert.Equal(t, raddr, state.RootKey)
    45  		actor.checkState(rt)
    46  	})
    47  
    48  	t.Run("non-ID address root is resolved to an ID address for construction", func(t *testing.T) {
    49  		rt := builder.Build(t)
    50  
    51  		raddr := tutil.NewBLSAddr(t, 101)
    52  		rootIdAddr := tutil.NewIDAddr(t, 201)
    53  		rt.AddIDAddress(raddr, rootIdAddr)
    54  
    55  		actor := verifRegActorTestHarness{t: t, rootkey: raddr}
    56  		actor.constructAndVerify(rt)
    57  
    58  		emptyMap, err := adt.StoreEmptyMap(rt.AdtStore(), builtin.DefaultHamtBitwidth)
    59  		require.NoError(t, err)
    60  
    61  		var state verifreg.State
    62  		rt.GetState(&state)
    63  		assert.Equal(t, emptyMap, state.VerifiedClients)
    64  		assert.Equal(t, emptyMap, state.Verifiers)
    65  		assert.Equal(t, rootIdAddr, state.RootKey)
    66  		actor.checkState(rt)
    67  	})
    68  
    69  	t.Run("fails if root cannot be resolved to an ID address", func(t *testing.T) {
    70  		rt := builder.Build(t)
    71  		actor := verifreg.Actor{}
    72  		rt.ExpectValidateCallerAddr(builtin.SystemActorAddr)
    73  
    74  		raddr := tutil.NewBLSAddr(t, 101)
    75  
    76  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
    77  			rt.Call(actor.Constructor, &raddr)
    78  		})
    79  		rt.Verify()
    80  	})
    81  }
    82  
    83  func TestAddVerifier(t *testing.T) {
    84  	root := tutil.NewIDAddr(t, 101)
    85  	va := tutil.NewIDAddr(t, 201)
    86  	allowance := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(42))
    87  
    88  	t.Run("fails when caller is not the root key", func(t *testing.T) {
    89  		rt, ac := basicVerifRegSetup(t, root)
    90  		verifier := mkVerifierParams(va, allowance)
    91  
    92  		rt.ExpectValidateCallerAddr(ac.rootkey)
    93  		rt.SetCaller(tutil.NewIDAddr(t, 501), builtin.VerifiedRegistryActorCodeID)
    94  		rt.ExpectAbort(exitcode.SysErrForbidden, func() {
    95  			rt.Call(ac.AddVerifier, verifier)
    96  		})
    97  		ac.checkState(rt)
    98  	})
    99  
   100  	t.Run("fails when allowance less than MinVerifiedDealSize", func(t *testing.T) {
   101  		rt, ac := basicVerifRegSetup(t, root)
   102  
   103  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   104  			ac.addVerifier(rt, va, big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1)))
   105  		})
   106  		ac.checkState(rt)
   107  	})
   108  
   109  	t.Run("fails when root is added as a verifier", func(t *testing.T) {
   110  		rt, ac := basicVerifRegSetup(t, root)
   111  
   112  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   113  			ac.addVerifier(rt, root, allowance)
   114  		})
   115  		ac.checkState(rt)
   116  	})
   117  
   118  	t.Run("fails when verified client is added as a verifier", func(t *testing.T) {
   119  		rt, ac := basicVerifRegSetup(t, root)
   120  
   121  		// add a verified client
   122  		verifierAddr := tutil.NewIDAddr(t, 601)
   123  		clientAddr := tutil.NewIDAddr(t, 602)
   124  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, allowance, allowance)
   125  
   126  		// now attempt to add verified client as a verifier -> should fail
   127  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   128  			ac.addVerifier(rt, clientAddr, allowance)
   129  		})
   130  		ac.checkState(rt)
   131  	})
   132  
   133  	t.Run("fails to add verifier with non-ID address if not resolvable to ID address", func(t *testing.T) {
   134  		rt, ac := basicVerifRegSetup(t, root)
   135  
   136  		verifierNonIdAddr := tutil.NewBLSAddr(t, 1)
   137  
   138  		rt.ExpectSend(verifierNonIdAddr, builtin.MethodSend, nil, abi.NewTokenAmount(0), nil, exitcode.Ok)
   139  
   140  		rt.ExpectAbort(exitcode.ErrIllegalState, func() {
   141  			ac.addNewVerifier(rt, verifierNonIdAddr, allowance)
   142  		})
   143  		ac.checkState(rt)
   144  	})
   145  
   146  	t.Run("successfully add a verifier", func(t *testing.T) {
   147  		rt, ac := basicVerifRegSetup(t, root)
   148  		ac.addNewVerifier(rt, va, allowance)
   149  		ac.checkState(rt)
   150  	})
   151  
   152  	t.Run("successfully add a verifier after resolving to ID address", func(t *testing.T) {
   153  		rt, ac := basicVerifRegSetup(t, root)
   154  
   155  		verifierIdAddr := tutil.NewIDAddr(t, 501)
   156  		verifierNonIdAddr := tutil.NewBLSAddr(t, 1)
   157  
   158  		rt.AddIDAddress(verifierNonIdAddr, verifierIdAddr)
   159  
   160  		ac.addNewVerifier(rt, verifierNonIdAddr, allowance)
   161  
   162  		dc := ac.getVerifierCap(rt, verifierIdAddr)
   163  		assert.EqualValues(t, allowance, dc)
   164  		ac.checkState(rt)
   165  	})
   166  }
   167  
   168  func TestRemoveVerifier(t *testing.T) {
   169  	root := tutil.NewIDAddr(t, 101)
   170  	va := tutil.NewIDAddr(t, 201)
   171  	allowance := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(42))
   172  
   173  	t.Run("fails when caller is not the root key", func(t *testing.T) {
   174  		rt, ac := basicVerifRegSetup(t, root)
   175  		// add a verifier
   176  		v := ac.addNewVerifier(rt, va, allowance)
   177  
   178  		rt.ExpectValidateCallerAddr(ac.rootkey)
   179  		rt.SetCaller(tutil.NewIDAddr(t, 501), builtin.VerifiedRegistryActorCodeID)
   180  		rt.ExpectAbort(exitcode.SysErrForbidden, func() {
   181  			rt.Call(ac.RemoveVerifier, &v.Address)
   182  		})
   183  		ac.checkState(rt)
   184  	})
   185  
   186  	t.Run("fails when verifier does not exist", func(t *testing.T) {
   187  		rt, ac := basicVerifRegSetup(t, root)
   188  
   189  		rt.ExpectValidateCallerAddr(ac.rootkey)
   190  		rt.SetCaller(ac.rootkey, builtin.VerifiedRegistryActorCodeID)
   191  		v := tutil.NewIDAddr(t, 501)
   192  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   193  			rt.Call(ac.RemoveVerifier, &v)
   194  		})
   195  		ac.checkState(rt)
   196  	})
   197  
   198  	t.Run("successfully remove a verifier", func(t *testing.T) {
   199  		rt, ac := basicVerifRegSetup(t, root)
   200  		ac.addNewVerifier(rt, va, allowance)
   201  
   202  		ac.removeVerifier(rt, va)
   203  		ac.checkState(rt)
   204  	})
   205  
   206  	t.Run("add verifier with non ID address and then remove with its ID address", func(t *testing.T) {
   207  		rt, ac := basicVerifRegSetup(t, root)
   208  
   209  		verifierIdAddr := tutil.NewIDAddr(t, 501)
   210  		verifierNonIdAddr := tutil.NewBLSAddr(t, 1)
   211  		rt.AddIDAddress(verifierNonIdAddr, verifierIdAddr)
   212  
   213  		// add using non-ID address
   214  		ac.addNewVerifier(rt, verifierNonIdAddr, allowance)
   215  
   216  		// remove using ID address
   217  		ac.removeVerifier(rt, verifierIdAddr)
   218  		ac.assertVerifierRemoved(rt, verifierIdAddr)
   219  		ac.checkState(rt)
   220  	})
   221  }
   222  
   223  func TestAddVerifiedClient(t *testing.T) {
   224  	root := tutil.NewIDAddr(t, 101)
   225  	clientAddr := tutil.NewIDAddr(t, 201)
   226  	clientAddr2 := tutil.NewIDAddr(t, 202)
   227  	clientAddr3 := tutil.NewIDAddr(t, 203)
   228  	clientAddr4 := tutil.NewIDAddr(t, 204)
   229  
   230  	verifierAddr := tutil.NewIDAddr(t, 301)
   231  	verifierAddr2 := tutil.NewIDAddr(t, 302)
   232  	allowance := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(42))
   233  	clientAllowance := big.Sub(allowance, big.NewInt(1))
   234  
   235  	t.Run("successfully add multiple verified clients from different verifiers", func(t *testing.T) {
   236  		rt, ac := basicVerifRegSetup(t, root)
   237  
   238  		c1 := mkClientParams(clientAddr, clientAllowance)
   239  		c2 := mkClientParams(clientAddr2, clientAllowance)
   240  		c3 := mkClientParams(clientAddr3, clientAllowance)
   241  		c4 := mkClientParams(clientAddr4, clientAllowance)
   242  
   243  		// verifier 1 should have enough allowance for both clients
   244  		verifier := mkVerifierParams(verifierAddr, allowance)
   245  		verifier.Allowance = big.Sum(c1.Allowance, c2.Allowance)
   246  		ac.addVerifier(rt, verifier.Address, verifier.Allowance)
   247  
   248  		// verifier 2 should have enough allowance for both clients
   249  		verifier2 := mkVerifierParams(verifierAddr2, allowance)
   250  		verifier2.Allowance = big.Sum(c3.Allowance, c4.Allowance)
   251  		ac.addVerifier(rt, verifier2.Address, verifier2.Allowance)
   252  
   253  		// add client 1 & 2
   254  		ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
   255  		ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance)
   256  
   257  		// add clients 3 & 4
   258  		ac.addVerifiedClient(rt, verifier2.Address, c3.Address, c3.Allowance)
   259  		ac.addVerifiedClient(rt, verifier2.Address, c4.Address, c4.Allowance)
   260  
   261  		// all clients should exist and verifiers should have no more allowance left
   262  		assert.EqualValues(t, c1.Allowance, ac.getClientCap(rt, c1.Address))
   263  		assert.EqualValues(t, c2.Allowance, ac.getClientCap(rt, c2.Address))
   264  		assert.EqualValues(t, c3.Allowance, ac.getClientCap(rt, c3.Address))
   265  		assert.EqualValues(t, c4.Allowance, ac.getClientCap(rt, c4.Address))
   266  
   267  		assert.EqualValues(t, big.Zero(), ac.getVerifierCap(rt, verifierAddr))
   268  		assert.EqualValues(t, big.Zero(), ac.getVerifierCap(rt, verifierAddr2))
   269  		ac.checkState(rt)
   270  	})
   271  
   272  	t.Run("verifier successfully adds a verified client and then fails on adding another verified client because of low allowance", func(t *testing.T) {
   273  		rt, ac := basicVerifRegSetup(t, root)
   274  
   275  		c1 := mkClientParams(clientAddr, clientAllowance)
   276  		c2 := mkClientParams(clientAddr2, clientAllowance)
   277  
   278  		// verifier only has enough balance for one client
   279  		verifier := mkVerifierParams(verifierAddr, allowance)
   280  		verifier.Allowance = c1.Allowance
   281  		ac.addVerifier(rt, verifier.Address, verifier.Allowance)
   282  
   283  		// add client 1 works
   284  		ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
   285  
   286  		// add client 2 fails
   287  		rt.SetCaller(verifier.Address, builtin.VerifiedRegistryActorCodeID)
   288  		rt.ExpectValidateCallerAny()
   289  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   290  			rt.Call(ac.AddVerifiedClient, c2)
   291  		})
   292  		rt.Verify()
   293  
   294  		// one client should exist and verifier should have no more allowance left
   295  		assert.EqualValues(t, c1.Allowance, ac.getClientCap(rt, c1.Address))
   296  		assert.EqualValues(t, big.Zero(), ac.getVerifierCap(rt, verifierAddr))
   297  		ac.checkState(rt)
   298  	})
   299  
   300  	t.Run("successfully add a verified client after resolving it's given non ID address to it's ID address", func(t *testing.T) {
   301  		rt, ac := basicVerifRegSetup(t, root)
   302  
   303  		clientIdAddr := tutil.NewIDAddr(t, 501)
   304  		clientNonIdAddr := tutil.NewBLSAddr(t, 1)
   305  		rt.AddIDAddress(clientNonIdAddr, clientIdAddr)
   306  
   307  		c1 := mkClientParams(clientNonIdAddr, clientAllowance)
   308  
   309  		verifier := mkVerifierParams(verifierAddr, allowance)
   310  		ac.addVerifier(rt, verifier.Address, verifier.Allowance)
   311  		ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
   312  
   313  		assert.EqualValues(t, clientAllowance, ac.getClientCap(rt, clientIdAddr))
   314  
   315  		// adding another verified client with the same ID address now fails
   316  		c2 := mkClientParams(clientIdAddr, clientAllowance)
   317  		verifier = mkVerifierParams(verifierAddr, allowance)
   318  		ac.addVerifier(rt, verifier.Address, verifier.Allowance)
   319  
   320  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   321  			ac.addVerifiedClient(rt, verifier.Address, c2.Address, c2.Allowance)
   322  		})
   323  		ac.checkState(rt)
   324  	})
   325  
   326  	t.Run("success when allowance is equal to MinVerifiedDealSize", func(t *testing.T) {
   327  		rt, ac := basicVerifRegSetup(t, root)
   328  
   329  		c1 := mkClientParams(clientAddr, verifreg.MinVerifiedDealSize)
   330  
   331  		// verifier only has enough balance for one client
   332  		verifier := mkVerifierParams(verifierAddr, verifreg.MinVerifiedDealSize)
   333  		ac.addVerifier(rt, verifier.Address, verifier.Allowance)
   334  
   335  		// add client works
   336  		ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
   337  		ac.checkState(rt)
   338  	})
   339  
   340  	t.Run("fails to add verified client if address is not resolvable to ID address", func(t *testing.T) {
   341  		rt, ac := basicVerifRegSetup(t, root)
   342  
   343  		clientNonIdAddr := tutil.NewBLSAddr(t, 1)
   344  		c1 := mkClientParams(clientNonIdAddr, clientAllowance)
   345  
   346  		verifier := mkVerifierParams(verifierAddr, allowance)
   347  		ac.addVerifier(rt, verifier.Address, verifier.Allowance)
   348  
   349  		rt.ExpectSend(clientNonIdAddr, builtin.MethodSend, nil, abi.NewTokenAmount(0), nil, exitcode.Ok)
   350  
   351  		rt.ExpectAbort(exitcode.ErrIllegalState, func() {
   352  			ac.addVerifiedClient(rt, verifier.Address, c1.Address, c1.Allowance)
   353  		})
   354  		ac.checkState(rt)
   355  	})
   356  
   357  	t.Run("fails when allowance is less than MinVerifiedDealSize", func(t *testing.T) {
   358  		rt, ac := basicVerifRegSetup(t, root)
   359  		allowance := big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1))
   360  		p := &verifreg.AddVerifiedClientParams{Address: tutil.NewIDAddr(t, 501), Allowance: allowance}
   361  
   362  		rt.ExpectValidateCallerAny()
   363  
   364  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   365  			rt.Call(ac.AddVerifiedClient, p)
   366  		})
   367  		ac.checkState(rt)
   368  	})
   369  
   370  	t.Run("fails when caller is not a verifier", func(t *testing.T) {
   371  		rt, ac := basicVerifRegSetup(t, root)
   372  		client := mkClientParams(clientAddr, clientAllowance)
   373  		ac.addNewVerifier(rt, verifierAddr, allowance)
   374  
   375  		nc := tutil.NewIDAddr(t, 209)
   376  		rt.SetCaller(nc, builtin.VerifiedRegistryActorCodeID)
   377  		rt.ExpectValidateCallerAny()
   378  
   379  		rt.ExpectAbort(exitcode.ErrNotFound, func() {
   380  			rt.Call(ac.AddVerifiedClient, client)
   381  		})
   382  		ac.checkState(rt)
   383  	})
   384  
   385  	t.Run("fails when verifier cap is less than client allowance", func(t *testing.T) {
   386  		rt, ac := basicVerifRegSetup(t, root)
   387  		verifier := ac.addNewVerifier(rt, verifierAddr, allowance)
   388  
   389  		rt.SetCaller(verifier.Address, builtin.VerifiedRegistryActorCodeID)
   390  		rt.ExpectValidateCallerAny()
   391  
   392  		client := mkClientParams(clientAddr, clientAllowance)
   393  		client.Allowance = big.Add(verifier.Allowance, big.NewInt(1))
   394  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   395  			rt.Call(ac.AddVerifiedClient, client)
   396  		})
   397  		ac.checkState(rt)
   398  	})
   399  
   400  	t.Run("fails when verified client already exists", func(t *testing.T) {
   401  		rt, ac := basicVerifRegSetup(t, root)
   402  
   403  		// add verified client with caller 1
   404  		verifier := ac.addNewVerifier(rt, verifierAddr, allowance)
   405  		client := mkClientParams(clientAddr, clientAllowance)
   406  		ac.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance)
   407  
   408  		// add verified client with caller 2
   409  		verifier2 := ac.addNewVerifier(rt, verifierAddr, allowance)
   410  		rt.SetCaller(verifier2.Address, builtin.VerifiedRegistryActorCodeID)
   411  		rt.ExpectValidateCallerAny()
   412  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   413  			rt.Call(ac.AddVerifiedClient, client)
   414  		})
   415  		ac.checkState(rt)
   416  	})
   417  
   418  	t.Run("fails when root is added as a verified client", func(t *testing.T) {
   419  		rt, ac := basicVerifRegSetup(t, root)
   420  
   421  		verifier := ac.addNewVerifier(rt, verifierAddr, allowance)
   422  		client := mkClientParams(root, clientAllowance)
   423  
   424  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   425  			ac.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance)
   426  		})
   427  		ac.checkState(rt)
   428  	})
   429  
   430  	t.Run("fails when verifier is added as a verified client", func(t *testing.T) {
   431  		rt, ac := basicVerifRegSetup(t, root)
   432  
   433  		// add verified client with caller 1
   434  		verifier := ac.addNewVerifier(rt, verifierAddr, allowance)
   435  		client := mkClientParams(verifierAddr, clientAllowance)
   436  		rt.SetCaller(verifier.Address, builtin.VerifiedRegistryActorCodeID)
   437  		rt.ExpectValidateCallerAny()
   438  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   439  			rt.Call(ac.AddVerifiedClient, client)
   440  		})
   441  		ac.checkState(rt)
   442  	})
   443  }
   444  
   445  func TestUseBytes(t *testing.T) {
   446  	root := tutil.NewIDAddr(t, 101)
   447  	clientAddr := tutil.NewIDAddr(t, 201)
   448  	clientAddr2 := tutil.NewIDAddr(t, 202)
   449  	clientAddr3 := tutil.NewIDAddr(t, 203)
   450  
   451  	verifierAddr := tutil.NewIDAddr(t, 301)
   452  	vallow := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(100))
   453  
   454  	t.Run("successfully consume deal bytes for deals from different verified clients", func(t *testing.T) {
   455  		rt, ac := basicVerifRegSetup(t, root)
   456  
   457  		ca1 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(3))
   458  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, ca1)
   459  
   460  		ca2 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(2))
   461  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr2, vallow, ca2)
   462  
   463  		ca3 := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(1))
   464  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr3, vallow, ca3)
   465  
   466  		dSize := verifreg.MinVerifiedDealSize
   467  		bal1 := big.Sub(ca1, dSize)
   468  		bal2 := big.Sub(ca2, dSize)
   469  		// client 1 uses bytes
   470  		ac.useBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1})
   471  		// client 2 uses bytes
   472  		ac.useBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2})
   473  		// client 3 uses bytes
   474  		ac.useBytes(rt, clientAddr3, dSize, &capExpectation{removed: true})
   475  
   476  		// verify
   477  		assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr))
   478  		assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2))
   479  		ac.assertClientRemoved(rt, clientAddr3)
   480  
   481  		// client 1 adds a deal and it works
   482  		bal1 = big.Sub(bal1, dSize)
   483  		ac.useBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1})
   484  		// client 2 adds a deal and it works
   485  		ac.useBytes(rt, clientAddr2, dSize, &capExpectation{removed: true})
   486  
   487  		// verify
   488  		assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr))
   489  		ac.assertClientRemoved(rt, clientAddr2)
   490  		ac.checkState(rt)
   491  	})
   492  
   493  	t.Run("successfully consume deal bytes for verified client and then fail on next attempt because it does NOT have enough allowance", func(t *testing.T) {
   494  		rt, ac := basicVerifRegSetup(t, root)
   495  		clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize, big.NewInt(1))
   496  
   497  		// add verified client
   498  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance)
   499  
   500  		// use bytes
   501  		dSize1 := verifreg.MinVerifiedDealSize
   502  		ac.useBytes(rt, clientAddr, dSize1, &capExpectation{expectedCap: big.Sub(clientAllowance, dSize1)})
   503  
   504  		// fails now because client does NOT have enough capacity for second deal
   505  		dSize2 := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(2))
   506  		param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2}
   507  
   508  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   509  			ac.useBytes(rt, param.Address, param.DealSize, nil)
   510  		})
   511  		ac.checkState(rt)
   512  	})
   513  
   514  	t.Run("successfully consume deal bytes after resolving verified client address", func(t *testing.T) {
   515  		rt, ac := basicVerifRegSetup(t, root)
   516  		clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize, big.NewInt(1))
   517  
   518  		clientIdAddr := tutil.NewIDAddr(t, 501)
   519  		clientNonIdAddr := tutil.NewBLSAddr(t, 502)
   520  		rt.AddIDAddress(clientNonIdAddr, clientIdAddr)
   521  
   522  		// add verified client
   523  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientIdAddr, vallow, clientAllowance)
   524  
   525  		// use bytes
   526  		dSize1 := verifreg.MinVerifiedDealSize
   527  		ac.useBytes(rt, clientNonIdAddr, dSize1, &capExpectation{expectedCap: big.Sub(clientAllowance, dSize1)})
   528  		ac.checkState(rt)
   529  	})
   530  
   531  	t.Run("successfully consume deal for verified client and then fail on next attempt because it has been removed", func(t *testing.T) {
   532  		rt, ac := basicVerifRegSetup(t, root)
   533  		clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, big.NewInt(1))
   534  
   535  		// add verified client
   536  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance)
   537  
   538  		// use bytes
   539  		dSize1 := verifreg.MinVerifiedDealSize
   540  		ac.useBytes(rt, clientAddr, dSize1, &capExpectation{removed: true})
   541  
   542  		// fails now because client has been removed
   543  		dSize2 := verifreg.MinVerifiedDealSize
   544  		param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2}
   545  
   546  		rt.ExpectAbort(exitcode.ErrNotFound, func() {
   547  			ac.useBytes(rt, param.Address, param.DealSize, nil)
   548  
   549  		})
   550  		ac.checkState(rt)
   551  	})
   552  
   553  	t.Run("fail if caller is not storage market actor", func(t *testing.T) {
   554  		rt, ac := basicVerifRegSetup(t, root)
   555  		rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr)
   556  		rt.SetCaller(builtin.StoragePowerActorAddr, builtin.StoragePowerActorCodeID)
   557  		param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: verifreg.MinVerifiedDealSize}
   558  
   559  		rt.ExpectAbort(exitcode.SysErrForbidden, func() {
   560  			rt.Call(ac.UseBytes, param)
   561  		})
   562  		ac.checkState(rt)
   563  	})
   564  
   565  	t.Run("fail if deal size is less than min verified deal size", func(t *testing.T) {
   566  		rt, ac := basicVerifRegSetup(t, root)
   567  		dSize2 := big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1))
   568  		param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2}
   569  
   570  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   571  			ac.useBytes(rt, param.Address, param.DealSize, nil)
   572  		})
   573  		ac.checkState(rt)
   574  	})
   575  
   576  	t.Run("fail if verified client does not exist", func(t *testing.T) {
   577  		rt, ac := basicVerifRegSetup(t, root)
   578  		dSize2 := verifreg.MinVerifiedDealSize
   579  		param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize2}
   580  
   581  		rt.ExpectAbort(exitcode.ErrNotFound, func() {
   582  			ac.useBytes(rt, param.Address, param.DealSize, nil)
   583  
   584  		})
   585  		ac.checkState(rt)
   586  	})
   587  
   588  	t.Run("fail if deal size is greater than verified client cap", func(t *testing.T) {
   589  		rt, ac := basicVerifRegSetup(t, root)
   590  		clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, big.NewInt(1))
   591  
   592  		// add verified client
   593  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance)
   594  
   595  		// use bytes
   596  		dSize := big.Add(clientAllowance, big.NewInt(1))
   597  		param := &verifreg.UseBytesParams{Address: clientAddr, DealSize: dSize}
   598  
   599  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   600  			ac.useBytes(rt, param.Address, param.DealSize, nil)
   601  		})
   602  		ac.checkState(rt)
   603  	})
   604  }
   605  
   606  func TestRestoreBytes(t *testing.T) {
   607  	root := tutil.NewIDAddr(t, 101)
   608  	clientAddr := tutil.NewIDAddr(t, 201)
   609  	clientAddr2 := tutil.NewIDAddr(t, 202)
   610  	clientAddr3 := tutil.NewIDAddr(t, 203)
   611  	verifierAddr := tutil.NewIDAddr(t, 301)
   612  	vallow := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(100))
   613  
   614  	t.Run("successfully restore deal bytes for different verified clients", func(t *testing.T) {
   615  		rt, ac := basicVerifRegSetup(t, root)
   616  
   617  		ca1 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(3))
   618  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, ca1)
   619  
   620  		ca2 := big.Mul(verifreg.MinVerifiedDealSize, big.NewInt(2))
   621  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr2, vallow, ca2)
   622  
   623  		ca3 := big.Add(verifreg.MinVerifiedDealSize, big.NewInt(1))
   624  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr3, vallow, ca3)
   625  
   626  		dSize := verifreg.MinVerifiedDealSize
   627  		bal1 := big.Add(ca1, dSize)
   628  		bal2 := big.Add(ca2, dSize)
   629  		bal3 := big.Add(ca3, dSize)
   630  
   631  		// client 1 restores bytes
   632  		ac.restoreBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1})
   633  		// client 2 restores bytes
   634  		ac.restoreBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2})
   635  		// client 3 restores bytes
   636  		ac.restoreBytes(rt, clientAddr3, dSize, &capExpectation{expectedCap: bal3})
   637  
   638  		// verify cap for all three clients
   639  		assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr))
   640  		assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2))
   641  		assert.EqualValues(t, bal3, ac.getClientCap(rt, clientAddr3))
   642  
   643  		bal1 = big.Sub(bal1, dSize)
   644  		bal2 = big.Sub(bal2, dSize)
   645  		// client1 and client2 use bytes
   646  		ac.useBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1})
   647  		ac.useBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2})
   648  
   649  		assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr))
   650  		assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2))
   651  		assert.EqualValues(t, bal3, ac.getClientCap(rt, clientAddr3))
   652  
   653  		bal1 = big.Add(bal1, dSize)
   654  		bal2 = big.Add(bal2, dSize)
   655  		bal3 = big.Add(bal3, dSize)
   656  		// restore bytes for client1, 2 and 3
   657  		ac.restoreBytes(rt, clientAddr, dSize, &capExpectation{expectedCap: bal1})
   658  		ac.restoreBytes(rt, clientAddr2, dSize, &capExpectation{expectedCap: bal2})
   659  		ac.restoreBytes(rt, clientAddr3, dSize, &capExpectation{expectedCap: bal3})
   660  		assert.EqualValues(t, bal1, ac.getClientCap(rt, clientAddr))
   661  		assert.EqualValues(t, bal2, ac.getClientCap(rt, clientAddr2))
   662  		assert.EqualValues(t, bal3, ac.getClientCap(rt, clientAddr3))
   663  		ac.checkState(rt)
   664  	})
   665  
   666  	t.Run("successfully restore bytes after using bytes reduces a client's cap", func(t *testing.T) {
   667  		rt, ac := basicVerifRegSetup(t, root)
   668  		clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize)
   669  
   670  		// add verified client -> use bytes
   671  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance)
   672  		dSize1 := verifreg.MinVerifiedDealSize
   673  		bal := big.Sub(clientAllowance, dSize1)
   674  		ac.useBytes(rt, clientAddr, dSize1, &capExpectation{expectedCap: bal})
   675  
   676  		sz := verifreg.MinVerifiedDealSize
   677  		ac.restoreBytes(rt, clientAddr, sz, &capExpectation{expectedCap: big.Add(bal, sz)})
   678  		ac.checkState(rt)
   679  	})
   680  
   681  	t.Run("successfully restore deal bytes after resolving client address", func(t *testing.T) {
   682  		rt, ac := basicVerifRegSetup(t, root)
   683  
   684  		clientIdAddr := tutil.NewIDAddr(t, 501)
   685  		clientNonIdAddr := tutil.NewBLSAddr(t, 502)
   686  		rt.AddIDAddress(clientNonIdAddr, clientIdAddr)
   687  
   688  		clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, verifreg.MinVerifiedDealSize)
   689  
   690  		// add verified client -> use bytes
   691  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientIdAddr, vallow, clientAllowance)
   692  		dSize1 := verifreg.MinVerifiedDealSize
   693  		bal := big.Sub(clientAllowance, dSize1)
   694  		ac.useBytes(rt, clientIdAddr, dSize1, &capExpectation{expectedCap: bal})
   695  
   696  		sz := verifreg.MinVerifiedDealSize
   697  		ac.restoreBytes(rt, clientNonIdAddr, sz, &capExpectation{expectedCap: big.Add(bal, sz)})
   698  
   699  		assert.EqualValues(t, big.Add(bal, sz), ac.getClientCap(rt, clientIdAddr))
   700  		ac.checkState(rt)
   701  	})
   702  
   703  	t.Run("successfully restore bytes after using bytes removes a client", func(t *testing.T) {
   704  		rt, ac := basicVerifRegSetup(t, root)
   705  		clientAllowance := big.Sum(verifreg.MinVerifiedDealSize, big.NewInt(1))
   706  
   707  		// add verified client -> use bytes -> client is removed
   708  		ac.generateAndAddVerifierAndVerifiedClient(rt, verifierAddr, clientAddr, vallow, clientAllowance)
   709  		dSize1 := verifreg.MinVerifiedDealSize
   710  		ac.useBytes(rt, clientAddr, dSize1, &capExpectation{removed: true})
   711  
   712  		sz := verifreg.MinVerifiedDealSize
   713  		ac.restoreBytes(rt, clientAddr, sz, &capExpectation{expectedCap: sz})
   714  		ac.checkState(rt)
   715  	})
   716  
   717  	t.Run("fail if caller is not storage market actor", func(t *testing.T) {
   718  		rt, ac := basicVerifRegSetup(t, root)
   719  		rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr)
   720  		rt.SetCaller(builtin.StoragePowerActorAddr, builtin.StoragePowerActorCodeID)
   721  		param := &verifreg.RestoreBytesParams{Address: clientAddr, DealSize: verifreg.MinVerifiedDealSize}
   722  
   723  		rt.ExpectAbort(exitcode.SysErrForbidden, func() {
   724  			rt.Call(ac.RestoreBytes, param)
   725  		})
   726  		ac.checkState(rt)
   727  	})
   728  
   729  	t.Run("fail if deal size is less than min verified deal size", func(t *testing.T) {
   730  		rt, ac := basicVerifRegSetup(t, root)
   731  		dSize2 := big.Sub(verifreg.MinVerifiedDealSize, big.NewInt(1))
   732  		rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr)
   733  		rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID)
   734  		param := &verifreg.RestoreBytesParams{Address: clientAddr, DealSize: dSize2}
   735  
   736  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   737  			rt.Call(ac.RestoreBytes, param)
   738  		})
   739  		ac.checkState(rt)
   740  	})
   741  
   742  	t.Run("fails if attempt to restore bytes for root", func(t *testing.T) {
   743  		rt, ac := basicVerifRegSetup(t, root)
   744  		rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr)
   745  		rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID)
   746  		param := &verifreg.RestoreBytesParams{Address: root, DealSize: verifreg.MinVerifiedDealSize}
   747  
   748  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   749  			rt.Call(ac.RestoreBytes, param)
   750  		})
   751  		ac.checkState(rt)
   752  	})
   753  
   754  	t.Run("fails if attempt to restore bytes for verifier", func(t *testing.T) {
   755  		rt, ac := basicVerifRegSetup(t, root)
   756  		// add a verifier
   757  		ac.addNewVerifier(rt, verifierAddr, vallow)
   758  
   759  		rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr)
   760  		rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID)
   761  		param := &verifreg.RestoreBytesParams{Address: verifierAddr, DealSize: verifreg.MinVerifiedDealSize}
   762  
   763  		rt.ExpectAbort(exitcode.ErrIllegalArgument, func() {
   764  			rt.Call(ac.RestoreBytes, param)
   765  		})
   766  		ac.checkState(rt)
   767  	})
   768  }
   769  
   770  type verifRegActorTestHarness struct {
   771  	rootkey address.Address
   772  	verifreg.Actor
   773  	t testing.TB
   774  }
   775  
   776  func basicVerifRegSetup(t *testing.T, root address.Address) (*mock.Runtime, *verifRegActorTestHarness) {
   777  	builder := mock.NewBuilder(builtin.StorageMarketActorAddr).
   778  		WithCaller(builtin.SystemActorAddr, builtin.InitActorCodeID).
   779  		WithActorType(root, builtin.VerifiedRegistryActorCodeID)
   780  
   781  	rt := builder.Build(t)
   782  
   783  	actor := verifRegActorTestHarness{t: t, rootkey: root}
   784  	actor.constructAndVerify(rt)
   785  
   786  	return rt, &actor
   787  }
   788  
   789  func (h *verifRegActorTestHarness) constructAndVerify(rt *mock.Runtime) {
   790  	rt.ExpectValidateCallerAddr(builtin.SystemActorAddr)
   791  	ret := rt.Call(h.Constructor, &h.rootkey)
   792  	require.Nil(h.t, ret)
   793  	rt.Verify()
   794  }
   795  
   796  func (h *verifRegActorTestHarness) state(rt *mock.Runtime) *verifreg.State {
   797  	var st verifreg.State
   798  	rt.GetState(&st)
   799  	return &st
   800  }
   801  
   802  func (h *verifRegActorTestHarness) checkState(rt *mock.Runtime) {
   803  	st := h.state(rt)
   804  	_, msgs := verifreg.CheckStateInvariants(st, rt.AdtStore())
   805  	assert.True(h.t, msgs.IsEmpty(), strings.Join(msgs.Messages(), "\n"))
   806  }
   807  
   808  func (h *verifRegActorTestHarness) addNewVerifier(rt *mock.Runtime, a address.Address, allowance verifreg.DataCap) *verifreg.AddVerifierParams {
   809  	v := mkVerifierParams(a, allowance)
   810  	h.addVerifier(rt, v.Address, v.Allowance)
   811  	return v
   812  }
   813  
   814  func (h *verifRegActorTestHarness) generateAndAddVerifierAndVerifiedClient(rt *mock.Runtime, verifierAddr address.Address, clientAddr address.Address,
   815  	verifierAllowance verifreg.DataCap, clientAllowance verifreg.DataCap) {
   816  
   817  	// add verifier with greater allowance than client
   818  	verifier := mkVerifierParams(verifierAddr, verifierAllowance)
   819  	verifier.Allowance = big.Add(verifier.Allowance, clientAllowance)
   820  	h.addVerifier(rt, verifier.Address, verifier.Allowance)
   821  
   822  	// add client
   823  	client := mkClientParams(clientAddr, clientAllowance)
   824  	client.Allowance = clientAllowance
   825  	h.addVerifiedClient(rt, verifier.Address, client.Address, client.Allowance)
   826  }
   827  
   828  func (h *verifRegActorTestHarness) addVerifiedClient(rt *mock.Runtime, verifier, client address.Address, allowance verifreg.DataCap) {
   829  	rt.SetCaller(verifier, builtin.VerifiedRegistryActorCodeID)
   830  	rt.ExpectValidateCallerAny()
   831  
   832  	params := &verifreg.AddVerifiedClientParams{Address: client, Allowance: allowance}
   833  	rt.Call(h.AddVerifiedClient, params)
   834  	rt.Verify()
   835  
   836  	clientIdAddr, found := rt.GetIdAddr(client)
   837  	require.True(h.t, found)
   838  	assert.EqualValues(h.t, allowance, h.getClientCap(rt, clientIdAddr))
   839  }
   840  
   841  func (h *verifRegActorTestHarness) addVerifier(rt *mock.Runtime, verifier address.Address, datacap verifreg.DataCap) {
   842  	param := verifreg.AddVerifierParams{Address: verifier, Allowance: datacap}
   843  
   844  	rt.ExpectValidateCallerAddr(h.rootkey)
   845  
   846  	rt.SetCaller(h.rootkey, builtin.VerifiedRegistryActorCodeID)
   847  	ret := rt.Call(h.AddVerifier, &param)
   848  	rt.Verify()
   849  
   850  	verifierIdAddr, found := rt.GetIdAddr(verifier)
   851  	require.True(h.t, found)
   852  	assert.Nil(h.t, ret)
   853  	assert.EqualValues(h.t, datacap, h.getVerifierCap(rt, verifierIdAddr))
   854  }
   855  
   856  func (h *verifRegActorTestHarness) removeVerifier(rt *mock.Runtime, verifier address.Address) {
   857  	rt.ExpectValidateCallerAddr(h.rootkey)
   858  
   859  	rt.SetCaller(h.rootkey, builtin.VerifiedRegistryActorCodeID)
   860  	ret := rt.Call(h.RemoveVerifier, &verifier)
   861  	rt.Verify()
   862  
   863  	require.Nil(h.t, ret)
   864  	h.assertVerifierRemoved(rt, verifier)
   865  }
   866  
   867  type capExpectation struct {
   868  	expectedCap verifreg.DataCap
   869  	removed     bool
   870  }
   871  
   872  func (h *verifRegActorTestHarness) useBytes(rt *mock.Runtime, a address.Address, dealSize verifreg.DataCap, expectedCap *capExpectation) {
   873  	rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr)
   874  	rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID)
   875  
   876  	param := &verifreg.UseBytesParams{Address: a, DealSize: dealSize}
   877  
   878  	ret := rt.Call(h.UseBytes, param)
   879  	rt.Verify()
   880  	assert.Nil(h.t, ret)
   881  
   882  	clientIdAddr, found := rt.GetIdAddr(a)
   883  	require.True(h.t, found)
   884  
   885  	// assert client cap now
   886  	if expectedCap.removed {
   887  		h.assertClientRemoved(rt, clientIdAddr)
   888  	} else {
   889  		assert.EqualValues(h.t, expectedCap.expectedCap, h.getClientCap(rt, clientIdAddr))
   890  	}
   891  }
   892  
   893  func (h *verifRegActorTestHarness) restoreBytes(rt *mock.Runtime, a address.Address, dealSize verifreg.DataCap, expectedCap *capExpectation) {
   894  	rt.ExpectValidateCallerAddr(builtin.StorageMarketActorAddr)
   895  	rt.SetCaller(builtin.StorageMarketActorAddr, builtin.StorageMinerActorCodeID)
   896  
   897  	// call RestoreBytes
   898  	param := &verifreg.RestoreBytesParams{Address: a, DealSize: dealSize}
   899  	ret := rt.Call(h.RestoreBytes, param)
   900  	rt.Verify()
   901  	assert.Nil(h.t, ret)
   902  
   903  	clientIdAddr, found := rt.GetIdAddr(a)
   904  	require.True(h.t, found)
   905  
   906  	// assert client cap now
   907  	assert.EqualValues(h.t, expectedCap.expectedCap, h.getClientCap(rt, clientIdAddr))
   908  }
   909  
   910  func (h *verifRegActorTestHarness) getVerifierCap(rt *mock.Runtime, a address.Address) verifreg.DataCap {
   911  	var st verifreg.State
   912  	rt.GetState(&st)
   913  
   914  	v, err := adt.AsMap(adt.AsStore(rt), st.Verifiers, builtin.DefaultHamtBitwidth)
   915  	require.NoError(h.t, err)
   916  
   917  	var dc verifreg.DataCap
   918  	found, err := v.Get(abi.AddrKey(a), &dc)
   919  	require.NoError(h.t, err)
   920  	require.True(h.t, found)
   921  	return dc
   922  }
   923  
   924  func (h *verifRegActorTestHarness) getClientCap(rt *mock.Runtime, a address.Address) verifreg.DataCap {
   925  	var st verifreg.State
   926  	rt.GetState(&st)
   927  
   928  	v, err := adt.AsMap(adt.AsStore(rt), st.VerifiedClients, builtin.DefaultHamtBitwidth)
   929  	require.NoError(h.t, err)
   930  
   931  	var dc verifreg.DataCap
   932  	found, err := v.Get(abi.AddrKey(a), &dc)
   933  	require.NoError(h.t, err)
   934  	require.True(h.t, found)
   935  	return dc
   936  }
   937  
   938  func (h *verifRegActorTestHarness) assertVerifierRemoved(rt *mock.Runtime, a address.Address) {
   939  	var st verifreg.State
   940  	rt.GetState(&st)
   941  
   942  	v, err := adt.AsMap(adt.AsStore(rt), st.Verifiers, builtin.DefaultHamtBitwidth)
   943  	require.NoError(h.t, err)
   944  
   945  	var dc verifreg.DataCap
   946  	found, err := v.Get(abi.AddrKey(a), &dc)
   947  	require.NoError(h.t, err)
   948  	assert.False(h.t, found)
   949  }
   950  
   951  func (h *verifRegActorTestHarness) assertClientRemoved(rt *mock.Runtime, a address.Address) {
   952  	var st verifreg.State
   953  	rt.GetState(&st)
   954  
   955  	v, err := adt.AsMap(adt.AsStore(rt), st.VerifiedClients, builtin.DefaultHamtBitwidth)
   956  	require.NoError(h.t, err)
   957  
   958  	var dc verifreg.DataCap
   959  	found, err := v.Get(abi.AddrKey(a), &dc)
   960  	require.NoError(h.t, err)
   961  	assert.False(h.t, found)
   962  }
   963  
   964  func mkVerifierParams(a address.Address, allowance verifreg.DataCap) *verifreg.AddVerifierParams {
   965  	return &verifreg.AddVerifierParams{Address: a, Allowance: allowance}
   966  }
   967  
   968  func mkClientParams(a address.Address, cap verifreg.DataCap) *verifreg.AddVerifiedClientParams {
   969  	return &verifreg.AddVerifiedClientParams{Address: a, Allowance: cap}
   970  }