diff --git a/sharding/client/client.go b/sharding/client/client.go index 7affcfb47c26..0ff634c38ce3 100644 --- a/sharding/client/client.go +++ b/sharding/client/client.go @@ -47,7 +47,7 @@ type shardingClient struct { type Client interface { Start() error Close() - CreateTXOps(*big.Int) (*bind.TransactOpts, error) + CreateTXOpts(*big.Int) (*bind.TransactOpts, error) ChainReader() ethereum.ChainReader Account() *accounts.Account SMCCaller() *contracts.SMCCaller @@ -145,8 +145,8 @@ func (c *shardingClient) unlockAccount(account accounts.Account) error { return c.keystore.Unlock(account, pass) } -// CreateTXOps creates a *TransactOpts with a signer using the default account on the keystore. -func (c *shardingClient) CreateTXOps(value *big.Int) (*bind.TransactOpts, error) { +// CreateTXOpts creates a *TransactOpts with a signer using the default account on the keystore. +func (c *shardingClient) CreateTXOpts(value *big.Int) (*bind.TransactOpts, error) { account := c.Account() return &bind.TransactOpts{ @@ -210,7 +210,7 @@ func initSMC(c *shardingClient) (*contracts.SMC, error) { if len(b) == 0 { log.Info(fmt.Sprintf("No sharding manager contract found at %s. Deploying new contract.", sharding.ShardingManagerAddress.String())) - txOps, err := c.CreateTXOps(big.NewInt(0)) + txOps, err := c.CreateTXOpts(big.NewInt(0)) if err != nil { return nil, fmt.Errorf("unable to intiate the transaction: %v", err) } diff --git a/sharding/collator/collator.go b/sharding/collator/collator.go index 7b3eeba6f78d..1d25315a3156 100644 --- a/sharding/collator/collator.go +++ b/sharding/collator/collator.go @@ -123,11 +123,11 @@ func submitCollation(shardID int64) error { } // joinCollatorPool checks if the account is a collator in the SMC. If -// the account is not in the set, it will deposit 100ETH into contract. +// the account is not in the set, it will deposit ETH into contract. func joinCollatorPool(c client.Client) error { log.Info("Joining collator pool") - txOps, err := c.CreateTXOps(sharding.CollatorDeposit) + txOps, err := c.CreateTXOpts(sharding.CollatorDeposit) if err != nil { return fmt.Errorf("unable to intiate the deposit transaction: %v", err) } diff --git a/sharding/collator/collator_test.go b/sharding/collator/collator_test.go index 773fe15d7eb7..5dea4827b000 100644 --- a/sharding/collator/collator_test.go +++ b/sharding/collator/collator_test.go @@ -43,9 +43,10 @@ func (m *mockClient) SMCTransactor() *contracts.SMCTransactor { return &m.smc.SMCTransactor } -func (m *mockClient) CreateTXOps(value *big.Int) (*bind.TransactOpts, error) { - m.t.Fatal("CreateTXOps not implemented") - return nil, nil +func (m *mockClient) CreateTXOpts(value *big.Int) (*bind.TransactOpts, error) { + txOpts := transactOpts() + txOpts.Value = value + return txOpts, nil } // Unused mockClient methods @@ -57,13 +58,21 @@ func (m *mockClient) Close() { m.t.Fatal("Close called") } -func TestIsAccountInCollatorPool(t *testing.T) { - // Test setup (should this go to sharding/client/testing?) +// Helper/setup methods +// TODO: consider moving these to common sharding testing package as the collator and smc tests +// use them. +func transactOpts() *bind.TransactOpts { + return bind.NewKeyedTransactor(key) +} +func setup() (*backends.SimulatedBackend, *contracts.SMC) { backend := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: accountBalance1001Eth}}) - transactOpts := bind.NewKeyedTransactor(key) - _, _, smc, _ := contracts.DeploySMC(transactOpts, backend) + _, _, smc, _ := contracts.DeploySMC(transactOpts(), backend) backend.Commit() + return backend, smc +} +func TestIsAccountInCollatorPool(t *testing.T) { + backend, smc := setup() client := &mockClient{smc: smc, t: t} // address should not be in pool initially @@ -75,9 +84,10 @@ func TestIsAccountInCollatorPool(t *testing.T) { t.Fatal("Account unexpectedly in collator pool") } + txOpts := transactOpts() // deposit in collator pool, then it should return true - transactOpts.Value = sharding.CollatorDeposit - if _, err := smc.Deposit(transactOpts); err != nil { + txOpts.Value = sharding.CollatorDeposit + if _, err := smc.Deposit(txOpts); err != nil { t.Fatalf("Failed to deposit: %v", err) } backend.Commit() @@ -89,3 +99,32 @@ func TestIsAccountInCollatorPool(t *testing.T) { t.Fatal("Account not in collator pool when expected to be") } } + +func TestJoinCollatorPool(t *testing.T) { + backend, smc := setup() + client := &mockClient{smc, t} + + // There should be no collators initially + numCollators, err := smc.NumCollators(&bind.CallOpts{}) + if err != nil { + t.Fatal(err) + } + if big.NewInt(0).Cmp(numCollators) != 0 { + t.Fatalf("Unexpected number of collators. Got %d, wanted 0.", numCollators) + } + + err = joinCollatorPool(client) + if err != nil { + t.Fatal(err) + } + backend.Commit() + + // Now there should be one collator + numCollators, err = smc.NumCollators(&bind.CallOpts{}) + if err != nil { + t.Fatal(err) + } + if big.NewInt(1).Cmp(numCollators) != 0 { + t.Fatalf("Unexpected number of collators. Got %d, wanted 1.", numCollators) + } +}