diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..10064a2 --- /dev/null +++ b/client/client.go @@ -0,0 +1,691 @@ +package client + +import ( + "errors" + "log" + "math/big" + "runtime" + "time" + "github.com/BlocSoc-iitr/selene/common" + "github.com/BlocSoc-iitr/selene/config" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/core/types" +) +type ClientBuilder struct { + Network *config.Network + ConsensusRpc *string + ExecutionRpc *string + Checkpoint *[32]byte + //If architecture is Web Assembly (wasm32), this will be nil + RpcBindIp *string + //If architecture is Web Assembly (wasm32), this will be nil + RpcPort *uint16 + //If architecture is Web Assembly (wasm32), this will be nil + DataDir *string + Config *config.Config + Fallback *string + LoadExternalFallback bool + StrictCheckpointAge bool +} +func (c Client) Build(b ClientBuilder) (*Client, error) { + var baseConfig config.BaseConfig + var err error + _ = err + if b.Network != nil { + baseConfig, err = b.Network.BaseConfig(string(*b.Network)) + } else { + if b.Config == nil { + return nil, errors.New("missing network config") + } + baseConfig = b.Config.ToBaseConfig() + } + consensusRPC := b.ConsensusRpc + if consensusRPC == nil { + if b.Config == nil { + return nil, errors.New("missing consensus rpc") + } + consensusRPC = &b.Config.ConsensusRpc + } + executionRPC := b.ExecutionRpc + if executionRPC == nil { + if b.Config == nil { + return nil, errors.New("missing execution rpc") + } + executionRPC = &b.Config.ExecutionRpc + } + checkpoint := b.Checkpoint + if checkpoint == nil { + if b.Config != nil { + checkpoint = b.Config.Checkpoint + } + } + var defaultCheckpoint [32]byte + if b.Config != nil { + defaultCheckpoint = b.Config.DefaultCheckpoint + } else { + defaultCheckpoint = baseConfig.DefaultCheckpoint + } + var rpcBindIP, dataDir *string + var rpcPort *uint16 + if runtime.GOARCH == "wasm" { + rpcBindIP = nil + } else { + if b.RpcBindIp != nil { + rpcBindIP = b.RpcBindIp + } else if b.Config != nil { + rpcBindIP = b.Config.RpcBindIp + } + } + if runtime.GOARCH == "wasm" { + rpcPort = nil + } else { + if b.RpcPort != nil { + rpcPort = b.RpcPort + } else if b.Config != nil { + rpcPort = b.Config.RpcPort + } + } + if runtime.GOARCH == "wasm" { + dataDir = nil + } else { + if b.DataDir != nil { + dataDir = b.DataDir + } else if b.Config != nil { + dataDir = b.Config.DataDir + } + } + fallback := b.Fallback + if fallback == nil && b.Config != nil { + fallback = b.Config.Fallback + } + loadExternalFallback := b.LoadExternalFallback + if b.Config != nil { + loadExternalFallback = loadExternalFallback || b.Config.LoadExternalFallback + } + strictCheckpointAge := b.StrictCheckpointAge + if b.Config != nil { + strictCheckpointAge = strictCheckpointAge || b.Config.StrictCheckpointAge + } + config := config.Config{ + ConsensusRpc: *consensusRPC, + ExecutionRpc: *executionRPC, + Checkpoint: checkpoint, + DefaultCheckpoint: defaultCheckpoint, + RpcBindIp: rpcBindIP, + RpcPort: rpcPort, + DataDir: dataDir, + Chain: baseConfig.Chain, + Forks: baseConfig.Forks, + MaxCheckpointAge: baseConfig.MaxCheckpointAge, + Fallback: fallback, + LoadExternalFallback: loadExternalFallback, + StrictCheckpointAge: strictCheckpointAge, + DatabaseType: nil, + } + client, err := Client{}.New(config) + return &client, nil +} +type Client struct { + Node *Node + Rpc *Rpc +} +func (c Client) New(clientConfig config.Config) (Client, error) { + config := &clientConfig + node, err := NewNode(config) + var rpc Rpc + if err != nil { + return Client{}, err + } + if config.RpcBindIp != nil || config.RpcPort != nil { + rpc = Rpc{}.New(node, config.RpcBindIp, *config.RpcPort) + } + return Client{ + Node: node, + Rpc: func() *Rpc { + if runtime.GOARCH == "wasm" { + return nil + } else { + return &rpc + } + }(), + }, nil +} +func (c *Client) Start() error { + errorChan := make(chan error, 1) + go func() { + defer close(errorChan) + if runtime.GOARCH != "wasm" { + if c.Rpc == nil { + errorChan <- errors.New("Rpc not found.") + return + } + _, err := c.Rpc.Start() + if err != nil { + errorChan <- err + return + } + } + errorChan <- nil + }() + err := <-errorChan + return err +} +func (c *Client) Shutdown() { + log.Println("selene::client - shutting down") + go func() { + err := c.Node.Consensus.Shutdown() + if err != nil { + log.Printf("selene::client - graceful shutdown failed: %v\n", err) + } + }() +} +func (c *Client) Call(tx *TransactionRequest, block common.BlockTag) ([]byte, error) { + resultChan := make(chan []byte, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.Call(tx, block) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) EstimateGas(tx *TransactionRequest) (uint64, error) { + resultChan := make(chan uint64, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.EstimateGas(tx) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return 0, err + } +} +func (c *Client) GetBalance(address string, block common.BlockTag) (*big.Int, error) { + resultChan := make(chan *big.Int, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetBalance(address, block) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetNonce(address string, block common.BlockTag) (uint64, error) { + resultChan := make(chan uint64, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetNonce(address, block) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return 0, err + } +} +func (c *Client) GetBlockTransactionCountByHash(hash [32]byte) (uint64, error) { + resultChan := make(chan uint64, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetBlockTransactionCountByHash(hash) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return 0, err + } +} +func (c *Client) GetBlockTransactionCountByNumber(block common.BlockTag) (uint64, error) { + resultChan := make(chan uint64, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetBlockTransactionCountByNumber(block) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return 0, err + } +} +func (c *Client) GetCode(address string, block common.BlockTag) ([]byte, error) { + resultChan := make(chan []byte, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetCode(address, block) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetStorageAt(address string, slot [32]byte, block common.BlockTag) (*big.Int, error) { + resultChan := make(chan *big.Int, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetStorageAt(address, slot, block) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) SendRawTransaction(bytes *[]uint8) ([32]byte, error) { + resultChan := make(chan [32]byte, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.SendRawTransaction(bytes) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return [32]byte{}, err + } +} +func (c *Client) GetTransactionReceipt(txHash [32]byte) (*types.Receipt, error) { + resultChan := make(chan *types.Receipt, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetTransactionReceipt(txHash) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetTransactionByHash(txHash [32]byte) (*types.Transaction, error) { + resultChan := make(chan *types.Transaction, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetTransactionByHash(txHash) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetLogs(filter *ethereum.FilterQuery) ([]types.Log, error) { + resultChan := make(chan []types.Log, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetLogs(filter) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetFilterChanges(filterId *big.Int) ([]types.Log, error) { + resultChan := make(chan []types.Log, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetFilterChanges(filterId) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) UninstallFilter(filterId *big.Int) (bool, error) { + resultChan := make(chan bool, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.UninstallFilter(filterId) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return false, err + } +} +func (c *Client) GetNewFilter(filter *ethereum.FilterQuery) (*big.Int, error) { + resultChan := make(chan *big.Int, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetNewFilter(filter) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetNewBlockFilter() (*big.Int, error) { + resultChan := make(chan *big.Int, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetNewBlockFilter() + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetNewPendingTransactionFilter() (*big.Int, error) { + resultChan := make(chan *big.Int, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetNewPendingTransactionFilter() + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetGasPrice() (*big.Int, error) { + resultChan := make(chan *big.Int, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetGasPrice() + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetPriorityFee() *big.Int { + return c.Node.GetPriorityFee() +} +func (c *Client) GetBlockNumber() (*big.Int, error) { + resultChan := make(chan *big.Int, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetBlockNumber() + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetBlockByNumber(block common.BlockTag, fullTx bool) (*common.Block, error) { + resultChan := make(chan *common.Block, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetBlockByNumber(block, fullTx) + if err != nil { + errorChan <- err + } else { + resultChan <- &result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetBlockByHash(hash [32]byte, fullTx bool) (*common.Block, error) { + resultChan := make(chan *common.Block, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetBlockByHash(hash, fullTx) + if err != nil { + errorChan <- err + } else { + resultChan <- &result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetTransactionByBlockHashAndIndex(blockHash [32]byte, index uint64) (*types.Transaction, error) { + resultChan := make(chan *types.Transaction, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetTransactionByBlockHashAndIndex(blockHash, index) + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) ChainID() uint64 { + return c.Node.ChainId() +} +func (c *Client) Syncing() (*SyncStatus, error) { + resultChan := make(chan *SyncStatus, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.Syncing() + if err != nil { + errorChan <- err + } else { + resultChan <- &result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return nil, err + } +} +func (c *Client) GetCoinbase() ([20]byte, error) { + resultChan := make(chan [20]byte, 1) + errorChan := make(chan error, 1) + go func() { + defer close(resultChan) + defer close(errorChan) + result, err := c.Node.GetCoinbase() + if err != nil { + errorChan <- err + } else { + resultChan <- result + } + }() + select { + case result := <-resultChan: + return result, nil + case err := <-errorChan: + return [20]byte{}, err + } +} +func (c *Client) WaitSynced() error { + for { + statusChan := make(chan *SyncStatus) + errChan := make(chan error) + go func() { + status, err := c.Syncing() + if err != nil { + errChan <- err + } else { + statusChan <- status + } + }() + select { + case status := <-statusChan: + if status.Status == "None" { + return nil + } + case err := <-errChan: + return err + case <-time.After(100 * time.Millisecond): + // Periodic checking of SyncStatus or error + } + } +} \ No newline at end of file diff --git a/go.mod b/go.mod index d3224ef..ffb49d7 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,22 @@ module github.com/BlocSoc-iitr/selene go 1.22.3 require ( + github.com/avast/retry-go v3.0.0+incompatible + github.com/consensys/gnark-crypto v0.12.1 github.com/ethereum/go-ethereum v1.14.8 github.com/holiman/uint256 v1.3.1 github.com/pkg/errors v0.9.1 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 + github.com/wealdtech/go-merkletree v1.0.0 + go.uber.org/zap v1.21.0 + gopkg.in/yaml.v2 v2.4.0 ) require ( - github.com/avast/retry-go v3.0.0+incompatible // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect @@ -45,7 +49,6 @@ require ( golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 602c81c..f49c379 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,41 @@ +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -23,22 +49,60 @@ github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHE github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.8 h1:NgOWvXS+lauK+zFukEvi85UmmsS/OkV0N23UZ1VTIig= github.com/ethereum/go-ethereum v1.14.8/go.mod h1:TJhyuDq0JDppAkFXgqjwpdlQApywnu/m10kFPxh8vvs= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -48,6 +112,8 @@ github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6ke github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= @@ -63,6 +129,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -76,30 +143,65 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/wealdtech/go-merkletree v1.0.0 h1:DsF1xMzj5rK3pSQM6mPv8jlyJyHXhFxpnA2bwEjMMBY= github.com/wealdtech/go-merkletree v1.0.0/go.mod h1:cdil512d/8ZC7Kx3bfrDvGMQXB25NTKbsm0rFrmDax4= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=