From 4eb01b21c8691e277ea9d4048038ede7f9621a82 Mon Sep 17 00:00:00 2001
From: Martin Holst Swende <martin@swende.se>
Date: Wed, 14 Oct 2020 11:59:11 +0200
Subject: [PATCH] miner: set etherbase even if mining isn't possible at the
 moment (#21707)

---
 miner/miner.go      |  2 +-
 miner/miner_test.go | 22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/miner/miner.go b/miner/miner.go
index 35c036ba7..20169f500 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -128,8 +128,8 @@ func (miner *Miner) update() {
 				events.Unsubscribe()
 			}
 		case addr := <-miner.startCh:
+			miner.SetEtherbase(addr)
 			if canStart {
-				miner.SetEtherbase(addr)
 				miner.worker.start()
 			}
 			shouldStart = true
diff --git a/miner/miner_test.go b/miner/miner_test.go
index 20bf2534c..43b31872a 100644
--- a/miner/miner_test.go
+++ b/miner/miner_test.go
@@ -192,6 +192,28 @@ func TestCloseMiner(t *testing.T) {
 	waitForMiningState(t, miner, false)
 }
 
+// TestMinerSetEtherbase checks that etherbase becomes set even if mining isn't
+// possible at the moment
+func TestMinerSetEtherbase(t *testing.T) {
+	miner, mux := createMiner(t)
+	// Start with a 'bad' mining address
+	miner.Start(common.HexToAddress("0xdead"))
+	waitForMiningState(t, miner, true)
+	// Start the downloader
+	mux.Post(downloader.StartEvent{})
+	waitForMiningState(t, miner, false)
+	// Now user tries to configure proper mining address
+	miner.Start(common.HexToAddress("0x1337"))
+	// Stop the downloader and wait for the update loop to run
+	mux.Post(downloader.DoneEvent{})
+
+	waitForMiningState(t, miner, true)
+	// The miner should now be using the good address
+	if got, exp := miner.coinbase, common.HexToAddress("0x1337"); got != exp {
+		t.Fatalf("Wrong coinbase, got %x expected %x", got, exp)
+	}
+}
+
 // waitForMiningState waits until either
 // * the desired mining state was reached
 // * a timeout was reached which fails the test
-- 
GitLab