From 669168d32a534c1054f9df659b3199f7b6da0d21 Mon Sep 17 00:00:00 2001
From: Determinant <ted.sybil@gmail.com>
Date: Thu, 15 Aug 2019 14:50:39 -0400
Subject: show wallet state in the example

---
 examples/payments/main.go | 170 ++++++++++++++++++++++++++--------------------
 1 file changed, 98 insertions(+), 72 deletions(-)

(limited to 'examples/payments')

diff --git a/examples/payments/main.go b/examples/payments/main.go
index ffb156c..1c0a18e 100644
--- a/examples/payments/main.go
+++ b/examples/payments/main.go
@@ -1,89 +1,115 @@
 package main
 
 import (
-    "time"
-    "os"
-    "os/signal"
-    "syscall"
-    "crypto/rand"
-    "math/big"
-    //"encoding/hex"
-    "github.com/ethereum/go-ethereum/core/types"
-    "github.com/ethereum/go-ethereum/common/hexutil"
-    "github.com/ethereum/go-ethereum/core"
-    "github.com/ava-labs/coreth/eth"
-    "github.com/ava-labs/coreth"
-    "github.com/ethereum/go-ethereum/params"
-    "github.com/ethereum/go-ethereum/common"
+	"crypto/rand"
+	"fmt"
+	"math/big"
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+	//"encoding/hex"
+	"github.com/ava-labs/coreth"
+	"github.com/ava-labs/coreth/eth"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/ethereum/go-ethereum/params"
 )
 
 func checkError(err error) {
-    if err != nil { panic(err) }
+	if err != nil {
+		panic(err)
+	}
 }
 
 func main() {
-    config := eth.DefaultConfig
-    chainConfig := &params.ChainConfig {
-        ChainID:             big.NewInt(1),
-        HomesteadBlock:      big.NewInt(0),
-        DAOForkBlock:        big.NewInt(0),
-        DAOForkSupport:      true,
-        EIP150Block:         big.NewInt(0),
-        EIP150Hash:          common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"),
-        EIP155Block:         big.NewInt(0),
-        EIP158Block:         big.NewInt(0),
-        ByzantiumBlock:      big.NewInt(0),
-        ConstantinopleBlock: big.NewInt(0),
-        PetersburgBlock:     big.NewInt(0),
-        IstanbulBlock:       nil,
-        Ethash:              nil,
-    }
+	// configure the chain
+	config := eth.DefaultConfig
+	chainConfig := &params.ChainConfig{
+		ChainID:             big.NewInt(1),
+		HomesteadBlock:      big.NewInt(0),
+		DAOForkBlock:        big.NewInt(0),
+		DAOForkSupport:      true,
+		EIP150Block:         big.NewInt(0),
+		EIP150Hash:          common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"),
+		EIP155Block:         big.NewInt(0),
+		EIP158Block:         big.NewInt(0),
+		ByzantiumBlock:      big.NewInt(0),
+		ConstantinopleBlock: big.NewInt(0),
+		PetersburgBlock:     big.NewInt(0),
+		IstanbulBlock:       nil,
+		Ethash:              nil,
+	}
 
-    genBalance := big.NewInt(100000000000000000)
-    genKey, _ := coreth.NewKey(rand.Reader)
+	// configure the genesis block
+	genBalance := big.NewInt(100000000000000000)
+	genKey, _ := coreth.NewKey(rand.Reader)
 
-    config.Genesis = &core.Genesis{
-        Config:     chainConfig,
-        Nonce:      0,
-        Number:     0,
-        ExtraData:  hexutil.MustDecode("0x00"),
-        GasLimit:   100000000,
-        Difficulty: big.NewInt(0),
-        Alloc: core.GenesisAlloc{ genKey.Address: { Balance: genBalance }},
-    }
+	config.Genesis = &core.Genesis{
+		Config:     chainConfig,
+		Nonce:      0,
+		Number:     0,
+		ExtraData:  hexutil.MustDecode("0x00"),
+		GasLimit:   100000000,
+		Difficulty: big.NewInt(0),
+		Alloc:      core.GenesisAlloc{genKey.Address: {Balance: genBalance}},
+	}
 
-    config.Miner.ManualMining = true
-    config.Miner.ManualUncle = true
+	// grab the control of block generation and disable auto uncle
+	config.Miner.ManualMining = true
+	config.Miner.ManualUncle = true
 
-    chainID := chainConfig.ChainID
-    nonce := uint64(0)
-    value := big.NewInt(1000000000000)
-    gasLimit := 21000
-    gasPrice := big.NewInt(1000000000)
-    bob, err := coreth.NewKey(rand.Reader); checkError(err)
+	// info required to generate a transaction
+	chainID := chainConfig.ChainID
+	nonce := uint64(0)
+	value := big.NewInt(1000000000000)
+	gasLimit := 21000
+	gasPrice := big.NewInt(1000000000)
+	bob, err := coreth.NewKey(rand.Reader)
+	checkError(err)
 
-    chain := coreth.NewETHChain(&config, nil)
-    chain.SetOnSeal(func(block *types.Block) {
-        go func() {
-            time.Sleep(1000 * time.Millisecond)
-            chain.GenBlock()
-        }()
-    })
-    chain.Start()
+	blockCount := 0
+	chain := coreth.NewETHChain(&config, nil)
+	showBalance := func() {
+		state, err := chain.CurrentState()
+		checkError(err)
+		log.Info(fmt.Sprintf("genesis balanche = %s", state.GetBalance(genKey.Address)))
+		log.Info(fmt.Sprintf("bob's balanche = %s", state.GetBalance(bob.Address)))
+	}
+	chain.SetOnSeal(func(block *types.Block) error {
+		go func() {
+			// the minimum time gap is 1s
+			time.Sleep(1000 * time.Millisecond)
+			// generate 15 blocks
+			blockCount++
+			if blockCount == 15 {
+				showBalance()
+				return
+			}
+			chain.GenBlock()
+		}()
+		return nil
+	})
 
-    chain.GenBlock()
-    for i := 0; i < 10; i++ {
-        tx := types.NewTransaction(nonce, bob.Address, value, uint64(gasLimit), gasPrice, nil)
-        signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), genKey.PrivateKey); checkError(err)
-        _ = signedTx
-        chain.AddRemoteTxs([]*types.Transaction{signedTx})
-        time.Sleep(1000 * time.Millisecond)
-        nonce++
-    }
+	// start the chain
+	chain.Start()
+	chain.GenBlock()
+	for i := 0; i < 10; i++ {
+		tx := types.NewTransaction(nonce, bob.Address, value, uint64(gasLimit), gasPrice, nil)
+		signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), genKey.PrivateKey)
+		checkError(err)
+		_ = signedTx
+		chain.AddRemoteTxs([]*types.Transaction{signedTx})
+		time.Sleep(1000 * time.Millisecond)
+		nonce++
+	}
 
-    c := make(chan os.Signal, 1)
-    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
-    signal.Notify(c, os.Interrupt, syscall.SIGINT)
-    <-c
-    chain.Stop()
+	c := make(chan os.Signal, 1)
+	signal.Notify(c, os.Interrupt, syscall.SIGTERM)
+	signal.Notify(c, os.Interrupt, syscall.SIGINT)
+	<-c
+	chain.Stop()
 }
-- 
cgit v1.2.3-70-g09d2