Skip to content
This repository has been archived by the owner on Apr 4, 2022. It is now read-only.

Commit

Permalink
Change chain_id to 24484. Resolves #1
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszmatczak committed Feb 12, 2019
1 parent 30f4a1f commit 3d2066d
Show file tree
Hide file tree
Showing 9 changed files with 115 additions and 51 deletions.
3 changes: 2 additions & 1 deletion cmd/webchaind/log_display_dash.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ package main

import (
"fmt"
"math/big"
"time"

"github.com/webchain-network/webchaind/core"
Expand Down Expand Up @@ -95,7 +96,7 @@ func tuiDrawDash(e *eth.Ethereum) {
}
if e != nil && e.IsListening() {
cb := e.BlockChain().GetBlockByNumber(currentBlockNumber)
cid := e.ChainConfig().GetChainID()
cid := e.ChainConfig().GetChainID(new(big.Int).SetUint64(currentBlockNumber))
cnet := e.NetVersion()
cname := ""
if id := core.GetCacheChainIdentity(); id != "" {
Expand Down
117 changes: 79 additions & 38 deletions core/assets/assets.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,46 +224,87 @@ func init() {
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x62, 0x61, 0x64, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20,
0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22,
0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x22, 0x3a, 0x20,
0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65,
0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x2f, 0x2f, 0x63, 0x36, 0x65, 0x63, 0x39,
0x61, 0x66, 0x35, 0x30, 0x62, 0x65, 0x38, 0x30, 0x34, 0x65, 0x33, 0x32,
0x62, 0x37, 0x33, 0x66, 0x30, 0x61, 0x32, 0x34, 0x66, 0x31, 0x34, 0x35,
0x62, 0x35, 0x35, 0x30, 0x33, 0x35, 0x64, 0x34, 0x38, 0x64, 0x61, 0x34,
0x34, 0x39, 0x37, 0x66, 0x39, 0x66, 0x31, 0x63, 0x64, 0x66, 0x64, 0x38,
0x64, 0x66, 0x65, 0x36, 0x36, 0x39, 0x32, 0x38, 0x38, 0x64, 0x64, 0x30,
0x61, 0x64, 0x33, 0x39, 0x39, 0x31, 0x38, 0x62, 0x66, 0x64, 0x35, 0x39,
0x61, 0x33, 0x32, 0x65, 0x34, 0x61, 0x30, 0x36, 0x38, 0x64, 0x61, 0x61,
0x65, 0x63, 0x31, 0x34, 0x36, 0x65, 0x32, 0x33, 0x33, 0x38, 0x31, 0x63,
0x31, 0x30, 0x63, 0x37, 0x66, 0x35, 0x35, 0x62, 0x34, 0x35, 0x66, 0x35,
0x38, 0x36, 0x65, 0x36, 0x61, 0x64, 0x31, 0x34, 0x62, 0x32, 0x30, 0x37,
0x31, 0x62, 0x63, 0x40, 0x32, 0x31, 0x32, 0x2e, 0x33, 0x32, 0x2e, 0x32,
0x35, 0x35, 0x2e, 0x38, 0x30, 0x3a, 0x33, 0x31, 0x34, 0x34, 0x30, 0x22,
0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65,
0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x2f, 0x2f, 0x33, 0x33, 0x66, 0x31, 0x63,
0x36, 0x61, 0x39, 0x66, 0x63, 0x37, 0x65, 0x33, 0x32, 0x30, 0x37, 0x30,
0x62, 0x38, 0x64, 0x66, 0x61, 0x36, 0x35, 0x34, 0x64, 0x64, 0x64, 0x31,
0x38, 0x66, 0x64, 0x33, 0x63, 0x63, 0x38, 0x63, 0x31, 0x31, 0x66, 0x39,
0x66, 0x32, 0x31, 0x64, 0x33, 0x37, 0x31, 0x34, 0x31, 0x34, 0x36, 0x33,
0x34, 0x65, 0x38, 0x63, 0x61, 0x63, 0x61, 0x37, 0x35, 0x38, 0x61, 0x34,
0x31, 0x36, 0x36, 0x63, 0x35, 0x63, 0x61, 0x63, 0x61, 0x37, 0x66, 0x35,
0x35, 0x35, 0x63, 0x30, 0x64, 0x38, 0x34, 0x38, 0x31, 0x65, 0x38, 0x30,
0x34, 0x35, 0x32, 0x34, 0x39, 0x32, 0x64, 0x31, 0x62, 0x34, 0x66, 0x62,
0x36, 0x62, 0x35, 0x63, 0x63, 0x37, 0x31, 0x30, 0x32, 0x34, 0x38, 0x35,
0x38, 0x34, 0x39, 0x32, 0x66, 0x33, 0x35, 0x63, 0x36, 0x33, 0x37, 0x33,
0x37, 0x64, 0x34, 0x40, 0x32, 0x31, 0x32, 0x2e, 0x33, 0x32, 0x2e, 0x32,
0x35, 0x35, 0x2e, 0x31, 0x39, 0x35, 0x3a, 0x33, 0x31, 0x34, 0x34, 0x30,
0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x7d, 0x0a,
0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x61, 0x72, 0x64,
0x66, 0x6f, 0x72, 0x6b, 0x31, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3a, 0x20, 0x39, 0x39, 0x39,
0x39, 0x39, 0x39, 0x39, 0x39, 0x2c, 0x20, 0x22, 0x2f, 0x2f, 0x20, 0x54,
0x4f, 0x44, 0x4f, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x65, 0x72,
0x74, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x62, 0x6c,
0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,
0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x78,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x69, 0x70, 0x31, 0x35, 0x35,
0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61,
0x69, 0x6e, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x32, 0x34, 0x34, 0x38, 0x34,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x61, 0x64, 0x48, 0x61, 0x73, 0x68,
0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72,
0x61, 0x70, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x2f, 0x2f,
0x63, 0x36, 0x65, 0x63, 0x39, 0x61, 0x66, 0x35, 0x30, 0x62, 0x65, 0x38,
0x30, 0x34, 0x65, 0x33, 0x32, 0x62, 0x37, 0x33, 0x66, 0x30, 0x61, 0x32,
0x34, 0x66, 0x31, 0x34, 0x35, 0x62, 0x35, 0x35, 0x30, 0x33, 0x35, 0x64,
0x34, 0x38, 0x64, 0x61, 0x34, 0x34, 0x39, 0x37, 0x66, 0x39, 0x66, 0x31,
0x63, 0x64, 0x66, 0x64, 0x38, 0x64, 0x66, 0x65, 0x36, 0x36, 0x39, 0x32,
0x38, 0x38, 0x64, 0x64, 0x30, 0x61, 0x64, 0x33, 0x39, 0x39, 0x31, 0x38,
0x62, 0x66, 0x64, 0x35, 0x39, 0x61, 0x33, 0x32, 0x65, 0x34, 0x61, 0x30,
0x36, 0x38, 0x64, 0x61, 0x61, 0x65, 0x63, 0x31, 0x34, 0x36, 0x65, 0x32,
0x33, 0x33, 0x38, 0x31, 0x63, 0x31, 0x30, 0x63, 0x37, 0x66, 0x35, 0x35,
0x62, 0x34, 0x35, 0x66, 0x35, 0x38, 0x36, 0x65, 0x36, 0x61, 0x64, 0x31,
0x34, 0x62, 0x32, 0x30, 0x37, 0x31, 0x62, 0x63, 0x40, 0x32, 0x31, 0x32,
0x2e, 0x33, 0x32, 0x2e, 0x32, 0x35, 0x35, 0x2e, 0x38, 0x30, 0x3a, 0x33,
0x31, 0x34, 0x34, 0x30, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x2f, 0x2f,
0x33, 0x33, 0x66, 0x31, 0x63, 0x36, 0x61, 0x39, 0x66, 0x63, 0x37, 0x65,
0x33, 0x32, 0x30, 0x37, 0x30, 0x62, 0x38, 0x64, 0x66, 0x61, 0x36, 0x35,
0x34, 0x64, 0x64, 0x64, 0x31, 0x38, 0x66, 0x64, 0x33, 0x63, 0x63, 0x38,
0x63, 0x31, 0x31, 0x66, 0x39, 0x66, 0x32, 0x31, 0x64, 0x33, 0x37, 0x31,
0x34, 0x31, 0x34, 0x36, 0x33, 0x34, 0x65, 0x38, 0x63, 0x61, 0x63, 0x61,
0x37, 0x35, 0x38, 0x61, 0x34, 0x31, 0x36, 0x36, 0x63, 0x35, 0x63, 0x61,
0x63, 0x61, 0x37, 0x66, 0x35, 0x35, 0x35, 0x63, 0x30, 0x64, 0x38, 0x34,
0x38, 0x31, 0x65, 0x38, 0x30, 0x34, 0x35, 0x32, 0x34, 0x39, 0x32, 0x64,
0x31, 0x62, 0x34, 0x66, 0x62, 0x36, 0x62, 0x35, 0x63, 0x63, 0x37, 0x31,
0x30, 0x32, 0x34, 0x38, 0x35, 0x38, 0x34, 0x39, 0x32, 0x66, 0x33, 0x35,
0x63, 0x36, 0x33, 0x37, 0x33, 0x37, 0x64, 0x34, 0x40, 0x32, 0x31, 0x32,
0x2e, 0x33, 0x32, 0x2e, 0x32, 0x35, 0x35, 0x2e, 0x31, 0x39, 0x35, 0x3a,
0x33, 0x31, 0x34, 0x34, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5d,
0x0a, 0x7d, 0x0a,
},
fi: FileInfo{
name: "mainnet.json",
size: 1438,
modTime: time.Unix(0, 1525764862297964526),
size: 1923,
modTime: time.Unix(0, 1549968698061515220),
isDir: false,
},
}, "/core/config/morden.json": File{
Expand Down Expand Up @@ -394,7 +435,7 @@ func init() {
fi: FileInfo{
name: "morden.json",
size: 1463,
modTime: time.Unix(0, 1523969566016975020),
modTime: time.Unix(0, 1523969566000000000),
isDir: false,
},
},
Expand Down
12 changes: 8 additions & 4 deletions core/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,15 @@ func (c *ChainConfig) SortForks() *ChainConfig {

// GetChainID gets the chainID for a chainconfig.
// It returns big.Int zero-value if no chainID is ever set for eip155/chainID.
// It uses ChainConfig#HasFeature, so it will return the last chronological value
// if the value is set multiple times.
func (c *ChainConfig) GetChainID() *big.Int {
func (c *ChainConfig) GetChainID(num *big.Int) *big.Int {
n := new(big.Int)
feat, _, ok := c.HasFeature("eip155")
var feat *ForkFeature
var ok bool
if num == nil {
feat, _, ok = c.HasFeature("eip155")
} else {
feat, _, ok = c.GetFeature(num, "eip155")
}
if !ok {
return n
}
Expand Down
13 changes: 13 additions & 0 deletions core/config/mainnet.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,19 @@
}
}
]
},
{
"name": "Hardfork1",
"block": 99999999, "// TODO": "insert correct block number",
"requiredHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"features": [
{
"id": "eip155",
"options": {
"chainID": 24484
}
}
]
}
],
"badHashes": [
Expand Down
4 changes: 2 additions & 2 deletions core/state_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,12 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB) (ty
// Iterate over and process the individual transactions
for i, tx := range block.Transactions() {
if tx.Protected() {
chainId := p.config.GetChainID()
chainId := p.config.GetChainID(block.Number())
if chainId.Cmp(new(big.Int)) == 0 {
return nil, nil, nil, fmt.Errorf("ChainID is not set for EIP-155 in chain configuration at block number: %v. \n Tx ChainID: %v", block.Number(), tx.ChainId())
}
if tx.ChainId() == nil || tx.ChainId().Cmp(chainId) != 0 {
return nil, nil, nil, fmt.Errorf("Invalid transaction chain id. Current chain id: %v tx chain id: %v", p.config.GetChainID(), tx.ChainId())
return nil, nil, nil, fmt.Errorf("Invalid transaction chain id. Current chain id: %v tx chain id: %v", chainId, tx.ChainId())
}
}
statedb.StartRecord(tx.Hash(), block.Hash(), i)
Expand Down
6 changes: 5 additions & 1 deletion core/tx_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ type TxPool struct {
func NewTxPool(config *ChainConfig, eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func() *big.Int) *TxPool {
pool := &TxPool{
config: config,
signer: types.NewChainIdSigner(config.GetChainID()),
signer: types.NewChainIdSigner(config.GetChainID(nil)),
pending: make(map[common.Hash]*types.Transaction),
queue: make(map[common.Address]map[common.Hash]*types.Transaction),
eventMux: eventMux,
Expand Down Expand Up @@ -112,6 +112,10 @@ func (pool *TxPool) eventLoop() {
pool.homestead = true
}

if ev.Block != nil {
pool.signer = types.NewChainIdSigner(pool.config.GetChainID(ev.Block.Number()))
}

pool.resetState()
pool.mu.Unlock()
case GasPriceChanged:
Expand Down
5 changes: 3 additions & 2 deletions eth/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,8 @@ func (s *PublicEthereumAPI) Syncing() (interface{}, error) {
// 61 - Mainnet $((0x3d))
// 62 - Morden $((0x3e))
func (s *PublicEthereumAPI) ChainId() *big.Int {
return s.e.chainConfig.GetChainID()
_, current, _, _, _ := s.e.Downloader().Progress()
return s.e.chainConfig.GetChainID(new(big.Int).SetUint64(current))
}

// PublicMinerAPI provides an API to control the miner.
Expand Down Expand Up @@ -848,7 +849,7 @@ func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx
if fullTx {
formatTx = func(tx *types.Transaction) (interface{}, error) {
if tx.Protected() {
tx.SetSigner(types.NewChainIdSigner(s.bc.Config().GetChainID()))
tx.SetSigner(types.NewChainIdSigner(s.bc.Config().GetChainID(b.Number())))
}
return newRPCTransaction(b, tx.Hash())
}
Expand Down
4 changes: 2 additions & 2 deletions eth/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,9 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
return nil, err
}

glog.V(logger.Info).Infof("Protocol Versions: %v, Network Id: %v, Chain Id: %v", ProtocolVersions, config.NetworkId, config.ChainConfig.GetChainID())
glog.V(logger.Info).Infof("Protocol Versions: %v, Network Id: %v, Chain Id: %v", ProtocolVersions, config.NetworkId, config.ChainConfig.GetChainID(nil))
glog.D(logger.Warn).Infof("Protocol Versions: %v, Network Id: %v, Chain Id: %v", logger.ColorGreen(fmt.Sprintf("%v", ProtocolVersions)), logger.ColorGreen(strconv.Itoa(config.NetworkId)), logger.ColorGreen(func() string {
cid := config.ChainConfig.GetChainID().String()
cid := config.ChainConfig.GetChainID(nil).String()
if cid == "0" {
cid = "not set"
}
Expand Down
2 changes: 1 addition & 1 deletion miner/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ func (self *worker) makeCurrent(parent *types.Block, header *types.Header) error
}
work := &Work{
config: self.config,
signer: types.NewChainIdSigner(self.config.GetChainID()),
signer: types.NewChainIdSigner(self.config.GetChainID(header.Number)),
state: state,
ancestors: set.New(),
family: set.New(),
Expand Down

0 comments on commit 3d2066d

Please sign in to comment.