From d49dbea5880f7578cf95374e463a87dd5108c57f Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 10 Feb 2025 10:06:21 -0500 Subject: [PATCH 01/36] Updates go.mods --- .gitignore | 1 + balanceChart/go.mod | 2 +- balanceChart/go.sum | 4 ++-- cancelContext/go.mod | 2 +- cancelContext/go.sum | 4 ++-- checkNodes/go.mod | 2 +- checkNodes/go.sum | 4 ++-- comparison/go.mod | 2 +- comparison/go.sum | 4 ++-- findFirst/go.mod | 2 +- findFirst/go.sum | 4 ++-- four_bytes/go.mod | 3 +-- four_bytes/go.sum | 4 ++-- keystore/go.mod | 7 +++---- keystore/go.sum | 5 ++--- nameManager/go.mod | 2 +- nameManager/go.sum | 4 ++-- simple/go.mod | 2 +- simple/go.sum | 4 ++-- withStreaming/go.mod | 2 +- withStreaming/go.sum | 4 ++-- 21 files changed, 33 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 5836961..ce15296 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +statements .DS_Store shit *.exe diff --git a/balanceChart/go.mod b/balanceChart/go.mod index a237c45..192ef4c 100644 --- a/balanceChart/go.mod +++ b/balanceChart/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/balanceChart go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 github.com/bykof/gostradamus v1.0.4 gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b diff --git a/balanceChart/go.sum b/balanceChart/go.sum index c598313..3067ed7 100644 --- a/balanceChart/go.sum +++ b/balanceChart/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= diff --git a/cancelContext/go.mod b/cancelContext/go.mod index 1c25cfc..9baa7d0 100644 --- a/cancelContext/go.mod +++ b/cancelContext/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/cancelContext go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 ) diff --git a/cancelContext/go.sum b/cancelContext/go.sum index 10f2305..48527b7 100644 --- a/cancelContext/go.sum +++ b/cancelContext/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= diff --git a/checkNodes/go.mod b/checkNodes/go.mod index 52825c4..471adb0 100644 --- a/checkNodes/go.mod +++ b/checkNodes/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/checkNodes go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 ) diff --git a/checkNodes/go.sum b/checkNodes/go.sum index 10f2305..48527b7 100644 --- a/checkNodes/go.sum +++ b/checkNodes/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= diff --git a/comparison/go.mod b/comparison/go.mod index 35879a2..8beff66 100644 --- a/comparison/go.mod +++ b/comparison/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/comparison go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 ) diff --git a/comparison/go.sum b/comparison/go.sum index 10f2305..48527b7 100644 --- a/comparison/go.sum +++ b/comparison/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= diff --git a/findFirst/go.mod b/findFirst/go.mod index 91eb6d5..8b96a62 100644 --- a/findFirst/go.mod +++ b/findFirst/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/findFirst go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 ) diff --git a/findFirst/go.sum b/findFirst/go.sum index 10f2305..48527b7 100644 --- a/findFirst/go.sum +++ b/findFirst/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= diff --git a/four_bytes/go.mod b/four_bytes/go.mod index 96ea980..76dde1a 100644 --- a/four_bytes/go.mod +++ b/four_bytes/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/src/other/four_bytes go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/ethereum/go-ethereum v1.14.13 github.com/panjf2000/ants/v2 v2.10.0 github.com/spf13/cobra v1.7.0 @@ -38,7 +38,6 @@ require ( github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.10.0 // indirect golang.org/x/crypto v0.31.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.28.0 // indirect diff --git a/four_bytes/go.sum b/four_bytes/go.sum index 93e0b50..00089cd 100644 --- a/four_bytes/go.sum +++ b/four_bytes/go.sum @@ -1,5 +1,5 @@ -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bykof/gostradamus v1.0.4 h1:77iq/tANg5rZSxjoZ98zepZbv3VrotijEmlnH/WycD4= diff --git a/keystore/go.mod b/keystore/go.mod index 9db3357..ed4ebdc 100644 --- a/keystore/go.mod +++ b/keystore/go.mod @@ -3,7 +3,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/keystore go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/ethereum/go-ethereum v1.14.13 github.com/joho/godotenv v1.5.1 ) @@ -14,6 +14,7 @@ require ( github.com/cespare/cp v1.1.1 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect @@ -26,17 +27,15 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.3.1 // indirect github.com/klauspost/compress v1.16.4 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/stretchr/testify v1.10.0 // indirect github.com/supranational/blst v0.3.13 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - github.com/urfave/cli/v2 v2.27.5 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect diff --git a/keystore/go.sum b/keystore/go.sum index a8531d2..311e107 100644 --- a/keystore/go.sum +++ b/keystore/go.sum @@ -2,8 +2,8 @@ github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -125,7 +125,6 @@ github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= diff --git a/nameManager/go.mod b/nameManager/go.mod index 4649239..4a2a47e 100644 --- a/nameManager/go.mod +++ b/nameManager/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/nameManager go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 ) diff --git a/nameManager/go.sum b/nameManager/go.sum index 10f2305..48527b7 100644 --- a/nameManager/go.sum +++ b/nameManager/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= diff --git a/simple/go.mod b/simple/go.mod index bd040e1..3a5c0a3 100644 --- a/simple/go.mod +++ b/simple/go.mod @@ -7,7 +7,7 @@ require github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae // indirect + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c // indirect github.com/alecthomas/participle/v2 v2.0.0 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/bits-and-blooms/bitset v1.13.0 // indirect diff --git a/simple/go.sum b/simple/go.sum index 10f2305..48527b7 100644 --- a/simple/go.sum +++ b/simple/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= diff --git a/withStreaming/go.mod b/withStreaming/go.mod index 0c9c93c..7f04401 100644 --- a/withStreaming/go.mod +++ b/withStreaming/go.mod @@ -4,7 +4,7 @@ module github.com/TrueBlocks/trueblocks-core/examples/withStreaming go 1.23.1 require ( - github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae + github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 github.com/schollz/progressbar/v3 v3.14.4 ) diff --git a/withStreaming/go.sum b/withStreaming/go.sum index c5fb8ed..9e230ed 100644 --- a/withStreaming/go.sum +++ b/withStreaming/go.sum @@ -40,8 +40,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae h1:ooRHiAxPwGbWth1OAkBzweJO5KRt1rygPO/IolnCzHE= -github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250130023515-f86b9f89cfae/go.mod h1:ETpBauf/NX6mlhJYeMu+Md9HTBHZ/mny1qu4rh4km1s= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0 h1:l1cRGIChEC6KW9JfLtFBUxr3lsnnNZHh6UdKK2eTNaw= github.com/TrueBlocks/trueblocks-sdk/v4 v4.2.0/go.mod h1:GJGFnBOzoNgs6b90QhvFzZbWMYpLx8cXaN4lCqRmGJI= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= From edd2e75205a35e73b64204296a4fa51f2818fe74 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 10 Feb 2025 20:21:35 -0500 Subject: [PATCH 02/36] Cleans up .github --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index ce15296..5836961 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -statements .DS_Store shit *.exe From 5a2bf3981074e1ec8e08750718660cecbef94f6c Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 21 Feb 2025 22:15:15 -0500 Subject: [PATCH 03/36] Adds accounting example --- accounting/.gitignore | 6 + accounting/go.mod | 44 ++++ accounting/go.sum | 108 ++++++++ accounting/main.go | 346 +++++++++++++++++++++++++ accounting/rpc.go | 87 +++++++ accounting/tests/apps.csv | 13 + accounting/tests/eventAmounts.csv | 22 ++ accounting/tests/logsByTransaction.csv | 22 ++ accounting/tests/mapping.csv | 16 ++ 9 files changed, 664 insertions(+) create mode 100644 accounting/.gitignore create mode 100644 accounting/go.mod create mode 100644 accounting/go.sum create mode 100644 accounting/main.go create mode 100644 accounting/rpc.go create mode 100644 accounting/tests/apps.csv create mode 100644 accounting/tests/eventAmounts.csv create mode 100644 accounting/tests/logsByTransaction.csv create mode 100644 accounting/tests/mapping.csv diff --git a/accounting/.gitignore b/accounting/.gitignore new file mode 100644 index 0000000..c1a372c --- /dev/null +++ b/accounting/.gitignore @@ -0,0 +1,6 @@ +one +two +ick +main +all_tests.txt +save diff --git a/accounting/go.mod b/accounting/go.mod new file mode 100644 index 0000000..4a71070 --- /dev/null +++ b/accounting/go.mod @@ -0,0 +1,44 @@ +module shit + +go 1.23.1 + +require github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c + +require ( + github.com/benbjohnson/clock v1.3.0 // indirect + github.com/bykof/gostradamus v1.0.4 // indirect + github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/go-ethereum v1.14.13 // indirect + github.com/holiman/uint256 v1.3.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ipfs/boxo v0.8.0 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect + github.com/ipfs/go-ipfs-api v0.6.1 // indirect + github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-libp2p v0.27.8 // indirect + github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect + github.com/multiformats/go-multiaddr v0.9.0 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-multistream v0.4.1 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/panjf2000/ants/v2 v2.10.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect + lukechampine.com/blake3 v1.1.7 // indirect +) diff --git a/accounting/go.sum b/accounting/go.sum new file mode 100644 index 0000000..00089cd --- /dev/null +++ b/accounting/go.sum @@ -0,0 +1,108 @@ +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= +github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bykof/gostradamus v1.0.4 h1:77iq/tANg5rZSxjoZ98zepZbv3VrotijEmlnH/WycD4= +github.com/bykof/gostradamus v1.0.4/go.mod h1:pdH0bv8yFLwr4G6EbM1j3QUb4AdCmiG7xlTjVwYyPNM= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= +github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/ethereum/go-ethereum v1.14.13 h1:L81Wmv0OUP6cf4CW6wtXsr23RUrDhKs2+Y9Qto+OgHU= +github.com/ethereum/go-ethereum v1.14.13/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs= +github.com/ipfs/boxo v0.8.0/go.mod h1:RIsi4CnTyQ7AUsNn5gXljJYZlQrHBMnJp94p73liFiA= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-ipfs-api v0.6.1 h1:nK5oeFOdMh1ogT+GCOcyBFOOcFGNuudSb1rg9YDyAKE= +github.com/ipfs/go-ipfs-api v0.6.1/go.mod h1:8pl+ZMF2LX42szbqGbpOBEiI1/rYaImvTvJtG0g+rL4= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= +github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= +github.com/libp2p/go-libp2p v0.27.8 h1:IX5x/4yKwyPQeVS2AXHZ3J4YATM9oHBGH1gBc23jBAI= +github.com/libp2p/go-libp2p v0.27.8/go.mod h1:eCFFtd0s5i/EVKR7+5Ki8bM7qwkNW3TPTTSSW9sz8NE= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= +github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= +github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= +github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= +github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= +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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= diff --git a/accounting/main.go b/accounting/main.go new file mode 100644 index 0000000..b6f074e --- /dev/null +++ b/accounting/main.go @@ -0,0 +1,346 @@ +package main + +import ( + "fmt" + "sort" + "strconv" + "strings" + "sync" +) + +// Posting represents a single ledger event or correction +type Posting struct { + Statement struct { + BlockNumber int + TransactionIndex int + LogIndex int + AssetAddress string + AccountedFor string + CheckpointBalance int64 + TentativeBalance int64 + } + CorrectionIndex int + CorrectionReason string + EventAmount int64 + BeginBalance int64 + RowIndex int +} + +func (p Posting) Reconciled(isFinal bool) string { + if p.CorrectionIndex != 0 { + return "true" + } + if !isFinal { + return "unknown" + } + return strconv.FormatBool(p.BeginBalance+p.EventAmount == p.Statement.CheckpointBalance) +} + +type Reconciler struct { + mu sync.Mutex + addressOfInterest string + runningBalances map[string]int64 + seenBlocks map[string]int + correctionCounter int + counterMu sync.Mutex + rowIndexCounter int + rowIndexMu sync.Mutex +} + +var ( + apps [][2]int +) + +func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { + ch := make(chan Posting) + go func() { + defer close(ch) + for _, p := range logsByTx[mapKey(block, tx, 0)] { + if p.Statement.AccountedFor != r.addressOfInterest { + continue + } + eaKey := fmt.Sprintf("%d|%d|%d", block, tx, p.Statement.LogIndex) + p.EventAmount = eventAmounts[eaKey] + ch <- p + } + }() + return ch +} + +func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg *sync.WaitGroup) { + type key struct{ asset, holder string } + correctingEntry := func(k key, reason string, onChain, currentBal int64, p *Posting) Posting { + r.counterMu.Lock() + r.correctionCounter++ + correction := Posting{ + EventAmount: onChain - currentBal, + BeginBalance: currentBal, + CorrectionIndex: r.correctionCounter, + CorrectionReason: reason, + } + r.counterMu.Unlock() + correction.Statement = p.Statement + correction.Statement.TentativeBalance = onChain + correction.Statement.CheckpointBalance = onChain + r.rowIndexMu.Lock() + r.rowIndexCounter++ + correction.RowIndex = r.rowIndexCounter + r.rowIndexMu.Unlock() + r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] = onChain + wg.Add(1) + return correction + } + + lastPostings := make(map[key]int) + for i, p := range buffer { + k := key{p.Statement.AssetAddress, p.Statement.AccountedFor} + seenKey := fmt.Sprintf("%d|%s|%s", p.Statement.BlockNumber, k.asset, k.holder) + + if _, seen := r.seenBlocks[seenKey]; !seen { + prevBlock := fmt.Sprintf("0x%x", p.Statement.BlockNumber-1) + if onChain, ok := conn.GetBalanceAtToken(k.asset, k.holder, prevBlock); ok { + r.mu.Lock() + currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] + if onChain != currentBal { + modelChan <- correctingEntry(k, "mis", onChain, currentBal, &p) + } + r.mu.Unlock() + } + r.seenBlocks[seenKey] = p.Statement.BlockNumber + } + + r.mu.Lock() + runningKey := fmt.Sprintf("%s|%s", k.asset, k.holder) + p.BeginBalance = r.runningBalances[runningKey] + p.Statement.TentativeBalance = p.BeginBalance + p.EventAmount + r.runningBalances[runningKey] = p.Statement.TentativeBalance + r.rowIndexMu.Lock() + r.rowIndexCounter++ + p.RowIndex = r.rowIndexCounter + r.rowIndexMu.Unlock() + r.mu.Unlock() + + buffer[i] = p + lastPostings[k] = i + } + + for _, p := range buffer { + wg.Add(1) + modelChan <- p + } + + for k, idx := range lastPostings { + p := buffer[idx] + hexBlock := fmt.Sprintf("0x%x", p.Statement.BlockNumber) + if onChain, ok := conn.GetBalanceAtToken(k.asset, k.holder, hexBlock); ok { + r.mu.Lock() + currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] + if onChain != currentBal { + modelChan <- correctingEntry(k, "imb", onChain, currentBal, &p) + } + r.mu.Unlock() + } + } +} + +func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) { + globalStream := make(chan Posting) + go func() { + defer close(globalStream) + var prevBlock int + for _, app := range apps { + block, tx := app[0], app[1] + if block != prevBlock && prevBlock != 0 { + globalStream <- Posting{Statement: struct { + BlockNumber int + TransactionIndex int + LogIndex int + AssetAddress string + AccountedFor string + CheckpointBalance int64 + TentativeBalance int64 + }{BlockNumber: prevBlock, AssetAddress: "END_OF_BLOCK"}} + } + for p := range r.GetPostingChannel(block, tx) { + globalStream <- p + } + prevBlock = block + } + if prevBlock != 0 { + globalStream <- Posting{Statement: struct { + BlockNumber int + TransactionIndex int + LogIndex int + AssetAddress string + AccountedFor string + CheckpointBalance int64 + TentativeBalance int64 + }{BlockNumber: prevBlock, AssetAddress: "END_OF_BLOCK"}} + } + globalStream <- Posting{Statement: struct { + BlockNumber int + TransactionIndex int + LogIndex int + AssetAddress string + AccountedFor string + CheckpointBalance int64 + TentativeBalance int64 + }{AssetAddress: "END_OF_STREAM"}} + }() + + var buffer []Posting + for posting := range globalStream { + switch posting.Statement.AssetAddress { + case "END_OF_BLOCK": + r.flushBlock(buffer, modelChan, wg) + buffer = nil + case "END_OF_STREAM": + if len(buffer) > 0 { + r.flushBlock(buffer, modelChan, wg) + } + return + default: + buffer = append(buffer, posting) + } + } +} + +func shortenAddress(addr string) string { + if len(addr) > 8 { + return addr[:8] + } + return addr +} + +func main() { + initData() + modelChan := make(chan Posting, 1000) + var wg sync.WaitGroup + r := &Reconciler{ + addressOfInterest: "0xf", + runningBalances: make(map[string]int64), + seenBlocks: make(map[string]int), + } + + done := make(chan struct{}) + + go func() { + defer close(modelChan) + r.processStream(modelChan, &wg) + close(done) + }() + + var postings []Posting + for p := range modelChan { + postings = append(postings, p) + wg.Done() + } + + <-done + wg.Wait() + + sort.Slice(postings, func(i, j int) bool { + if postings[i].Statement.AssetAddress == postings[j].Statement.AssetAddress { + return postings[i].RowIndex < postings[j].RowIndex + } + return postings[i].Statement.AssetAddress < postings[j].Statement.AssetAddress + }) + + fmt.Println("Block\tTx\tLog\tCorrection\tReason\tAsset\tHolder\tBeginBal\tAmount\tTentative\tCheckpoint\tCheck1\tCheck2\tReconciled") + currentAsset := "" + var lastTentative int64 + for _, p := range postings { + isFinal := false + if p.CorrectionIndex == 0 { + lastTx := 0 + for _, app := range apps { + if app[0] == p.Statement.BlockNumber && app[1] > lastTx { + lastTx = app[1] + } + } + if p.Statement.TransactionIndex == lastTx { + lastLog := 0 + for _, logP := range logsByTx[mapKey(p.Statement.BlockNumber, lastTx, 0)] { + if logP.Statement.LogIndex > lastLog { + lastLog = logP.Statement.LogIndex + } + } + if p.Statement.LogIndex == lastLog { + isFinal = true + } + } + } + + assetShort := shortenAddress(p.Statement.AssetAddress) + holderShort := shortenAddress(p.Statement.AccountedFor) + + checkpoint := "-" + if reconciled := p.Reconciled(isFinal); reconciled != "unknown" { + checkpoint = fmt.Sprintf("%d", p.Statement.CheckpointBalance) + } + + check1 := p.BeginBalance + p.EventAmount - p.Statement.TentativeBalance + check2 := "-" + if p.CorrectionIndex != 0 || isFinal { + check2 = fmt.Sprintf("%d", p.BeginBalance+p.EventAmount-p.Statement.CheckpointBalance) + } + + corrIndexStr := "-" + if p.CorrectionIndex != 0 { + corrIndexStr = fmt.Sprintf("%d", p.CorrectionIndex) + } + + if currentAsset != "" && currentAsset != p.Statement.AssetAddress { + r.rowIndexMu.Lock() + r.rowIndexCounter++ + r.rowIndexMu.Unlock() + fmt.Println(strings.Repeat("-", 120)) + fmt.Printf("-\t-\t-\t-\t-\t%s\t-\t0\t0\t%d\t-\t0\t-\t-\n", + shortenAddress(currentAsset), + lastTentative, + ) + fmt.Println() + } + + fmt.Printf("%d\t%d\t%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%s\t%d\t%s\t%s\n", + p.Statement.BlockNumber, + p.Statement.TransactionIndex, + p.Statement.LogIndex, + corrIndexStr, + p.CorrectionReason, + assetShort, + holderShort, + p.BeginBalance, + p.EventAmount, + p.Statement.TentativeBalance, + checkpoint, + check1, + check2, + p.Reconciled(isFinal), + ) + + currentAsset = p.Statement.AssetAddress + lastTentative = p.Statement.TentativeBalance + } + + if currentAsset != "" { + r.rowIndexMu.Lock() + r.rowIndexCounter++ + r.rowIndexMu.Unlock() + fmt.Println(strings.Repeat("-", 120)) + fmt.Printf("-\t-\t-\t-\t-\t%s\t-\t0\t0\t%d\t-\t0\t-\t-\n", + shortenAddress(currentAsset), + lastTentative, + ) + fmt.Println() + } + + if len(postings) > 0 { + lastPosting := postings[len(postings)-1] + fmt.Println(strings.Repeat("=", 120)) + fmt.Printf("-\t-\t-\t-\t-\tTotal\t-\t0\t0\t%d\t-\t0\t-\t-\n", + lastPosting.Statement.TentativeBalance, + ) + fmt.Println() + } +} diff --git a/accounting/rpc.go b/accounting/rpc.go new file mode 100644 index 0000000..fe0a303 --- /dev/null +++ b/accounting/rpc.go @@ -0,0 +1,87 @@ +package main + +import ( + "encoding/csv" + "fmt" + "os" + "strconv" + "strings" +) + +var ( + conn Connection + eventAmounts map[string]int64 + mapping map[string]int64 + logsByTx map[int][]Posting +) + +// Connection provides on-chain balance lookups +type Connection struct{} + +func (c *Connection) GetBalanceAtToken(asset, holder, hexBlockNo string) (int64, bool) { + blockNo, _ := strconv.ParseInt(hexBlockNo[2:], 16, 64) + key := fmt.Sprintf("%d|%s|%s", blockNo, asset, holder) + if bal, ok := mapping[key]; ok { + return bal, true + } + return 0, false +} + +func initData() { + eventAmounts = make(map[string]int64) + mapping = make(map[string]int64) + logsByTx = make(map[int][]Posting) + + appsFile, _ := os.Open("tests/apps.csv") + defer appsFile.Close() + appsReader := csv.NewReader(appsFile) + appsRecords, _ := appsReader.ReadAll() + for _, record := range appsRecords[1:] { + block, _ := strconv.Atoi(record[0]) + tx, _ := strconv.Atoi(record[1]) + apps = append(apps, [2]int{block, tx}) + } + + eaFile, _ := os.Open("tests/eventAmounts.csv") + defer eaFile.Close() + eaReader := csv.NewReader(eaFile) + eaRecords, _ := eaReader.ReadAll() + for _, record := range eaRecords[1:] { + key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) + amount, _ := strconv.ParseInt(record[3], 10, 64) + eventAmounts[key] = amount + } + + logsFile, _ := os.Open("tests/logsByTransaction.csv") + defer logsFile.Close() + logsReader := csv.NewReader(logsFile) + logsRecords, _ := logsReader.ReadAll() + for _, record := range logsRecords[1:] { + block, _ := strconv.Atoi(record[0]) + tx, _ := strconv.Atoi(record[1]) + log, _ := strconv.Atoi(record[2]) + p := Posting{} + p.Statement.BlockNumber = block + p.Statement.TransactionIndex = tx + p.Statement.LogIndex = log + p.Statement.AssetAddress = strings.ToLower(record[3]) + p.Statement.AccountedFor = strings.ToLower(record[4]) + p.Statement.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) + key := mapKey(block, tx, 0) + logsByTx[key] = append(logsByTx[key], p) + } + + mapFile, _ := os.Open("tests/mapping.csv") + defer mapFile.Close() + mapReader := csv.NewReader(mapFile) + mapRecords, _ := mapReader.ReadAll() + for _, record := range mapRecords[1:] { + key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) + bal, _ := strconv.ParseInt(record[3], 10, 64) + mapping[key] = bal + } +} + +func mapKey(block, txid, logid int) int { + return block*10000001 + txid*100001 + logid +} diff --git a/accounting/tests/apps.csv b/accounting/tests/apps.csv new file mode 100644 index 0000000..4fa8cbc --- /dev/null +++ b/accounting/tests/apps.csv @@ -0,0 +1,13 @@ +block,tx +12,1 +14,200 +14,202 +18,4000 +20,14 +22,30 +25,300 +25,301 +30,400 +30,401 +32,500 +32,501 diff --git a/accounting/tests/eventAmounts.csv b/accounting/tests/eventAmounts.csv new file mode 100644 index 0000000..87081b0 --- /dev/null +++ b/accounting/tests/eventAmounts.csv @@ -0,0 +1,22 @@ +block,tx,log,amount +12,1,0,1000 +14,200,4,200 +14,200,101,200 +14,202,0,600 +18,4000,0,500 +20,14,8,-1300 +22,30,0,500 +22,30,1,300 +22,30,2,700 +25,300,0,1500 +25,300,1,-500 +25,300,2,200 +25,301,0,1000 +30,400,0,750 +30,400,1,250 +30,401,0,500 +32,500,0,500 +32,500,1,50 +32,500,2,50 +32,501,0,600 +32,501,1,300 diff --git a/accounting/tests/logsByTransaction.csv b/accounting/tests/logsByTransaction.csv new file mode 100644 index 0000000..a7d51d8 --- /dev/null +++ b/accounting/tests/logsByTransaction.csv @@ -0,0 +1,22 @@ +block,tx,log,asset,holder,EndOfBlockBalance +12,1,0,0x6,0xf,1000 +14,200,4,0x6,0xf,1000 +14,200,101,0x6,0xf,1000 +14,202,0,0x6,0xf,2000 +18,4000,0,0x5,0xf,500 +20,14,8,0x6,0xf,700 +22,30,0,0x6,0xf,1200 +22,30,1,0x3,0xf,300 +22,30,2,0x4,0xf,700 +25,300,0,0x6,0xf,1500 +25,300,1,0x6,0xf,1000 +25,300,2,0x6,0xf,2400 +25,301,0,0x6,0x9,1000 +30,400,0,0x7,0xf,750 +30,400,1,0x7,0xf,1000 +30,401,0,0x8,0xf,500 +32,500,0,0x9,0xf,600 +32,500,1,0x9,0xf,600 +32,500,2,0x9,0xf,600 +32,501,0,0xA,0xf,600 +32,501,1,0x7,0xf,1300 diff --git a/accounting/tests/mapping.csv b/accounting/tests/mapping.csv new file mode 100644 index 0000000..5d02375 --- /dev/null +++ b/accounting/tests/mapping.csv @@ -0,0 +1,16 @@ +block,asset,holder,balance +12,0x6,0xf,1000 +13,0x6,0xf,1500 +14,0x6,0xf,2000 +18,0x5,0xf,500 +20,0x6,0xf,700 +22,0x6,0xf,1200 +22,0x3,0xf,400 +22,0x4,0xf,700 +25,0x6,0xf,2400 +25,0x6,0x9,800 +30,0x7,0xf,1000 +30,0x8,0xf,500 +32,0x9,0xf,600 +32,0xA,0xf,600 +32,0x7,0xf,1200 From 711d22a02454e6d3817fbefd95f17837de5cc81d Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 21 Feb 2025 22:35:47 -0500 Subject: [PATCH 04/36] Updates accounting example --- accounting/init.go | 72 ++++++++++++++++++++++++++++ accounting/main.go | 117 +++++++++++++++++++++++---------------------- accounting/rpc.go | 63 +----------------------- 3 files changed, 132 insertions(+), 120 deletions(-) create mode 100644 accounting/init.go diff --git a/accounting/init.go b/accounting/init.go new file mode 100644 index 0000000..c83fc8b --- /dev/null +++ b/accounting/init.go @@ -0,0 +1,72 @@ +package main + +import ( + "encoding/csv" + "fmt" + "os" + "strconv" + "strings" + + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" +) + +var ( + eventAmounts map[string]int64 + mapping map[string]int64 + logsByTx map[int][]Posting +) + +func initData() { + eventAmounts = make(map[string]int64) + mapping = make(map[string]int64) + logsByTx = make(map[int][]Posting) + + appsFile, _ := os.Open("tests/apps.csv") + defer appsFile.Close() + appsReader := csv.NewReader(appsFile) + appsRecords, _ := appsReader.ReadAll() + for _, record := range appsRecords[1:] { + block, _ := strconv.Atoi(record[0]) + tx, _ := strconv.Atoi(record[1]) + apps = append(apps, [2]int{block, tx}) + } + + eaFile, _ := os.Open("tests/eventAmounts.csv") + defer eaFile.Close() + eaReader := csv.NewReader(eaFile) + eaRecords, _ := eaReader.ReadAll() + for _, record := range eaRecords[1:] { + key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) + amount, _ := strconv.ParseInt(record[3], 10, 64) + eventAmounts[key] = amount + } + + logsFile, _ := os.Open("tests/logsByTransaction.csv") + defer logsFile.Close() + logsReader := csv.NewReader(logsFile) + logsRecords, _ := logsReader.ReadAll() + for _, record := range logsRecords[1:] { + block, _ := strconv.Atoi(record[0]) + tx, _ := strconv.Atoi(record[1]) + log, _ := strconv.Atoi(record[2]) + p := Posting{} + p.Statement.BlockNumber = base.Blknum(block) + p.Statement.TransactionIndex = base.Txnum(tx) + p.Statement.LogIndex = base.Lognum(log) + p.Statement.AssetAddress = strings.ToLower(record[3]) + p.Statement.AccountedFor = strings.ToLower(record[4]) + p.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) + key := mapKey(block, tx, 0) + logsByTx[key] = append(logsByTx[key], p) + } + + mapFile, _ := os.Open("tests/mapping.csv") + defer mapFile.Close() + mapReader := csv.NewReader(mapFile) + mapRecords, _ := mapReader.ReadAll() + for _, record := range mapRecords[1:] { + key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) + bal, _ := strconv.ParseInt(record[3], 10, 64) + mapping[key] = bal + } +} diff --git a/accounting/main.go b/accounting/main.go index b6f074e..42845a7 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -6,24 +6,26 @@ import ( "strconv" "strings" "sync" + + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" ) // Posting represents a single ledger event or correction type Posting struct { Statement struct { - BlockNumber int - TransactionIndex int - LogIndex int - AssetAddress string - AccountedFor string - CheckpointBalance int64 - TentativeBalance int64 + BlockNumber base.Blknum + TransactionIndex base.Txnum + LogIndex base.Lognum + AssetAddress string + AccountedFor string } - CorrectionIndex int - CorrectionReason string - EventAmount int64 - BeginBalance int64 - RowIndex int + CheckpointBalance int64 + TentativeBalance int64 + CorrectionIndex int + CorrectionReason string + EventAmount int64 + BeginBalance int64 + RowIndex int } func (p Posting) Reconciled(isFinal bool) string { @@ -33,14 +35,14 @@ func (p Posting) Reconciled(isFinal bool) string { if !isFinal { return "unknown" } - return strconv.FormatBool(p.BeginBalance+p.EventAmount == p.Statement.CheckpointBalance) + return strconv.FormatBool(p.BeginBalance+p.EventAmount == p.CheckpointBalance) } type Reconciler struct { mu sync.Mutex addressOfInterest string runningBalances map[string]int64 - seenBlocks map[string]int + seenBlocks map[string]base.Blknum correctionCounter int counterMu sync.Mutex rowIndexCounter int @@ -48,7 +50,9 @@ type Reconciler struct { } var ( - apps [][2]int + apps [][2]int + EndOfBlockSentinel = string("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + EndOfStreamSentinel = string("0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead") ) func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { @@ -80,8 +84,8 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * } r.counterMu.Unlock() correction.Statement = p.Statement - correction.Statement.TentativeBalance = onChain - correction.Statement.CheckpointBalance = onChain + correction.TentativeBalance = onChain + correction.CheckpointBalance = onChain r.rowIndexMu.Lock() r.rowIndexCounter++ correction.RowIndex = r.rowIndexCounter @@ -112,8 +116,8 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * r.mu.Lock() runningKey := fmt.Sprintf("%s|%s", k.asset, k.holder) p.BeginBalance = r.runningBalances[runningKey] - p.Statement.TentativeBalance = p.BeginBalance + p.EventAmount - r.runningBalances[runningKey] = p.Statement.TentativeBalance + p.TentativeBalance = p.BeginBalance + p.EventAmount + r.runningBalances[runningKey] = p.TentativeBalance r.rowIndexMu.Lock() r.rowIndexCounter++ p.RowIndex = r.rowIndexCounter @@ -152,14 +156,12 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) block, tx := app[0], app[1] if block != prevBlock && prevBlock != 0 { globalStream <- Posting{Statement: struct { - BlockNumber int - TransactionIndex int - LogIndex int - AssetAddress string - AccountedFor string - CheckpointBalance int64 - TentativeBalance int64 - }{BlockNumber: prevBlock, AssetAddress: "END_OF_BLOCK"}} + BlockNumber base.Blknum + TransactionIndex base.Txnum + LogIndex base.Lognum + AssetAddress string + AccountedFor string + }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} } for p := range r.GetPostingChannel(block, tx) { globalStream <- p @@ -168,33 +170,29 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) } if prevBlock != 0 { globalStream <- Posting{Statement: struct { - BlockNumber int - TransactionIndex int - LogIndex int - AssetAddress string - AccountedFor string - CheckpointBalance int64 - TentativeBalance int64 - }{BlockNumber: prevBlock, AssetAddress: "END_OF_BLOCK"}} + BlockNumber base.Blknum + TransactionIndex base.Txnum + LogIndex base.Lognum + AssetAddress string + AccountedFor string + }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} } globalStream <- Posting{Statement: struct { - BlockNumber int - TransactionIndex int - LogIndex int - AssetAddress string - AccountedFor string - CheckpointBalance int64 - TentativeBalance int64 - }{AssetAddress: "END_OF_STREAM"}} + BlockNumber base.Blknum + TransactionIndex base.Txnum + LogIndex base.Lognum + AssetAddress string + AccountedFor string + }{AssetAddress: EndOfStreamSentinel}} }() var buffer []Posting for posting := range globalStream { switch posting.Statement.AssetAddress { - case "END_OF_BLOCK": + case EndOfBlockSentinel: r.flushBlock(buffer, modelChan, wg) buffer = nil - case "END_OF_STREAM": + case EndOfStreamSentinel: if len(buffer) > 0 { r.flushBlock(buffer, modelChan, wg) } @@ -206,6 +204,9 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) } func shortenAddress(addr string) string { + if len(addr) == 42 { + return addr[:2] + addr[len(addr)-1:] + } if len(addr) > 8 { return addr[:8] } @@ -219,7 +220,7 @@ func main() { r := &Reconciler{ addressOfInterest: "0xf", runningBalances: make(map[string]int64), - seenBlocks: make(map[string]int), + seenBlocks: make(map[string]base.Blknum), } done := make(chan struct{}) @@ -254,18 +255,18 @@ func main() { if p.CorrectionIndex == 0 { lastTx := 0 for _, app := range apps { - if app[0] == p.Statement.BlockNumber && app[1] > lastTx { + if base.Blknum(app[0]) == p.Statement.BlockNumber && app[1] > lastTx { lastTx = app[1] } } - if p.Statement.TransactionIndex == lastTx { + if p.Statement.TransactionIndex == base.Txnum(lastTx) { lastLog := 0 - for _, logP := range logsByTx[mapKey(p.Statement.BlockNumber, lastTx, 0)] { - if logP.Statement.LogIndex > lastLog { - lastLog = logP.Statement.LogIndex + for _, logP := range logsByTx[mapKey(int(p.Statement.BlockNumber), lastTx, 0)] { + if logP.Statement.LogIndex > base.Lognum(lastLog) { + lastLog = int(logP.Statement.LogIndex) } } - if p.Statement.LogIndex == lastLog { + if p.Statement.LogIndex == base.Lognum(lastLog) { isFinal = true } } @@ -276,13 +277,13 @@ func main() { checkpoint := "-" if reconciled := p.Reconciled(isFinal); reconciled != "unknown" { - checkpoint = fmt.Sprintf("%d", p.Statement.CheckpointBalance) + checkpoint = fmt.Sprintf("%d", p.CheckpointBalance) } - check1 := p.BeginBalance + p.EventAmount - p.Statement.TentativeBalance + check1 := p.BeginBalance + p.EventAmount - p.TentativeBalance check2 := "-" if p.CorrectionIndex != 0 || isFinal { - check2 = fmt.Sprintf("%d", p.BeginBalance+p.EventAmount-p.Statement.CheckpointBalance) + check2 = fmt.Sprintf("%d", p.BeginBalance+p.EventAmount-p.CheckpointBalance) } corrIndexStr := "-" @@ -312,7 +313,7 @@ func main() { holderShort, p.BeginBalance, p.EventAmount, - p.Statement.TentativeBalance, + p.TentativeBalance, checkpoint, check1, check2, @@ -320,7 +321,7 @@ func main() { ) currentAsset = p.Statement.AssetAddress - lastTentative = p.Statement.TentativeBalance + lastTentative = p.TentativeBalance } if currentAsset != "" { @@ -339,7 +340,7 @@ func main() { lastPosting := postings[len(postings)-1] fmt.Println(strings.Repeat("=", 120)) fmt.Printf("-\t-\t-\t-\t-\tTotal\t-\t0\t0\t%d\t-\t0\t-\t-\n", - lastPosting.Statement.TentativeBalance, + lastPosting.TentativeBalance, ) fmt.Println() } diff --git a/accounting/rpc.go b/accounting/rpc.go index fe0a303..3c52ab0 100644 --- a/accounting/rpc.go +++ b/accounting/rpc.go @@ -1,18 +1,12 @@ package main import ( - "encoding/csv" "fmt" - "os" "strconv" - "strings" ) var ( - conn Connection - eventAmounts map[string]int64 - mapping map[string]int64 - logsByTx map[int][]Posting + conn Connection ) // Connection provides on-chain balance lookups @@ -27,61 +21,6 @@ func (c *Connection) GetBalanceAtToken(asset, holder, hexBlockNo string) (int64, return 0, false } -func initData() { - eventAmounts = make(map[string]int64) - mapping = make(map[string]int64) - logsByTx = make(map[int][]Posting) - - appsFile, _ := os.Open("tests/apps.csv") - defer appsFile.Close() - appsReader := csv.NewReader(appsFile) - appsRecords, _ := appsReader.ReadAll() - for _, record := range appsRecords[1:] { - block, _ := strconv.Atoi(record[0]) - tx, _ := strconv.Atoi(record[1]) - apps = append(apps, [2]int{block, tx}) - } - - eaFile, _ := os.Open("tests/eventAmounts.csv") - defer eaFile.Close() - eaReader := csv.NewReader(eaFile) - eaRecords, _ := eaReader.ReadAll() - for _, record := range eaRecords[1:] { - key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) - amount, _ := strconv.ParseInt(record[3], 10, 64) - eventAmounts[key] = amount - } - - logsFile, _ := os.Open("tests/logsByTransaction.csv") - defer logsFile.Close() - logsReader := csv.NewReader(logsFile) - logsRecords, _ := logsReader.ReadAll() - for _, record := range logsRecords[1:] { - block, _ := strconv.Atoi(record[0]) - tx, _ := strconv.Atoi(record[1]) - log, _ := strconv.Atoi(record[2]) - p := Posting{} - p.Statement.BlockNumber = block - p.Statement.TransactionIndex = tx - p.Statement.LogIndex = log - p.Statement.AssetAddress = strings.ToLower(record[3]) - p.Statement.AccountedFor = strings.ToLower(record[4]) - p.Statement.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) - key := mapKey(block, tx, 0) - logsByTx[key] = append(logsByTx[key], p) - } - - mapFile, _ := os.Open("tests/mapping.csv") - defer mapFile.Close() - mapReader := csv.NewReader(mapFile) - mapRecords, _ := mapReader.ReadAll() - for _, record := range mapRecords[1:] { - key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) - bal, _ := strconv.ParseInt(record[3], 10, 64) - mapping[key] = bal - } -} - func mapKey(block, txid, logid int) int { return block*10000001 + txid*100001 + logid } From af5e21e50690f8a3d81a5eae71ecf415e10ab990 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 21 Feb 2025 23:05:12 -0500 Subject: [PATCH 05/36] Updates accounting example --- accounting/init.go | 5 +++-- accounting/main.go | 28 ++++++++++++++-------------- accounting/rpc.go | 6 ++++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/accounting/init.go b/accounting/init.go index c83fc8b..5018198 100644 --- a/accounting/init.go +++ b/accounting/init.go @@ -54,7 +54,7 @@ func initData() { p.Statement.TransactionIndex = base.Txnum(tx) p.Statement.LogIndex = base.Lognum(log) p.Statement.AssetAddress = strings.ToLower(record[3]) - p.Statement.AccountedFor = strings.ToLower(record[4]) + p.Statement.Holder = base.HexToAddress(record[4]) p.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) key := mapKey(block, tx, 0) logsByTx[key] = append(logsByTx[key], p) @@ -65,7 +65,8 @@ func initData() { mapReader := csv.NewReader(mapFile) mapRecords, _ := mapReader.ReadAll() for _, record := range mapRecords[1:] { - key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) + holder := base.HexToAddress(record[2]) + key := fmt.Sprintf("%s|%s|%s", record[0], record[1], holder.Hex()) bal, _ := strconv.ParseInt(record[3], 10, 64) mapping[key] = bal } diff --git a/accounting/main.go b/accounting/main.go index 42845a7..5b8e075 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -17,7 +17,7 @@ type Posting struct { TransactionIndex base.Txnum LogIndex base.Lognum AssetAddress string - AccountedFor string + Holder base.Address } CheckpointBalance int64 TentativeBalance int64 @@ -40,7 +40,7 @@ func (p Posting) Reconciled(isFinal bool) string { type Reconciler struct { mu sync.Mutex - addressOfInterest string + addressOfInterest base.Address runningBalances map[string]int64 seenBlocks map[string]base.Blknum correctionCounter int @@ -60,7 +60,7 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { go func() { defer close(ch) for _, p := range logsByTx[mapKey(block, tx, 0)] { - if p.Statement.AccountedFor != r.addressOfInterest { + if p.Statement.Holder != r.addressOfInterest { continue } eaKey := fmt.Sprintf("%d|%d|%d", block, tx, p.Statement.LogIndex) @@ -72,7 +72,10 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { } func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg *sync.WaitGroup) { - type key struct{ asset, holder string } + type key struct { + asset string + holder base.Address + } correctingEntry := func(k key, reason string, onChain, currentBal int64, p *Posting) Posting { r.counterMu.Lock() r.correctionCounter++ @@ -90,14 +93,14 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * r.rowIndexCounter++ correction.RowIndex = r.rowIndexCounter r.rowIndexMu.Unlock() - r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] = onChain + r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder.Hex())] = onChain wg.Add(1) return correction } lastPostings := make(map[key]int) for i, p := range buffer { - k := key{p.Statement.AssetAddress, p.Statement.AccountedFor} + k := key{p.Statement.AssetAddress, p.Statement.Holder} seenKey := fmt.Sprintf("%d|%s|%s", p.Statement.BlockNumber, k.asset, k.holder) if _, seen := r.seenBlocks[seenKey]; !seen { @@ -160,7 +163,7 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) TransactionIndex base.Txnum LogIndex base.Lognum AssetAddress string - AccountedFor string + Holder base.Address }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} } for p := range r.GetPostingChannel(block, tx) { @@ -174,7 +177,7 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) TransactionIndex base.Txnum LogIndex base.Lognum AssetAddress string - AccountedFor string + Holder base.Address }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} } globalStream <- Posting{Statement: struct { @@ -182,7 +185,7 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) TransactionIndex base.Txnum LogIndex base.Lognum AssetAddress string - AccountedFor string + Holder base.Address }{AssetAddress: EndOfStreamSentinel}} }() @@ -207,9 +210,6 @@ func shortenAddress(addr string) string { if len(addr) == 42 { return addr[:2] + addr[len(addr)-1:] } - if len(addr) > 8 { - return addr[:8] - } return addr } @@ -218,7 +218,7 @@ func main() { modelChan := make(chan Posting, 1000) var wg sync.WaitGroup r := &Reconciler{ - addressOfInterest: "0xf", + addressOfInterest: base.HexToAddress("0xf"), runningBalances: make(map[string]int64), seenBlocks: make(map[string]base.Blknum), } @@ -273,7 +273,7 @@ func main() { } assetShort := shortenAddress(p.Statement.AssetAddress) - holderShort := shortenAddress(p.Statement.AccountedFor) + holderShort := shortenAddress(p.Statement.Holder.Hex()) checkpoint := "-" if reconciled := p.Reconciled(isFinal); reconciled != "unknown" { diff --git a/accounting/rpc.go b/accounting/rpc.go index 3c52ab0..f14a8de 100644 --- a/accounting/rpc.go +++ b/accounting/rpc.go @@ -3,6 +3,8 @@ package main import ( "fmt" "strconv" + + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" ) var ( @@ -12,9 +14,9 @@ var ( // Connection provides on-chain balance lookups type Connection struct{} -func (c *Connection) GetBalanceAtToken(asset, holder, hexBlockNo string) (int64, bool) { +func (c *Connection) GetBalanceAtToken(asset string, holder base.Address, hexBlockNo string) (int64, bool) { blockNo, _ := strconv.ParseInt(hexBlockNo[2:], 16, 64) - key := fmt.Sprintf("%d|%s|%s", blockNo, asset, holder) + key := fmt.Sprintf("%d|%s|%s", blockNo, asset, holder.Hex()) if bal, ok := mapping[key]; ok { return bal, true } From a887db681308f7926a0b8de01a324c742daef048 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 21 Feb 2025 23:12:55 -0500 Subject: [PATCH 06/36] Updates accounting example --- accounting/init.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/accounting/init.go b/accounting/init.go index 5018198..2c76aee 100644 --- a/accounting/init.go +++ b/accounting/init.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "strconv" - "strings" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" ) @@ -53,7 +52,7 @@ func initData() { p.Statement.BlockNumber = base.Blknum(block) p.Statement.TransactionIndex = base.Txnum(tx) p.Statement.LogIndex = base.Lognum(log) - p.Statement.AssetAddress = strings.ToLower(record[3]) + p.Statement.AssetAddress = base.HexToAddress(record[3]) p.Statement.Holder = base.HexToAddress(record[4]) p.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) key := mapKey(block, tx, 0) @@ -65,8 +64,9 @@ func initData() { mapReader := csv.NewReader(mapFile) mapRecords, _ := mapReader.ReadAll() for _, record := range mapRecords[1:] { + asset := base.HexToAddress(record[1]) holder := base.HexToAddress(record[2]) - key := fmt.Sprintf("%s|%s|%s", record[0], record[1], holder.Hex()) + key := fmt.Sprintf("%s|%s|%s", record[0], asset.Hex(), holder.Hex()) bal, _ := strconv.ParseInt(record[3], 10, 64) mapping[key] = bal } From 07e1760dbd82373b0be7e86ab0c05b151af0a7e0 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 21 Feb 2025 23:13:00 -0500 Subject: [PATCH 07/36] Updates accounting example --- accounting/main.go | 27 ++++++++++++++------------- accounting/rpc.go | 4 ++-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 5b8e075..93e30db 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -16,7 +16,7 @@ type Posting struct { BlockNumber base.Blknum TransactionIndex base.Txnum LogIndex base.Lognum - AssetAddress string + AssetAddress base.Address Holder base.Address } CheckpointBalance int64 @@ -51,8 +51,8 @@ type Reconciler struct { var ( apps [][2]int - EndOfBlockSentinel = string("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - EndOfStreamSentinel = string("0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead") + EndOfBlockSentinel = base.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") + EndOfStreamSentinel = base.HexToAddress("0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead") ) func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { @@ -73,7 +73,7 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg *sync.WaitGroup) { type key struct { - asset string + asset base.Address holder base.Address } correctingEntry := func(k key, reason string, onChain, currentBal int64, p *Posting) Posting { @@ -162,7 +162,7 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) BlockNumber base.Blknum TransactionIndex base.Txnum LogIndex base.Lognum - AssetAddress string + AssetAddress base.Address Holder base.Address }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} } @@ -176,7 +176,7 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) BlockNumber base.Blknum TransactionIndex base.Txnum LogIndex base.Lognum - AssetAddress string + AssetAddress base.Address Holder base.Address }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} } @@ -184,7 +184,7 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) BlockNumber base.Blknum TransactionIndex base.Txnum LogIndex base.Lognum - AssetAddress string + AssetAddress base.Address Holder base.Address }{AssetAddress: EndOfStreamSentinel}} }() @@ -206,7 +206,8 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) } } -func shortenAddress(addr string) string { +func shortenAddress(address base.Address) string { + addr := address.Hex() if len(addr) == 42 { return addr[:2] + addr[len(addr)-1:] } @@ -244,11 +245,11 @@ func main() { if postings[i].Statement.AssetAddress == postings[j].Statement.AssetAddress { return postings[i].RowIndex < postings[j].RowIndex } - return postings[i].Statement.AssetAddress < postings[j].Statement.AssetAddress + return postings[i].Statement.AssetAddress.LessThan(postings[j].Statement.AssetAddress) }) fmt.Println("Block\tTx\tLog\tCorrection\tReason\tAsset\tHolder\tBeginBal\tAmount\tTentative\tCheckpoint\tCheck1\tCheck2\tReconciled") - currentAsset := "" + currentAsset := base.ZeroAddr var lastTentative int64 for _, p := range postings { isFinal := false @@ -273,7 +274,7 @@ func main() { } assetShort := shortenAddress(p.Statement.AssetAddress) - holderShort := shortenAddress(p.Statement.Holder.Hex()) + holderShort := shortenAddress(p.Statement.Holder) checkpoint := "-" if reconciled := p.Reconciled(isFinal); reconciled != "unknown" { @@ -291,7 +292,7 @@ func main() { corrIndexStr = fmt.Sprintf("%d", p.CorrectionIndex) } - if currentAsset != "" && currentAsset != p.Statement.AssetAddress { + if currentAsset != base.ZeroAddr && currentAsset != p.Statement.AssetAddress { r.rowIndexMu.Lock() r.rowIndexCounter++ r.rowIndexMu.Unlock() @@ -324,7 +325,7 @@ func main() { lastTentative = p.TentativeBalance } - if currentAsset != "" { + if currentAsset != base.ZeroAddr { r.rowIndexMu.Lock() r.rowIndexCounter++ r.rowIndexMu.Unlock() diff --git a/accounting/rpc.go b/accounting/rpc.go index f14a8de..28741a8 100644 --- a/accounting/rpc.go +++ b/accounting/rpc.go @@ -14,9 +14,9 @@ var ( // Connection provides on-chain balance lookups type Connection struct{} -func (c *Connection) GetBalanceAtToken(asset string, holder base.Address, hexBlockNo string) (int64, bool) { +func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, hexBlockNo string) (int64, bool) { blockNo, _ := strconv.ParseInt(hexBlockNo[2:], 16, 64) - key := fmt.Sprintf("%d|%s|%s", blockNo, asset, holder.Hex()) + key := fmt.Sprintf("%d|%s|%s", blockNo, asset.Hex(), holder.Hex()) if bal, ok := mapping[key]; ok { return bal, true } From a643996dd2a76e0dedcd553c98dad05ebfed3ab9 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 21 Feb 2025 23:17:07 -0500 Subject: [PATCH 08/36] Cleanings --- accounting/main.go | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 93e30db..ca945b0 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -8,17 +8,12 @@ import ( "sync" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) // Posting represents a single ledger event or correction type Posting struct { - Statement struct { - BlockNumber base.Blknum - TransactionIndex base.Txnum - LogIndex base.Lognum - AssetAddress base.Address - Holder base.Address - } + types.Statement CheckpointBalance int64 TentativeBalance int64 CorrectionIndex int @@ -158,13 +153,10 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) for _, app := range apps { block, tx := app[0], app[1] if block != prevBlock && prevBlock != 0 { - globalStream <- Posting{Statement: struct { - BlockNumber base.Blknum - TransactionIndex base.Txnum - LogIndex base.Lognum - AssetAddress base.Address - Holder base.Address - }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} + globalStream <- Posting{Statement: types.Statement{ + BlockNumber: base.Blknum(prevBlock), + AssetAddress: EndOfBlockSentinel, + }} } for p := range r.GetPostingChannel(block, tx) { globalStream <- p @@ -172,21 +164,14 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) prevBlock = block } if prevBlock != 0 { - globalStream <- Posting{Statement: struct { - BlockNumber base.Blknum - TransactionIndex base.Txnum - LogIndex base.Lognum - AssetAddress base.Address - Holder base.Address - }{BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel}} + globalStream <- Posting{Statement: types.Statement{ + BlockNumber: base.Blknum(prevBlock), + AssetAddress: EndOfBlockSentinel, + }} } - globalStream <- Posting{Statement: struct { - BlockNumber base.Blknum - TransactionIndex base.Txnum - LogIndex base.Lognum - AssetAddress base.Address - Holder base.Address - }{AssetAddress: EndOfStreamSentinel}} + globalStream <- Posting{Statement: types.Statement{ + AssetAddress: EndOfStreamSentinel, + }} }() var buffer []Posting From d36c1a18f5df9aef5012ac036cccd857090370d1 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 23 Feb 2025 08:13:01 -0500 Subject: [PATCH 09/36] Isolates Posting, renames testing files --- accounting/.gitignore | 1 + accounting/init.go | 4 +- accounting/main.go | 129 +----------------- accounting/posting.go | 52 +++++++ accounting/tests/apps.csv | 2 +- .../tests/{mapping.csv => balances.csv} | 0 accounting/tests/eventAmounts.csv | 2 +- .../tests/{logsByTransaction.csv => logs.csv} | 2 +- 8 files changed, 60 insertions(+), 132 deletions(-) create mode 100644 accounting/posting.go rename accounting/tests/{mapping.csv => balances.csv} (100%) rename accounting/tests/{logsByTransaction.csv => logs.csv} (95%) diff --git a/accounting/.gitignore b/accounting/.gitignore index c1a372c..6b658f3 100644 --- a/accounting/.gitignore +++ b/accounting/.gitignore @@ -1,3 +1,4 @@ +file one two ick diff --git a/accounting/init.go b/accounting/init.go index 2c76aee..20c5acd 100644 --- a/accounting/init.go +++ b/accounting/init.go @@ -40,7 +40,7 @@ func initData() { eventAmounts[key] = amount } - logsFile, _ := os.Open("tests/logsByTransaction.csv") + logsFile, _ := os.Open("tests/logs.csv") defer logsFile.Close() logsReader := csv.NewReader(logsFile) logsRecords, _ := logsReader.ReadAll() @@ -59,7 +59,7 @@ func initData() { logsByTx[key] = append(logsByTx[key], p) } - mapFile, _ := os.Open("tests/mapping.csv") + mapFile, _ := os.Open("tests/balances.csv") defer mapFile.Close() mapReader := csv.NewReader(mapFile) mapRecords, _ := mapReader.ReadAll() diff --git a/accounting/main.go b/accounting/main.go index ca945b0..e3d36a0 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -2,37 +2,12 @@ package main import ( "fmt" - "sort" - "strconv" - "strings" "sync" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) -// Posting represents a single ledger event or correction -type Posting struct { - types.Statement - CheckpointBalance int64 - TentativeBalance int64 - CorrectionIndex int - CorrectionReason string - EventAmount int64 - BeginBalance int64 - RowIndex int -} - -func (p Posting) Reconciled(isFinal bool) string { - if p.CorrectionIndex != 0 { - return "true" - } - if !isFinal { - return "unknown" - } - return strconv.FormatBool(p.BeginBalance+p.EventAmount == p.CheckpointBalance) -} - type Reconciler struct { mu sync.Mutex addressOfInterest base.Address @@ -226,108 +201,8 @@ func main() { <-done wg.Wait() - sort.Slice(postings, func(i, j int) bool { - if postings[i].Statement.AssetAddress == postings[j].Statement.AssetAddress { - return postings[i].RowIndex < postings[j].RowIndex - } - return postings[i].Statement.AssetAddress.LessThan(postings[j].Statement.AssetAddress) - }) - - fmt.Println("Block\tTx\tLog\tCorrection\tReason\tAsset\tHolder\tBeginBal\tAmount\tTentative\tCheckpoint\tCheck1\tCheck2\tReconciled") - currentAsset := base.ZeroAddr - var lastTentative int64 + printHeader() for _, p := range postings { - isFinal := false - if p.CorrectionIndex == 0 { - lastTx := 0 - for _, app := range apps { - if base.Blknum(app[0]) == p.Statement.BlockNumber && app[1] > lastTx { - lastTx = app[1] - } - } - if p.Statement.TransactionIndex == base.Txnum(lastTx) { - lastLog := 0 - for _, logP := range logsByTx[mapKey(int(p.Statement.BlockNumber), lastTx, 0)] { - if logP.Statement.LogIndex > base.Lognum(lastLog) { - lastLog = int(logP.Statement.LogIndex) - } - } - if p.Statement.LogIndex == base.Lognum(lastLog) { - isFinal = true - } - } - } - - assetShort := shortenAddress(p.Statement.AssetAddress) - holderShort := shortenAddress(p.Statement.Holder) - - checkpoint := "-" - if reconciled := p.Reconciled(isFinal); reconciled != "unknown" { - checkpoint = fmt.Sprintf("%d", p.CheckpointBalance) - } - - check1 := p.BeginBalance + p.EventAmount - p.TentativeBalance - check2 := "-" - if p.CorrectionIndex != 0 || isFinal { - check2 = fmt.Sprintf("%d", p.BeginBalance+p.EventAmount-p.CheckpointBalance) - } - - corrIndexStr := "-" - if p.CorrectionIndex != 0 { - corrIndexStr = fmt.Sprintf("%d", p.CorrectionIndex) - } - - if currentAsset != base.ZeroAddr && currentAsset != p.Statement.AssetAddress { - r.rowIndexMu.Lock() - r.rowIndexCounter++ - r.rowIndexMu.Unlock() - fmt.Println(strings.Repeat("-", 120)) - fmt.Printf("-\t-\t-\t-\t-\t%s\t-\t0\t0\t%d\t-\t0\t-\t-\n", - shortenAddress(currentAsset), - lastTentative, - ) - fmt.Println() - } - - fmt.Printf("%d\t%d\t%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%s\t%d\t%s\t%s\n", - p.Statement.BlockNumber, - p.Statement.TransactionIndex, - p.Statement.LogIndex, - corrIndexStr, - p.CorrectionReason, - assetShort, - holderShort, - p.BeginBalance, - p.EventAmount, - p.TentativeBalance, - checkpoint, - check1, - check2, - p.Reconciled(isFinal), - ) - - currentAsset = p.Statement.AssetAddress - lastTentative = p.TentativeBalance - } - - if currentAsset != base.ZeroAddr { - r.rowIndexMu.Lock() - r.rowIndexCounter++ - r.rowIndexMu.Unlock() - fmt.Println(strings.Repeat("-", 120)) - fmt.Printf("-\t-\t-\t-\t-\t%s\t-\t0\t0\t%d\t-\t0\t-\t-\n", - shortenAddress(currentAsset), - lastTentative, - ) - fmt.Println() - } - - if len(postings) > 0 { - lastPosting := postings[len(postings)-1] - fmt.Println(strings.Repeat("=", 120)) - fmt.Printf("-\t-\t-\t-\t-\tTotal\t-\t0\t0\t%d\t-\t0\t-\t-\n", - lastPosting.TentativeBalance, - ) - fmt.Println() + p.printStatement() } } diff --git a/accounting/posting.go b/accounting/posting.go new file mode 100644 index 0000000..d7af713 --- /dev/null +++ b/accounting/posting.go @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" +) + +// Posting represents a single ledger event or correction +type Posting struct { + types.Statement + RowIndex int + CorrectionIndex int + CorrectionReason string + BeginBalance int64 + EventAmount int64 + TentativeBalance int64 + CheckpointBalance int64 +} + +func (p Posting) Reconciled() (bool, bool) { + if p.BeginBalance+p.EventAmount == p.CheckpointBalance { + return true, true + } + return p.BeginBalance+p.EventAmount == p.TentativeBalance, false +} + +func printHeader() { + fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tBegBal\tAmount\tTenBal\tChkBal\tCheck1\tCheck2\tRec\tCp") +} + +func (p *Posting) printStatement() { + reconciles, byCheckpoint := p.Reconciled() + fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%t\t%t\n", + p.Statement.AssetAddress.Display(0, 1), + p.Statement.Holder.Display(0, 1), + p.Statement.BlockNumber, + p.Statement.TransactionIndex, + p.Statement.LogIndex, + p.RowIndex, + p.CorrectionIndex, + p.CorrectionReason, + p.BeginBalance, + p.EventAmount, + p.TentativeBalance, + p.CheckpointBalance, + p.BeginBalance+p.EventAmount-p.TentativeBalance, + p.BeginBalance+p.EventAmount-p.CheckpointBalance, + reconciles, + byCheckpoint, + ) +} diff --git a/accounting/tests/apps.csv b/accounting/tests/apps.csv index 4fa8cbc..4df8070 100644 --- a/accounting/tests/apps.csv +++ b/accounting/tests/apps.csv @@ -2,7 +2,7 @@ block,tx 12,1 14,200 14,202 -18,4000 +18,400 20,14 22,30 25,300 diff --git a/accounting/tests/mapping.csv b/accounting/tests/balances.csv similarity index 100% rename from accounting/tests/mapping.csv rename to accounting/tests/balances.csv diff --git a/accounting/tests/eventAmounts.csv b/accounting/tests/eventAmounts.csv index 87081b0..0895b15 100644 --- a/accounting/tests/eventAmounts.csv +++ b/accounting/tests/eventAmounts.csv @@ -3,7 +3,7 @@ block,tx,log,amount 14,200,4,200 14,200,101,200 14,202,0,600 -18,4000,0,500 +18,400,0,500 20,14,8,-1300 22,30,0,500 22,30,1,300 diff --git a/accounting/tests/logsByTransaction.csv b/accounting/tests/logs.csv similarity index 95% rename from accounting/tests/logsByTransaction.csv rename to accounting/tests/logs.csv index a7d51d8..0b6609a 100644 --- a/accounting/tests/logsByTransaction.csv +++ b/accounting/tests/logs.csv @@ -3,7 +3,7 @@ block,tx,log,asset,holder,EndOfBlockBalance 14,200,4,0x6,0xf,1000 14,200,101,0x6,0xf,1000 14,202,0,0x6,0xf,2000 -18,4000,0,0x5,0xf,500 +18,400,0,0x5,0xf,500 20,14,8,0x6,0xf,700 22,30,0,0x6,0xf,1200 22,30,1,0x3,0xf,300 From 218b8458bb93af8cb7813fa893710a482f910206 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 23 Feb 2025 08:24:55 -0500 Subject: [PATCH 10/36] Removes seperate amountsMap --- accounting/.gitignore | 2 -- accounting/init.go | 21 ++++----------- accounting/main.go | 6 ++--- accounting/one/file | 25 ++++++++++++++++++ accounting/rpc.go | 4 +-- accounting/tests/eventAmounts.csv | 22 ---------------- accounting/tests/logs.csv | 44 +++++++++++++++---------------- 7 files changed, 56 insertions(+), 68 deletions(-) create mode 100644 accounting/one/file delete mode 100644 accounting/tests/eventAmounts.csv diff --git a/accounting/.gitignore b/accounting/.gitignore index 6b658f3..0254df6 100644 --- a/accounting/.gitignore +++ b/accounting/.gitignore @@ -1,5 +1,3 @@ -file -one two ick main diff --git a/accounting/init.go b/accounting/init.go index 20c5acd..e5df5ce 100644 --- a/accounting/init.go +++ b/accounting/init.go @@ -10,14 +10,12 @@ import ( ) var ( - eventAmounts map[string]int64 - mapping map[string]int64 - logsByTx map[int][]Posting + balanceMap map[string]int64 + logsByTx map[int][]Posting ) func initData() { - eventAmounts = make(map[string]int64) - mapping = make(map[string]int64) + balanceMap = make(map[string]int64) logsByTx = make(map[int][]Posting) appsFile, _ := os.Open("tests/apps.csv") @@ -30,16 +28,6 @@ func initData() { apps = append(apps, [2]int{block, tx}) } - eaFile, _ := os.Open("tests/eventAmounts.csv") - defer eaFile.Close() - eaReader := csv.NewReader(eaFile) - eaRecords, _ := eaReader.ReadAll() - for _, record := range eaRecords[1:] { - key := fmt.Sprintf("%s|%s|%s", record[0], record[1], record[2]) - amount, _ := strconv.ParseInt(record[3], 10, 64) - eventAmounts[key] = amount - } - logsFile, _ := os.Open("tests/logs.csv") defer logsFile.Close() logsReader := csv.NewReader(logsFile) @@ -55,6 +43,7 @@ func initData() { p.Statement.AssetAddress = base.HexToAddress(record[3]) p.Statement.Holder = base.HexToAddress(record[4]) p.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) + p.EventAmount, _ = strconv.ParseInt(record[6], 10, 64) key := mapKey(block, tx, 0) logsByTx[key] = append(logsByTx[key], p) } @@ -68,6 +57,6 @@ func initData() { holder := base.HexToAddress(record[2]) key := fmt.Sprintf("%s|%s|%s", record[0], asset.Hex(), holder.Hex()) bal, _ := strconv.ParseInt(record[3], 10, 64) - mapping[key] = bal + balanceMap[key] = bal } } diff --git a/accounting/main.go b/accounting/main.go index e3d36a0..091dcd9 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -33,8 +33,6 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { if p.Statement.Holder != r.addressOfInterest { continue } - eaKey := fmt.Sprintf("%d|%d|%d", block, tx, p.Statement.LogIndex) - p.EventAmount = eventAmounts[eaKey] ch <- p } }() @@ -75,7 +73,7 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * if _, seen := r.seenBlocks[seenKey]; !seen { prevBlock := fmt.Sprintf("0x%x", p.Statement.BlockNumber-1) - if onChain, ok := conn.GetBalanceAtToken(k.asset, k.holder, prevBlock); ok { + if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, prevBlock); ok { r.mu.Lock() currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] if onChain != currentBal { @@ -109,7 +107,7 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * for k, idx := range lastPostings { p := buffer[idx] hexBlock := fmt.Sprintf("0x%x", p.Statement.BlockNumber) - if onChain, ok := conn.GetBalanceAtToken(k.asset, k.holder, hexBlock); ok { + if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, hexBlock); ok { r.mu.Lock() currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] if onChain != currentBal { diff --git a/accounting/one/file b/accounting/one/file new file mode 100644 index 0000000..678988d --- /dev/null +++ b/accounting/one/file @@ -0,0 +1,25 @@ +Asset Holder Block Tx Log Row Corr Reason BegBal Amount TenBal ChkBal Check1 Check2 Rec Cp +0x6 0xf 12 1 0 1 0 0 1000 1000 1000 0 0 true true +0x6 0xf 14 200 4 2 1 mis 1000 500 1500 1500 0 0 true true +0x6 0xf 14 200 4 3 0 1500 200 1700 1000 0 700 true false +0x6 0xf 14 200 101 4 0 1700 200 1900 1000 0 900 true false +0x6 0xf 14 202 0 5 0 1900 600 2500 2000 0 500 true false +0x6 0xf 14 202 0 6 2 imb 2500 -500 2000 2000 0 0 true true +0x5 0xf 18 400 0 7 0 0 500 500 500 0 0 true true +0x6 0xf 20 14 8 8 0 2000 -1300 700 700 0 0 true true +0x6 0xf 22 30 0 9 0 700 500 1200 1200 0 0 true true +0x3 0xf 22 30 1 10 0 0 300 300 300 0 0 true true +0x4 0xf 22 30 2 11 0 0 700 700 700 0 0 true true +0x3 0xf 22 30 1 12 3 imb 300 100 400 400 0 0 true true +0x6 0xf 25 300 0 13 0 1200 1500 2700 1500 0 1200 true false +0x6 0xf 25 300 1 14 0 2700 -500 2200 1000 0 1200 true false +0x6 0xf 25 300 2 15 0 2200 200 2400 2400 0 0 true true +0x7 0xf 30 400 0 16 0 0 750 750 750 0 0 true true +0x7 0xf 30 400 1 17 0 750 250 1000 1000 0 0 true true +0x8 0xf 30 401 0 18 0 0 500 500 500 0 0 true true +0x9 0xf 32 500 0 19 0 0 500 500 600 0 -100 true false +0x9 0xf 32 500 1 20 0 500 50 550 600 0 -50 true false +0x9 0xf 32 500 2 21 0 550 50 600 600 0 0 true true +0xa 0xf 32 501 0 22 0 0 600 600 600 0 0 true true +0x7 0xf 32 501 1 23 0 1000 300 1300 1300 0 0 true true +0x7 0xf 32 501 1 24 4 imb 1300 -100 1200 1200 0 0 true true diff --git a/accounting/rpc.go b/accounting/rpc.go index 28741a8..9606f75 100644 --- a/accounting/rpc.go +++ b/accounting/rpc.go @@ -8,7 +8,7 @@ import ( ) var ( - conn Connection + cc Connection ) // Connection provides on-chain balance lookups @@ -17,7 +17,7 @@ type Connection struct{} func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, hexBlockNo string) (int64, bool) { blockNo, _ := strconv.ParseInt(hexBlockNo[2:], 16, 64) key := fmt.Sprintf("%d|%s|%s", blockNo, asset.Hex(), holder.Hex()) - if bal, ok := mapping[key]; ok { + if bal, ok := balanceMap[key]; ok { return bal, true } return 0, false diff --git a/accounting/tests/eventAmounts.csv b/accounting/tests/eventAmounts.csv deleted file mode 100644 index 0895b15..0000000 --- a/accounting/tests/eventAmounts.csv +++ /dev/null @@ -1,22 +0,0 @@ -block,tx,log,amount -12,1,0,1000 -14,200,4,200 -14,200,101,200 -14,202,0,600 -18,400,0,500 -20,14,8,-1300 -22,30,0,500 -22,30,1,300 -22,30,2,700 -25,300,0,1500 -25,300,1,-500 -25,300,2,200 -25,301,0,1000 -30,400,0,750 -30,400,1,250 -30,401,0,500 -32,500,0,500 -32,500,1,50 -32,500,2,50 -32,501,0,600 -32,501,1,300 diff --git a/accounting/tests/logs.csv b/accounting/tests/logs.csv index 0b6609a..d084cfa 100644 --- a/accounting/tests/logs.csv +++ b/accounting/tests/logs.csv @@ -1,22 +1,22 @@ -block,tx,log,asset,holder,EndOfBlockBalance -12,1,0,0x6,0xf,1000 -14,200,4,0x6,0xf,1000 -14,200,101,0x6,0xf,1000 -14,202,0,0x6,0xf,2000 -18,400,0,0x5,0xf,500 -20,14,8,0x6,0xf,700 -22,30,0,0x6,0xf,1200 -22,30,1,0x3,0xf,300 -22,30,2,0x4,0xf,700 -25,300,0,0x6,0xf,1500 -25,300,1,0x6,0xf,1000 -25,300,2,0x6,0xf,2400 -25,301,0,0x6,0x9,1000 -30,400,0,0x7,0xf,750 -30,400,1,0x7,0xf,1000 -30,401,0,0x8,0xf,500 -32,500,0,0x9,0xf,600 -32,500,1,0x9,0xf,600 -32,500,2,0x9,0xf,600 -32,501,0,0xA,0xf,600 -32,501,1,0x7,0xf,1300 +block,tx,log,asset,holder,checkPoint,amount +12,1,0,0x6,0xf,1000,1000 +14,200,4,0x6,0xf,1000,200 +14,200,101,0x6,0xf,1000,200 +14,202,0,0x6,0xf,2000,600 +18,400,0,0x5,0xf,500,500 +20,14,8,0x6,0xf,700,-1300 +22,30,0,0x6,0xf,1200,500 +22,30,1,0x3,0xf,300,300 +22,30,2,0x4,0xf,700,700 +25,300,0,0x6,0xf,1500,1500 +25,300,1,0x6,0xf,1000,-500 +25,300,2,0x6,0xf,2400,200 +25,301,0,0x6,0x9,1000,1000 +30,400,0,0x7,0xf,750,750 +30,400,1,0x7,0xf,1000,250 +30,401,0,0x8,0xf,500,500 +32,500,0,0x9,0xf,600,500 +32,500,1,0x9,0xf,600,50 +32,500,2,0x9,0xf,600,50 +32,501,0,0xA,0xf,600,600 +32,501,1,0x7,0xf,1300,300 From d5b6a42a02a29b32cf1d07fea94712dde9c023a6 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 23 Feb 2025 08:34:04 -0500 Subject: [PATCH 11/36] Holder out of Statement --- accounting/init.go | 2 +- accounting/main.go | 4 ++-- accounting/posting.go | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/accounting/init.go b/accounting/init.go index e5df5ce..f75c045 100644 --- a/accounting/init.go +++ b/accounting/init.go @@ -41,7 +41,7 @@ func initData() { p.Statement.TransactionIndex = base.Txnum(tx) p.Statement.LogIndex = base.Lognum(log) p.Statement.AssetAddress = base.HexToAddress(record[3]) - p.Statement.Holder = base.HexToAddress(record[4]) + p.Holder = base.HexToAddress(record[4]) p.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) p.EventAmount, _ = strconv.ParseInt(record[6], 10, 64) key := mapKey(block, tx, 0) diff --git a/accounting/main.go b/accounting/main.go index 091dcd9..22640b1 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -30,7 +30,7 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { go func() { defer close(ch) for _, p := range logsByTx[mapKey(block, tx, 0)] { - if p.Statement.Holder != r.addressOfInterest { + if p.Holder != r.addressOfInterest { continue } ch <- p @@ -68,7 +68,7 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * lastPostings := make(map[key]int) for i, p := range buffer { - k := key{p.Statement.AssetAddress, p.Statement.Holder} + k := key{p.Statement.AssetAddress, p.Holder} seenKey := fmt.Sprintf("%d|%s|%s", p.Statement.BlockNumber, k.asset, k.holder) if _, seen := r.seenBlocks[seenKey]; !seen { diff --git a/accounting/posting.go b/accounting/posting.go index d7af713..cf8a86f 100644 --- a/accounting/posting.go +++ b/accounting/posting.go @@ -3,12 +3,14 @@ package main import ( "fmt" + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) // Posting represents a single ledger event or correction type Posting struct { types.Statement + Holder base.Address RowIndex int CorrectionIndex int CorrectionReason string @@ -33,7 +35,7 @@ func (p *Posting) printStatement() { reconciles, byCheckpoint := p.Reconciled() fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%t\t%t\n", p.Statement.AssetAddress.Display(0, 1), - p.Statement.Holder.Display(0, 1), + p.Holder.Display(0, 1), p.Statement.BlockNumber, p.Statement.TransactionIndex, p.Statement.LogIndex, From fdd51c6fd49b8e0d8971313bbc7ddbe67c21d717 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 23 Feb 2025 08:59:48 -0500 Subject: [PATCH 12/36] Fixing --- accounting/posting.go | 1 + 1 file changed, 1 insertion(+) diff --git a/accounting/posting.go b/accounting/posting.go index cf8a86f..d8918ec 100644 --- a/accounting/posting.go +++ b/accounting/posting.go @@ -32,6 +32,7 @@ func printHeader() { } func (p *Posting) printStatement() { + p.Holder = base.HexToAddress("0xf") reconciles, byCheckpoint := p.Reconciled() fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%t\t%t\n", p.Statement.AssetAddress.Display(0, 1), From b0188995748a6e64de045f6ae2451402313273c5 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 23 Feb 2025 09:09:13 -0500 Subject: [PATCH 13/36] Updates GetBalanceAtToken --- accounting/main.go | 6 ++---- accounting/rpc.go | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 22640b1..d4b8cec 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -72,8 +72,7 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * seenKey := fmt.Sprintf("%d|%s|%s", p.Statement.BlockNumber, k.asset, k.holder) if _, seen := r.seenBlocks[seenKey]; !seen { - prevBlock := fmt.Sprintf("0x%x", p.Statement.BlockNumber-1) - if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, prevBlock); ok { + if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber-1); ok { r.mu.Lock() currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] if onChain != currentBal { @@ -106,8 +105,7 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * for k, idx := range lastPostings { p := buffer[idx] - hexBlock := fmt.Sprintf("0x%x", p.Statement.BlockNumber) - if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, hexBlock); ok { + if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber); ok { r.mu.Lock() currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] if onChain != currentBal { diff --git a/accounting/rpc.go b/accounting/rpc.go index 9606f75..0d50c33 100644 --- a/accounting/rpc.go +++ b/accounting/rpc.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "strconv" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" ) @@ -14,9 +13,8 @@ var ( // Connection provides on-chain balance lookups type Connection struct{} -func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, hexBlockNo string) (int64, bool) { - blockNo, _ := strconv.ParseInt(hexBlockNo[2:], 16, 64) - key := fmt.Sprintf("%d|%s|%s", blockNo, asset.Hex(), holder.Hex()) +func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (int64, bool) { + key := fmt.Sprintf("%d|%s|%s", bn, asset.Hex(), holder.Hex()) if bal, ok := balanceMap[key]; ok { return bal, true } From ad0c35f46f87de9c314f0c0ca97b8a47466128ae Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 23 Feb 2025 23:18:38 -0500 Subject: [PATCH 14/36] Cleanings --- accounting/main.go | 37 ++++++++++++++++++------------------- accounting/posting.go | 4 ++-- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index d4b8cec..822ac34 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -15,7 +15,7 @@ type Reconciler struct { seenBlocks map[string]base.Blknum correctionCounter int counterMu sync.Mutex - rowIndexCounter int + statementIndex int rowIndexMu sync.Mutex } @@ -39,7 +39,7 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { return ch } -func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg *sync.WaitGroup) { +func (r *Reconciler) flushBlock(postings []Posting, modelChan chan<- Posting, wg *sync.WaitGroup) { type key struct { asset base.Address holder base.Address @@ -58,8 +58,8 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * correction.TentativeBalance = onChain correction.CheckpointBalance = onChain r.rowIndexMu.Lock() - r.rowIndexCounter++ - correction.RowIndex = r.rowIndexCounter + r.statementIndex++ + correction.StatementId = r.statementIndex r.rowIndexMu.Unlock() r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder.Hex())] = onChain wg.Add(1) @@ -67,7 +67,7 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * } lastPostings := make(map[key]int) - for i, p := range buffer { + for i, p := range postings { k := key{p.Statement.AssetAddress, p.Holder} seenKey := fmt.Sprintf("%d|%s|%s", p.Statement.BlockNumber, k.asset, k.holder) @@ -84,27 +84,26 @@ func (r *Reconciler) flushBlock(buffer []Posting, modelChan chan<- Posting, wg * } r.mu.Lock() - runningKey := fmt.Sprintf("%s|%s", k.asset, k.holder) - p.BeginBalance = r.runningBalances[runningKey] + p.BeginBalance = r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] p.TentativeBalance = p.BeginBalance + p.EventAmount - r.runningBalances[runningKey] = p.TentativeBalance + r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] = p.TentativeBalance r.rowIndexMu.Lock() - r.rowIndexCounter++ - p.RowIndex = r.rowIndexCounter + r.statementIndex++ + p.StatementId = r.statementIndex r.rowIndexMu.Unlock() r.mu.Unlock() - buffer[i] = p + postings[i] = p lastPostings[k] = i } - for _, p := range buffer { + for _, p := range postings { wg.Add(1) modelChan <- p } for k, idx := range lastPostings { - p := buffer[idx] + p := postings[idx] if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber); ok { r.mu.Lock() currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] @@ -145,19 +144,19 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) }} }() - var buffer []Posting + var postings []Posting for posting := range globalStream { switch posting.Statement.AssetAddress { case EndOfBlockSentinel: - r.flushBlock(buffer, modelChan, wg) - buffer = nil + r.flushBlock(postings, modelChan, wg) + postings = nil case EndOfStreamSentinel: - if len(buffer) > 0 { - r.flushBlock(buffer, modelChan, wg) + if len(postings) > 0 { + r.flushBlock(postings, modelChan, wg) } return default: - buffer = append(buffer, posting) + postings = append(postings, posting) } } } diff --git a/accounting/posting.go b/accounting/posting.go index d8918ec..285e5d3 100644 --- a/accounting/posting.go +++ b/accounting/posting.go @@ -11,7 +11,7 @@ import ( type Posting struct { types.Statement Holder base.Address - RowIndex int + StatementId int CorrectionIndex int CorrectionReason string BeginBalance int64 @@ -40,7 +40,7 @@ func (p *Posting) printStatement() { p.Statement.BlockNumber, p.Statement.TransactionIndex, p.Statement.LogIndex, - p.RowIndex, + p.StatementId, p.CorrectionIndex, p.CorrectionReason, p.BeginBalance, From b9ef013fcf8e07da066dca0e876809ec4794ac0a Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 23 Feb 2025 23:59:16 -0500 Subject: [PATCH 15/36] Moves Posting to types --- accounting/init.go | 7 +++--- accounting/main.go | 38 ++++++++++++------------------ accounting/posting.go | 55 ------------------------------------------- 3 files changed, 19 insertions(+), 81 deletions(-) delete mode 100644 accounting/posting.go diff --git a/accounting/init.go b/accounting/init.go index f75c045..bf997cd 100644 --- a/accounting/init.go +++ b/accounting/init.go @@ -7,16 +7,17 @@ import ( "strconv" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) var ( balanceMap map[string]int64 - logsByTx map[int][]Posting + logsByTx map[int][]types.Posting ) func initData() { balanceMap = make(map[string]int64) - logsByTx = make(map[int][]Posting) + logsByTx = make(map[int][]types.Posting) appsFile, _ := os.Open("tests/apps.csv") defer appsFile.Close() @@ -36,7 +37,7 @@ func initData() { block, _ := strconv.Atoi(record[0]) tx, _ := strconv.Atoi(record[1]) log, _ := strconv.Atoi(record[2]) - p := Posting{} + p := types.Posting{} p.Statement.BlockNumber = base.Blknum(block) p.Statement.TransactionIndex = base.Txnum(tx) p.Statement.LogIndex = base.Lognum(log) diff --git a/accounting/main.go b/accounting/main.go index 822ac34..795f244 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -25,8 +25,8 @@ var ( EndOfStreamSentinel = base.HexToAddress("0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead") ) -func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { - ch := make(chan Posting) +func (r *Reconciler) GetPostingChannel(block, tx int) <-chan types.Posting { + ch := make(chan types.Posting) go func() { defer close(ch) for _, p := range logsByTx[mapKey(block, tx, 0)] { @@ -39,15 +39,15 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan Posting { return ch } -func (r *Reconciler) flushBlock(postings []Posting, modelChan chan<- Posting, wg *sync.WaitGroup) { +func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types.Posting, wg *sync.WaitGroup) { type key struct { asset base.Address holder base.Address } - correctingEntry := func(k key, reason string, onChain, currentBal int64, p *Posting) Posting { + correctingEntry := func(k key, reason string, onChain, currentBal int64, p *types.Posting) types.Posting { r.counterMu.Lock() r.correctionCounter++ - correction := Posting{ + correction := types.Posting{ EventAmount: onChain - currentBal, BeginBalance: currentBal, CorrectionIndex: r.correctionCounter, @@ -115,15 +115,15 @@ func (r *Reconciler) flushBlock(postings []Posting, modelChan chan<- Posting, wg } } -func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) { - globalStream := make(chan Posting) +func (r *Reconciler) processStream(modelChan chan<- types.Posting, wg *sync.WaitGroup) { + globalStream := make(chan types.Posting) go func() { defer close(globalStream) var prevBlock int for _, app := range apps { block, tx := app[0], app[1] if block != prevBlock && prevBlock != 0 { - globalStream <- Posting{Statement: types.Statement{ + globalStream <- types.Posting{Statement: types.Statement{ BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel, }} @@ -134,17 +134,17 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) prevBlock = block } if prevBlock != 0 { - globalStream <- Posting{Statement: types.Statement{ + globalStream <- types.Posting{Statement: types.Statement{ BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel, }} } - globalStream <- Posting{Statement: types.Statement{ + globalStream <- types.Posting{Statement: types.Statement{ AssetAddress: EndOfStreamSentinel, }} }() - var postings []Posting + var postings []types.Posting for posting := range globalStream { switch posting.Statement.AssetAddress { case EndOfBlockSentinel: @@ -161,17 +161,9 @@ func (r *Reconciler) processStream(modelChan chan<- Posting, wg *sync.WaitGroup) } } -func shortenAddress(address base.Address) string { - addr := address.Hex() - if len(addr) == 42 { - return addr[:2] + addr[len(addr)-1:] - } - return addr -} - func main() { initData() - modelChan := make(chan Posting, 1000) + modelChan := make(chan types.Posting, 1000) var wg sync.WaitGroup r := &Reconciler{ addressOfInterest: base.HexToAddress("0xf"), @@ -187,7 +179,7 @@ func main() { close(done) }() - var postings []Posting + var postings []types.Posting for p := range modelChan { postings = append(postings, p) wg.Done() @@ -196,8 +188,8 @@ func main() { <-done wg.Wait() - printHeader() + types.PrintHeader() for _, p := range postings { - p.printStatement() + p.PrintStatement() } } diff --git a/accounting/posting.go b/accounting/posting.go deleted file mode 100644 index 285e5d3..0000000 --- a/accounting/posting.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" - "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" -) - -// Posting represents a single ledger event or correction -type Posting struct { - types.Statement - Holder base.Address - StatementId int - CorrectionIndex int - CorrectionReason string - BeginBalance int64 - EventAmount int64 - TentativeBalance int64 - CheckpointBalance int64 -} - -func (p Posting) Reconciled() (bool, bool) { - if p.BeginBalance+p.EventAmount == p.CheckpointBalance { - return true, true - } - return p.BeginBalance+p.EventAmount == p.TentativeBalance, false -} - -func printHeader() { - fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tBegBal\tAmount\tTenBal\tChkBal\tCheck1\tCheck2\tRec\tCp") -} - -func (p *Posting) printStatement() { - p.Holder = base.HexToAddress("0xf") - reconciles, byCheckpoint := p.Reconciled() - fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%t\t%t\n", - p.Statement.AssetAddress.Display(0, 1), - p.Holder.Display(0, 1), - p.Statement.BlockNumber, - p.Statement.TransactionIndex, - p.Statement.LogIndex, - p.StatementId, - p.CorrectionIndex, - p.CorrectionReason, - p.BeginBalance, - p.EventAmount, - p.TentativeBalance, - p.CheckpointBalance, - p.BeginBalance+p.EventAmount-p.TentativeBalance, - p.BeginBalance+p.EventAmount-p.CheckpointBalance, - reconciles, - byCheckpoint, - ) -} From 91a700fbb6e062cafd1a4bf1fdf8774c1be9e382 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 24 Feb 2025 08:30:56 -0500 Subject: [PATCH 16/36] Updates accounting example --- accounting/.gitignore | 1 - accounting/init.go | 4 ++++ accounting/main.go | 32 ++++++++------------------------ accounting/save/apps.csv | 13 +++++++++++++ accounting/save/balances.csv | 16 ++++++++++++++++ accounting/save/file | 25 +++++++++++++++++++++++++ accounting/save/logs.csv | 22 ++++++++++++++++++++++ accounting/tests/file | 25 +++++++++++++++++++++++++ 8 files changed, 113 insertions(+), 25 deletions(-) create mode 100644 accounting/save/apps.csv create mode 100644 accounting/save/balances.csv create mode 100644 accounting/save/file create mode 100644 accounting/save/logs.csv create mode 100644 accounting/tests/file diff --git a/accounting/.gitignore b/accounting/.gitignore index 0254df6..7c67d9e 100644 --- a/accounting/.gitignore +++ b/accounting/.gitignore @@ -2,4 +2,3 @@ two ick main all_tests.txt -save diff --git a/accounting/init.go b/accounting/init.go index bf997cd..6c57aa9 100644 --- a/accounting/init.go +++ b/accounting/init.go @@ -61,3 +61,7 @@ func initData() { balanceMap[key] = bal } } + +func init() { + initData() +} diff --git a/accounting/main.go b/accounting/main.go index 795f244..914ced3 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -39,7 +39,7 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan types.Posting { return ch } -func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types.Posting, wg *sync.WaitGroup) { +func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types.Posting) { type key struct { asset base.Address holder base.Address @@ -61,8 +61,7 @@ func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types r.statementIndex++ correction.StatementId = r.statementIndex r.rowIndexMu.Unlock() - r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder.Hex())] = onChain - wg.Add(1) + r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] = onChain return correction } @@ -98,7 +97,6 @@ func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types } for _, p := range postings { - wg.Add(1) modelChan <- p } @@ -115,7 +113,7 @@ func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types } } -func (r *Reconciler) processStream(modelChan chan<- types.Posting, wg *sync.WaitGroup) { +func (r *Reconciler) processStream(modelChan chan<- types.Posting) { globalStream := make(chan types.Posting) go func() { defer close(globalStream) @@ -148,11 +146,11 @@ func (r *Reconciler) processStream(modelChan chan<- types.Posting, wg *sync.Wait for posting := range globalStream { switch posting.Statement.AssetAddress { case EndOfBlockSentinel: - r.flushBlock(postings, modelChan, wg) + r.flushBlock(postings, modelChan) postings = nil case EndOfStreamSentinel: if len(postings) > 0 { - r.flushBlock(postings, modelChan, wg) + r.flushBlock(postings, modelChan) } return default: @@ -162,34 +160,20 @@ func (r *Reconciler) processStream(modelChan chan<- types.Posting, wg *sync.Wait } func main() { - initData() - modelChan := make(chan types.Posting, 1000) - var wg sync.WaitGroup r := &Reconciler{ addressOfInterest: base.HexToAddress("0xf"), runningBalances: make(map[string]int64), seenBlocks: make(map[string]base.Blknum), } - done := make(chan struct{}) - + modelChan := make(chan types.Posting, 1000) go func() { defer close(modelChan) - r.processStream(modelChan, &wg) - close(done) + r.processStream(modelChan) }() - var postings []types.Posting - for p := range modelChan { - postings = append(postings, p) - wg.Done() - } - - <-done - wg.Wait() - types.PrintHeader() - for _, p := range postings { + for p := range modelChan { p.PrintStatement() } } diff --git a/accounting/save/apps.csv b/accounting/save/apps.csv new file mode 100644 index 0000000..4df8070 --- /dev/null +++ b/accounting/save/apps.csv @@ -0,0 +1,13 @@ +block,tx +12,1 +14,200 +14,202 +18,400 +20,14 +22,30 +25,300 +25,301 +30,400 +30,401 +32,500 +32,501 diff --git a/accounting/save/balances.csv b/accounting/save/balances.csv new file mode 100644 index 0000000..5d02375 --- /dev/null +++ b/accounting/save/balances.csv @@ -0,0 +1,16 @@ +block,asset,holder,balance +12,0x6,0xf,1000 +13,0x6,0xf,1500 +14,0x6,0xf,2000 +18,0x5,0xf,500 +20,0x6,0xf,700 +22,0x6,0xf,1200 +22,0x3,0xf,400 +22,0x4,0xf,700 +25,0x6,0xf,2400 +25,0x6,0x9,800 +30,0x7,0xf,1000 +30,0x8,0xf,500 +32,0x9,0xf,600 +32,0xA,0xf,600 +32,0x7,0xf,1200 diff --git a/accounting/save/file b/accounting/save/file new file mode 100644 index 0000000..678988d --- /dev/null +++ b/accounting/save/file @@ -0,0 +1,25 @@ +Asset Holder Block Tx Log Row Corr Reason BegBal Amount TenBal ChkBal Check1 Check2 Rec Cp +0x6 0xf 12 1 0 1 0 0 1000 1000 1000 0 0 true true +0x6 0xf 14 200 4 2 1 mis 1000 500 1500 1500 0 0 true true +0x6 0xf 14 200 4 3 0 1500 200 1700 1000 0 700 true false +0x6 0xf 14 200 101 4 0 1700 200 1900 1000 0 900 true false +0x6 0xf 14 202 0 5 0 1900 600 2500 2000 0 500 true false +0x6 0xf 14 202 0 6 2 imb 2500 -500 2000 2000 0 0 true true +0x5 0xf 18 400 0 7 0 0 500 500 500 0 0 true true +0x6 0xf 20 14 8 8 0 2000 -1300 700 700 0 0 true true +0x6 0xf 22 30 0 9 0 700 500 1200 1200 0 0 true true +0x3 0xf 22 30 1 10 0 0 300 300 300 0 0 true true +0x4 0xf 22 30 2 11 0 0 700 700 700 0 0 true true +0x3 0xf 22 30 1 12 3 imb 300 100 400 400 0 0 true true +0x6 0xf 25 300 0 13 0 1200 1500 2700 1500 0 1200 true false +0x6 0xf 25 300 1 14 0 2700 -500 2200 1000 0 1200 true false +0x6 0xf 25 300 2 15 0 2200 200 2400 2400 0 0 true true +0x7 0xf 30 400 0 16 0 0 750 750 750 0 0 true true +0x7 0xf 30 400 1 17 0 750 250 1000 1000 0 0 true true +0x8 0xf 30 401 0 18 0 0 500 500 500 0 0 true true +0x9 0xf 32 500 0 19 0 0 500 500 600 0 -100 true false +0x9 0xf 32 500 1 20 0 500 50 550 600 0 -50 true false +0x9 0xf 32 500 2 21 0 550 50 600 600 0 0 true true +0xa 0xf 32 501 0 22 0 0 600 600 600 0 0 true true +0x7 0xf 32 501 1 23 0 1000 300 1300 1300 0 0 true true +0x7 0xf 32 501 1 24 4 imb 1300 -100 1200 1200 0 0 true true diff --git a/accounting/save/logs.csv b/accounting/save/logs.csv new file mode 100644 index 0000000..d084cfa --- /dev/null +++ b/accounting/save/logs.csv @@ -0,0 +1,22 @@ +block,tx,log,asset,holder,checkPoint,amount +12,1,0,0x6,0xf,1000,1000 +14,200,4,0x6,0xf,1000,200 +14,200,101,0x6,0xf,1000,200 +14,202,0,0x6,0xf,2000,600 +18,400,0,0x5,0xf,500,500 +20,14,8,0x6,0xf,700,-1300 +22,30,0,0x6,0xf,1200,500 +22,30,1,0x3,0xf,300,300 +22,30,2,0x4,0xf,700,700 +25,300,0,0x6,0xf,1500,1500 +25,300,1,0x6,0xf,1000,-500 +25,300,2,0x6,0xf,2400,200 +25,301,0,0x6,0x9,1000,1000 +30,400,0,0x7,0xf,750,750 +30,400,1,0x7,0xf,1000,250 +30,401,0,0x8,0xf,500,500 +32,500,0,0x9,0xf,600,500 +32,500,1,0x9,0xf,600,50 +32,500,2,0x9,0xf,600,50 +32,501,0,0xA,0xf,600,600 +32,501,1,0x7,0xf,1300,300 diff --git a/accounting/tests/file b/accounting/tests/file new file mode 100644 index 0000000..678988d --- /dev/null +++ b/accounting/tests/file @@ -0,0 +1,25 @@ +Asset Holder Block Tx Log Row Corr Reason BegBal Amount TenBal ChkBal Check1 Check2 Rec Cp +0x6 0xf 12 1 0 1 0 0 1000 1000 1000 0 0 true true +0x6 0xf 14 200 4 2 1 mis 1000 500 1500 1500 0 0 true true +0x6 0xf 14 200 4 3 0 1500 200 1700 1000 0 700 true false +0x6 0xf 14 200 101 4 0 1700 200 1900 1000 0 900 true false +0x6 0xf 14 202 0 5 0 1900 600 2500 2000 0 500 true false +0x6 0xf 14 202 0 6 2 imb 2500 -500 2000 2000 0 0 true true +0x5 0xf 18 400 0 7 0 0 500 500 500 0 0 true true +0x6 0xf 20 14 8 8 0 2000 -1300 700 700 0 0 true true +0x6 0xf 22 30 0 9 0 700 500 1200 1200 0 0 true true +0x3 0xf 22 30 1 10 0 0 300 300 300 0 0 true true +0x4 0xf 22 30 2 11 0 0 700 700 700 0 0 true true +0x3 0xf 22 30 1 12 3 imb 300 100 400 400 0 0 true true +0x6 0xf 25 300 0 13 0 1200 1500 2700 1500 0 1200 true false +0x6 0xf 25 300 1 14 0 2700 -500 2200 1000 0 1200 true false +0x6 0xf 25 300 2 15 0 2200 200 2400 2400 0 0 true true +0x7 0xf 30 400 0 16 0 0 750 750 750 0 0 true true +0x7 0xf 30 400 1 17 0 750 250 1000 1000 0 0 true true +0x8 0xf 30 401 0 18 0 0 500 500 500 0 0 true true +0x9 0xf 32 500 0 19 0 0 500 500 600 0 -100 true false +0x9 0xf 32 500 1 20 0 500 50 550 600 0 -50 true false +0x9 0xf 32 500 2 21 0 550 50 600 600 0 0 true true +0xa 0xf 32 501 0 22 0 0 600 600 600 0 0 true true +0x7 0xf 32 501 1 23 0 1000 300 1300 1300 0 0 true true +0x7 0xf 32 501 1 24 4 imb 1300 -100 1200 1200 0 0 true true From 7213515b1bd9ed4770064dc1e8d791b078d66c2c Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 24 Feb 2025 14:47:00 -0500 Subject: [PATCH 17/36] Updating code --- accounting/1.sh | 4 + accounting/init.go | 67 ------------- accounting/main.go | 178 ++++++++++++++++++++++++++++------ accounting/rpc.go | 26 ----- accounting/save/balances.csv | 2 +- accounting/save/logs.csv | 26 ++--- accounting/tests/balances.csv | 2 +- accounting/tests/logs.csv | 26 ++--- 8 files changed, 180 insertions(+), 151 deletions(-) create mode 100755 accounting/1.sh delete mode 100644 accounting/init.go delete mode 100644 accounting/rpc.go diff --git a/accounting/1.sh b/accounting/1.sh new file mode 100755 index 0000000..da8b76a --- /dev/null +++ b/accounting/1.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +chifra list $1 | cut -f2,3 | tr '\t' ',' >tests/apps.csv +chifra export --accounting --statements 0xccd7fc08532953676ff801791def07d3617ec712 2>/dev/null | cut -f1,2,3,7,12,15,16,17 | tr '\t' ',' >tests/logs.csv diff --git a/accounting/init.go b/accounting/init.go deleted file mode 100644 index 6c57aa9..0000000 --- a/accounting/init.go +++ /dev/null @@ -1,67 +0,0 @@ -package main - -import ( - "encoding/csv" - "fmt" - "os" - "strconv" - - "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" - "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" -) - -var ( - balanceMap map[string]int64 - logsByTx map[int][]types.Posting -) - -func initData() { - balanceMap = make(map[string]int64) - logsByTx = make(map[int][]types.Posting) - - appsFile, _ := os.Open("tests/apps.csv") - defer appsFile.Close() - appsReader := csv.NewReader(appsFile) - appsRecords, _ := appsReader.ReadAll() - for _, record := range appsRecords[1:] { - block, _ := strconv.Atoi(record[0]) - tx, _ := strconv.Atoi(record[1]) - apps = append(apps, [2]int{block, tx}) - } - - logsFile, _ := os.Open("tests/logs.csv") - defer logsFile.Close() - logsReader := csv.NewReader(logsFile) - logsRecords, _ := logsReader.ReadAll() - for _, record := range logsRecords[1:] { - block, _ := strconv.Atoi(record[0]) - tx, _ := strconv.Atoi(record[1]) - log, _ := strconv.Atoi(record[2]) - p := types.Posting{} - p.Statement.BlockNumber = base.Blknum(block) - p.Statement.TransactionIndex = base.Txnum(tx) - p.Statement.LogIndex = base.Lognum(log) - p.Statement.AssetAddress = base.HexToAddress(record[3]) - p.Holder = base.HexToAddress(record[4]) - p.CheckpointBalance, _ = strconv.ParseInt(record[5], 10, 64) - p.EventAmount, _ = strconv.ParseInt(record[6], 10, 64) - key := mapKey(block, tx, 0) - logsByTx[key] = append(logsByTx[key], p) - } - - mapFile, _ := os.Open("tests/balances.csv") - defer mapFile.Close() - mapReader := csv.NewReader(mapFile) - mapRecords, _ := mapReader.ReadAll() - for _, record := range mapRecords[1:] { - asset := base.HexToAddress(record[1]) - holder := base.HexToAddress(record[2]) - key := fmt.Sprintf("%s|%s|%s", record[0], asset.Hex(), holder.Hex()) - bal, _ := strconv.ParseInt(record[3], 10, 64) - balanceMap[key] = bal - } -} - -func init() { - initData() -} diff --git a/accounting/main.go b/accounting/main.go index 914ced3..bce6ce8 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -1,7 +1,10 @@ package main import ( + "encoding/csv" "fmt" + "os" + "strconv" "sync" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" @@ -11,25 +14,47 @@ import ( type Reconciler struct { mu sync.Mutex addressOfInterest base.Address - runningBalances map[string]int64 - seenBlocks map[string]base.Blknum + runningBalMap map[string]int64 + seenBlockMap map[string]base.Blknum + balanceMap map[string]int64 + logsMap map[MapKey][]types.Posting + lastPostingsMap map[key]int correctionCounter int counterMu sync.Mutex statementIndex int rowIndexMu sync.Mutex } +func NewReconciler(addr base.Address) *Reconciler { + r := &Reconciler{ + addressOfInterest: addr, + runningBalMap: make(map[string]int64), + seenBlockMap: make(map[string]base.Blknum), + lastPostingsMap: make(map[key]int), + balanceMap: make(map[string]int64), + logsMap: make(map[MapKey][]types.Posting), + } + r.initData() + return r +} + var ( - apps [][2]int + apps []types.Appearance EndOfBlockSentinel = base.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") EndOfStreamSentinel = base.HexToAddress("0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead") ) -func (r *Reconciler) GetPostingChannel(block, tx int) <-chan types.Posting { +type key struct { + asset base.Address + holder base.Address +} + +func (r *Reconciler) GetPostingChannel(app *types.Appearance) <-chan types.Posting { ch := make(chan types.Posting) go func() { defer close(ch) - for _, p := range logsByTx[mapKey(block, tx, 0)] { + logKey := logsKey(base.Blknum(app.BlockNumber), base.Txnum(app.TransactionIndex), base.Lognum(0)) + for _, p := range r.logsMap[logKey] { if p.Holder != r.addressOfInterest { continue } @@ -40,10 +65,6 @@ func (r *Reconciler) GetPostingChannel(block, tx int) <-chan types.Posting { } func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types.Posting) { - type key struct { - asset base.Address - holder base.Address - } correctingEntry := func(k key, reason string, onChain, currentBal int64, p *types.Posting) types.Posting { r.counterMu.Lock() r.correctionCounter++ @@ -61,31 +82,31 @@ func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types r.statementIndex++ correction.StatementId = r.statementIndex r.rowIndexMu.Unlock() - r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] = onChain + r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] = onChain return correction } - lastPostings := make(map[key]int) + r.lastPostingsMap = make(map[key]int) for i, p := range postings { k := key{p.Statement.AssetAddress, p.Holder} seenKey := fmt.Sprintf("%d|%s|%s", p.Statement.BlockNumber, k.asset, k.holder) - if _, seen := r.seenBlocks[seenKey]; !seen { - if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber-1); ok { + if _, seen := r.seenBlockMap[seenKey]; !seen { + if onChain, ok := r.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber-1); ok { r.mu.Lock() - currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] + currentBal := r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] if onChain != currentBal { modelChan <- correctingEntry(k, "mis", onChain, currentBal, &p) } r.mu.Unlock() } - r.seenBlocks[seenKey] = p.Statement.BlockNumber + r.seenBlockMap[seenKey] = p.Statement.BlockNumber } r.mu.Lock() - p.BeginBalance = r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] + p.BeginBalance = r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] p.TentativeBalance = p.BeginBalance + p.EventAmount - r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] = p.TentativeBalance + r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] = p.TentativeBalance r.rowIndexMu.Lock() r.statementIndex++ p.StatementId = r.statementIndex @@ -93,18 +114,18 @@ func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types r.mu.Unlock() postings[i] = p - lastPostings[k] = i + r.lastPostingsMap[k] = i } for _, p := range postings { modelChan <- p } - for k, idx := range lastPostings { + for k, idx := range r.lastPostingsMap { p := postings[idx] - if onChain, ok := cc.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber); ok { + if onChain, ok := r.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber); ok { r.mu.Lock() - currentBal := r.runningBalances[fmt.Sprintf("%s|%s", k.asset, k.holder)] + currentBal := r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] if onChain != currentBal { modelChan <- correctingEntry(k, "imb", onChain, currentBal, &p) } @@ -117,19 +138,18 @@ func (r *Reconciler) processStream(modelChan chan<- types.Posting) { globalStream := make(chan types.Posting) go func() { defer close(globalStream) - var prevBlock int + var prevBlock base.Blknum for _, app := range apps { - block, tx := app[0], app[1] - if block != prevBlock && prevBlock != 0 { + if base.Blknum(app.BlockNumber) != prevBlock && prevBlock != 0 { globalStream <- types.Posting{Statement: types.Statement{ BlockNumber: base.Blknum(prevBlock), AssetAddress: EndOfBlockSentinel, }} } - for p := range r.GetPostingChannel(block, tx) { + for p := range r.GetPostingChannel(&app) { globalStream <- p } - prevBlock = block + prevBlock = base.Blknum(app.BlockNumber) } if prevBlock != 0 { globalStream <- types.Posting{Statement: types.Statement{ @@ -160,12 +180,13 @@ func (r *Reconciler) processStream(modelChan chan<- types.Posting) { } func main() { - r := &Reconciler{ - addressOfInterest: base.HexToAddress("0xf"), - runningBalances: make(map[string]int64), - seenBlocks: make(map[string]base.Blknum), + if len(os.Args) < 2 { + fmt.Println("Usage: chifra
") + os.Exit(1) } + r := NewReconciler(base.HexToAddress(os.Args[1])) + modelChan := make(chan types.Posting, 1000) go func() { defer close(modelChan) @@ -177,3 +198,100 @@ func main() { p.PrintStatement() } } + +func (r *Reconciler) initData() { + r.balanceMap = make(map[string]int64) + r.logsMap = make(map[MapKey][]types.Posting) + + // blockNumber,transactionIndex + appsFile, _ := os.Open("tests/apps.csv") + defer appsFile.Close() + appsReader := csv.NewReader(appsFile) + appsRecords, _ := appsReader.ReadAll() + for _, record := range appsRecords[1:] { + block, _ := strconv.Atoi(record[0]) + tx, _ := strconv.Atoi(record[1]) + apps = append(apps, types.Appearance{ + BlockNumber: uint32(block), + TransactionIndex: uint32(tx), + }) + } + + // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal + logsFile, _ := os.Open("tests/logs.csv") + defer logsFile.Close() + logsReader := csv.NewReader(logsFile) + logsRecords, _ := logsReader.ReadAll() + for _, record := range logsRecords[1:] { + block, _ := strconv.Atoi(record[0]) + tx, _ := strconv.Atoi(record[1]) + log, _ := strconv.Atoi(record[2]) + p := types.Posting{} + p.Statement.BlockNumber = base.Blknum(block) + p.Statement.TransactionIndex = base.Txnum(tx) + p.Statement.LogIndex = base.Lognum(log) + p.Statement.AssetAddress = base.HexToAddress(record[3]) + p.Holder = base.HexToAddress(record[4]) + p.EventAmount, _ = strconv.ParseInt(record[5], 10, 64) + p.CheckpointBalance, _ = strconv.ParseInt(record[6], 10, 64) + logKey := logsKey(base.Blknum(block), base.Txnum(tx), base.Lognum(0)) + r.logsMap[logKey] = append(r.logsMap[logKey], p) + } + + // blockNumber,assetAddress,accountedFor,endBal + mapFile, _ := os.Open("tests/balances.csv") + defer mapFile.Close() + mapReader := csv.NewReader(mapFile) + mapRecords, _ := mapReader.ReadAll() + for _, record := range mapRecords[1:] { + asset := base.HexToAddress(record[1]) + holder := base.HexToAddress(record[2]) + key := fmt.Sprintf("%s|%s|%s", record[0], asset.Hex(), holder.Hex()) + bal, _ := strconv.ParseInt(record[3], 10, 64) + r.balanceMap[key] = bal + } + // logger.Info("Data initialized", len(apps), len(logsMap), len(balanceMap)) +} + +var ( + cc Connection +) + +// Connection provides on-chain balance lookups +type Connection struct{} + +func (r *Reconciler) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (int64, bool) { + key := fmt.Sprintf("%d|%s|%s", bn, asset.Hex(), holder.Hex()) + if bal, ok := r.balanceMap[key]; ok { + return bal, true + } + return 0, false +} + +type MapKey struct { + BlockNumber base.Blknum + TransactionIndex base.Txnum + LogIndex base.Lognum + Asset base.Address + Holder base.Address +} + +func runningBalKey(asset base.Address, holder base.Address) MapKey { + return MapKey{Asset: asset, Holder: holder} +} + +func seenBlockKey(bn base.Blknum, asset base.Address, holder base.Address) MapKey { + return MapKey{BlockNumber: bn, Asset: asset, Holder: holder} +} + +func lastPostingsKey(asset base.Address, holder base.Address) MapKey { + return MapKey{Asset: asset, Holder: holder} +} + +func balanceKey(bn base.Blknum, asset base.Address, holder base.Address) MapKey { + return MapKey{BlockNumber: bn, Asset: asset, Holder: holder} +} + +func logsKey(bn base.Blknum, tx base.Txnum, log base.Lognum) MapKey { + return MapKey{BlockNumber: bn, TransactionIndex: tx, LogIndex: log} +} diff --git a/accounting/rpc.go b/accounting/rpc.go deleted file mode 100644 index 0d50c33..0000000 --- a/accounting/rpc.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" -) - -var ( - cc Connection -) - -// Connection provides on-chain balance lookups -type Connection struct{} - -func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (int64, bool) { - key := fmt.Sprintf("%d|%s|%s", bn, asset.Hex(), holder.Hex()) - if bal, ok := balanceMap[key]; ok { - return bal, true - } - return 0, false -} - -func mapKey(block, txid, logid int) int { - return block*10000001 + txid*100001 + logid -} diff --git a/accounting/save/balances.csv b/accounting/save/balances.csv index 5d02375..1778184 100644 --- a/accounting/save/balances.csv +++ b/accounting/save/balances.csv @@ -1,4 +1,4 @@ -block,asset,holder,balance +block,asset,holder,endBal 12,0x6,0xf,1000 13,0x6,0xf,1500 14,0x6,0xf,2000 diff --git a/accounting/save/logs.csv b/accounting/save/logs.csv index d084cfa..22fb906 100644 --- a/accounting/save/logs.csv +++ b/accounting/save/logs.csv @@ -1,22 +1,22 @@ -block,tx,log,asset,holder,checkPoint,amount +block,tx,log,asset,holder,amount,endBal 12,1,0,0x6,0xf,1000,1000 -14,200,4,0x6,0xf,1000,200 -14,200,101,0x6,0xf,1000,200 -14,202,0,0x6,0xf,2000,600 +14,200,4,0x6,0xf,200,1000 +14,200,101,0x6,0xf,200,1000 +14,202,0,0x6,0xf,600,2000 18,400,0,0x5,0xf,500,500 -20,14,8,0x6,0xf,700,-1300 -22,30,0,0x6,0xf,1200,500 +20,14,8,0x6,0xf,-1300,700 +22,30,0,0x6,0xf,500,1200 22,30,1,0x3,0xf,300,300 22,30,2,0x4,0xf,700,700 25,300,0,0x6,0xf,1500,1500 -25,300,1,0x6,0xf,1000,-500 -25,300,2,0x6,0xf,2400,200 +25,300,1,0x6,0xf,-500,1000 +25,300,2,0x6,0xf,200,2400 25,301,0,0x6,0x9,1000,1000 30,400,0,0x7,0xf,750,750 -30,400,1,0x7,0xf,1000,250 +30,400,1,0x7,0xf,250,1000 30,401,0,0x8,0xf,500,500 -32,500,0,0x9,0xf,600,500 -32,500,1,0x9,0xf,600,50 -32,500,2,0x9,0xf,600,50 +32,500,0,0x9,0xf,500,600 +32,500,1,0x9,0xf,50,600 +32,500,2,0x9,0xf,50,600 32,501,0,0xA,0xf,600,600 -32,501,1,0x7,0xf,1300,300 +32,501,1,0x7,0xf,300,1300 diff --git a/accounting/tests/balances.csv b/accounting/tests/balances.csv index 5d02375..1778184 100644 --- a/accounting/tests/balances.csv +++ b/accounting/tests/balances.csv @@ -1,4 +1,4 @@ -block,asset,holder,balance +block,asset,holder,endBal 12,0x6,0xf,1000 13,0x6,0xf,1500 14,0x6,0xf,2000 diff --git a/accounting/tests/logs.csv b/accounting/tests/logs.csv index d084cfa..22fb906 100644 --- a/accounting/tests/logs.csv +++ b/accounting/tests/logs.csv @@ -1,22 +1,22 @@ -block,tx,log,asset,holder,checkPoint,amount +block,tx,log,asset,holder,amount,endBal 12,1,0,0x6,0xf,1000,1000 -14,200,4,0x6,0xf,1000,200 -14,200,101,0x6,0xf,1000,200 -14,202,0,0x6,0xf,2000,600 +14,200,4,0x6,0xf,200,1000 +14,200,101,0x6,0xf,200,1000 +14,202,0,0x6,0xf,600,2000 18,400,0,0x5,0xf,500,500 -20,14,8,0x6,0xf,700,-1300 -22,30,0,0x6,0xf,1200,500 +20,14,8,0x6,0xf,-1300,700 +22,30,0,0x6,0xf,500,1200 22,30,1,0x3,0xf,300,300 22,30,2,0x4,0xf,700,700 25,300,0,0x6,0xf,1500,1500 -25,300,1,0x6,0xf,1000,-500 -25,300,2,0x6,0xf,2400,200 +25,300,1,0x6,0xf,-500,1000 +25,300,2,0x6,0xf,200,2400 25,301,0,0x6,0x9,1000,1000 30,400,0,0x7,0xf,750,750 -30,400,1,0x7,0xf,1000,250 +30,400,1,0x7,0xf,250,1000 30,401,0,0x8,0xf,500,500 -32,500,0,0x9,0xf,600,500 -32,500,1,0x9,0xf,600,50 -32,500,2,0x9,0xf,600,50 +32,500,0,0x9,0xf,500,600 +32,500,1,0x9,0xf,50,600 +32,500,2,0x9,0xf,50,600 32,501,0,0xA,0xf,600,600 -32,501,1,0x7,0xf,1300,300 +32,501,1,0x7,0xf,300,1300 From b8b72c36a352fc0b6a7d07c52eff53d6ada2095d Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Tue, 25 Feb 2025 01:16:02 -0500 Subject: [PATCH 18/36] Best version yet --- accounting/main.go | 374 +++++++++++-------- accounting/tests/{logs.csv => transfers.csv} | 0 2 files changed, 209 insertions(+), 165 deletions(-) rename accounting/tests/{logs.csv => transfers.csv} (100%) diff --git a/accounting/main.go b/accounting/main.go index bce6ce8..661a52f 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -4,167 +4,216 @@ import ( "encoding/csv" "fmt" "os" - "strconv" - "sync" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) +type Posting2 struct { + // Statement + Holder base.Address + StatementId int + CorrectionIndex int + CorrectionReason string + BeginBalance base.Wei + EventAmount base.Wei + TentativeBalance base.Wei + CheckpointBalance base.Wei + AssetAddress base.Address `json:"assetAddress"` + BlockNumber base.Blknum `json:"blockNumber"` + LogIndex base.Lognum `json:"logIndex"` + TransactionIndex base.Txnum `json:"transactionIndex"` +} + +func (p Posting2) Reconciled() (base.Wei, base.Wei, bool, bool) { + checkVal := *new(base.Wei).Add(&p.BeginBalance, &p.EventAmount) + tentativeDiff := *new(base.Wei).Sub(&checkVal, &p.TentativeBalance) + checkpointDiff := *new(base.Wei).Sub(&checkVal, &p.CheckpointBalance) + tentativeEqual := checkVal.Equal(&p.TentativeBalance) + checkpointEqual := checkVal.Equal(&p.CheckpointBalance) + if checkpointEqual { + return tentativeDiff, checkpointDiff, true, true + } + return tentativeDiff, checkpointDiff, tentativeEqual, false +} + +func PrintHeader() { + fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tBegBal\tAmount\tTenBal\tChkBal\tCheck1\tCheck2\tRec\tCp") +} + +// --------------------------------------------------------- +func (p *Posting2) Model(chain, format string, verbose bool, extraOpts map[string]any) types.Model { + _, _, _, _ = chain, format, verbose, extraOpts + check1, check2, reconciles, byCheckpoint := p.Reconciled() + fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%t\t%t\n", + p.AssetAddress.Display(0, 1), + p.Holder.Display(0, 1), + p.BlockNumber, + p.TransactionIndex, + p.LogIndex, + p.StatementId, + p.CorrectionIndex, + p.CorrectionReason, + p.BeginBalance.Text(10), + p.EventAmount.Text(10), + p.TentativeBalance.Text(10), + p.CheckpointBalance.Text(10), + check1.Text(10), + check2.Text(10), + reconciles, + byCheckpoint, + ) + return types.Model{} +} + +// --------------------------------------------------------- +type Balance2 struct { + BlockNumber base.Blknum + Asset base.Address + Holder base.Address + Balance base.Wei +} + +// --------------------------------------------------------- type Reconciler struct { - mu sync.Mutex - addressOfInterest base.Address - runningBalMap map[string]int64 - seenBlockMap map[string]base.Blknum - balanceMap map[string]int64 - logsMap map[MapKey][]types.Posting - lastPostingsMap map[key]int + conn *Connection + account base.Address + runningBal map[assetHolderKey]base.Wei + transfers map[blockTxKey][]Posting2 correctionCounter int - counterMu sync.Mutex statementIndex int - rowIndexMu sync.Mutex } +// --------------------------------------------------------- func NewReconciler(addr base.Address) *Reconciler { r := &Reconciler{ - addressOfInterest: addr, - runningBalMap: make(map[string]int64), - seenBlockMap: make(map[string]base.Blknum), - lastPostingsMap: make(map[key]int), - balanceMap: make(map[string]int64), - logsMap: make(map[MapKey][]types.Posting), + account: addr, + runningBal: make(map[assetHolderKey]base.Wei), + transfers: make(map[blockTxKey][]Posting2), + conn: NewConnection(), } + r.initData() + return r } +// --------------------------------------------------------- var ( apps []types.Appearance EndOfBlockSentinel = base.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") EndOfStreamSentinel = base.HexToAddress("0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead") ) -type key struct { - asset base.Address - holder base.Address -} - -func (r *Reconciler) GetPostingChannel(app *types.Appearance) <-chan types.Posting { - ch := make(chan types.Posting) +// --------------------------------------------------------- +func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan Posting2 { + ch := make(chan Posting2) go func() { defer close(ch) - logKey := logsKey(base.Blknum(app.BlockNumber), base.Txnum(app.TransactionIndex), base.Lognum(0)) - for _, p := range r.logsMap[logKey] { - if p.Holder != r.addressOfInterest { - continue + key := blockTxKey{BlockNumber: base.Blknum(app.BlockNumber), TransactionIndex: base.Txnum(app.TransactionIndex)} + for _, p := range r.transfers[key] { + if p.Holder == r.account { + ch <- p } - ch <- p } }() return ch } -func (r *Reconciler) flushBlock(postings []types.Posting, modelChan chan<- types.Posting) { - correctingEntry := func(k key, reason string, onChain, currentBal int64, p *types.Posting) types.Posting { - r.counterMu.Lock() - r.correctionCounter++ - correction := types.Posting{ - EventAmount: onChain - currentBal, - BeginBalance: currentBal, - CorrectionIndex: r.correctionCounter, - CorrectionReason: reason, - } - r.counterMu.Unlock() - correction.Statement = p.Statement - correction.TentativeBalance = onChain - correction.CheckpointBalance = onChain - r.rowIndexMu.Lock() - r.statementIndex++ - correction.StatementId = r.statementIndex - r.rowIndexMu.Unlock() - r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] = onChain - return correction - } +// --------------------------------------------------------- +func (r *Reconciler) correctingEntry(reason string, onChain, currentBal base.Wei, p *Posting2) Posting2 { + correction := *p + correction.EventAmount = *new(base.Wei).Sub(&onChain, ¤tBal) + correction.BeginBalance = currentBal + correction.TentativeBalance = onChain + correction.CheckpointBalance = onChain - r.lastPostingsMap = make(map[key]int) + r.correctionCounter++ + correction.CorrectionIndex = r.correctionCounter + correction.CorrectionReason = reason + + r.statementIndex++ + correction.StatementId = r.statementIndex + + key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} + r.runningBal[key] = onChain + return correction +} + +// --------------------------------------------------------- +func (r *Reconciler) flushBlock(postings []Posting2, modelChan chan<- types.Modeler) { + assetSeen := make(map[base.Address]bool) + assetLastSeen := make(map[base.Address]int) for i, p := range postings { - k := key{p.Statement.AssetAddress, p.Holder} - seenKey := fmt.Sprintf("%d|%s|%s", p.Statement.BlockNumber, k.asset, k.holder) - - if _, seen := r.seenBlockMap[seenKey]; !seen { - if onChain, ok := r.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber-1); ok { - r.mu.Lock() - currentBal := r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] - if onChain != currentBal { - modelChan <- correctingEntry(k, "mis", onChain, currentBal, &p) + key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} + if !assetSeen[p.AssetAddress] { + if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber-1); ok { + currentBal := r.runningBal[key] + if !onChain.Equal(¤tBal) { + correctingEntry := r.correctingEntry("mis", onChain, currentBal, &p) + modelChan <- &correctingEntry } - r.mu.Unlock() } - r.seenBlockMap[seenKey] = p.Statement.BlockNumber + assetSeen[p.AssetAddress] = true } - r.mu.Lock() - p.BeginBalance = r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] - p.TentativeBalance = p.BeginBalance + p.EventAmount - r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] = p.TentativeBalance - r.rowIndexMu.Lock() + p.BeginBalance = r.runningBal[key] + p.TentativeBalance = *new(base.Wei).Add(&p.BeginBalance, &p.EventAmount) + r.runningBal[key] = p.TentativeBalance r.statementIndex++ p.StatementId = r.statementIndex - r.rowIndexMu.Unlock() - r.mu.Unlock() postings[i] = p - r.lastPostingsMap[k] = i + assetLastSeen[p.AssetAddress] = i + modelChan <- &p } - for _, p := range postings { - modelChan <- p - } - - for k, idx := range r.lastPostingsMap { + for _, idx := range assetLastSeen { p := postings[idx] - if onChain, ok := r.GetBalanceAtToken(k.asset, k.holder, p.Statement.BlockNumber); ok { - r.mu.Lock() - currentBal := r.runningBalMap[fmt.Sprintf("%s|%s", k.asset, k.holder)] - if onChain != currentBal { - modelChan <- correctingEntry(k, "imb", onChain, currentBal, &p) + key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} + if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber); ok { + currentBal := r.runningBal[key] + if !onChain.Equal(¤tBal) { + correctingEntry := r.correctingEntry("imb", onChain, currentBal, &p) + modelChan <- &correctingEntry } - r.mu.Unlock() } } } -func (r *Reconciler) processStream(modelChan chan<- types.Posting) { - globalStream := make(chan types.Posting) +// --------------------------------------------------------- +func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { + postingStream := make(chan Posting2, 100) go func() { - defer close(globalStream) + defer close(postingStream) var prevBlock base.Blknum for _, app := range apps { - if base.Blknum(app.BlockNumber) != prevBlock && prevBlock != 0 { - globalStream <- types.Posting{Statement: types.Statement{ - BlockNumber: base.Blknum(prevBlock), + bn := base.Blknum(app.BlockNumber) + if bn != prevBlock && prevBlock != 0 { + postingStream <- Posting2{ + BlockNumber: prevBlock, AssetAddress: EndOfBlockSentinel, - }} + } } - for p := range r.GetPostingChannel(&app) { - globalStream <- p + for p := range r.getPostingChannel(&app) { + postingStream <- p } - prevBlock = base.Blknum(app.BlockNumber) + prevBlock = bn } if prevBlock != 0 { - globalStream <- types.Posting{Statement: types.Statement{ - BlockNumber: base.Blknum(prevBlock), + postingStream <- Posting2{ + BlockNumber: prevBlock, AssetAddress: EndOfBlockSentinel, - }} + } } - globalStream <- types.Posting{Statement: types.Statement{ + postingStream <- Posting2{ AssetAddress: EndOfStreamSentinel, - }} + } }() - var postings []types.Posting - for posting := range globalStream { - switch posting.Statement.AssetAddress { + var postings []Posting2 + for posting := range postingStream { + switch posting.AssetAddress { case EndOfBlockSentinel: r.flushBlock(postings, modelChan) postings = nil @@ -179,119 +228,114 @@ func (r *Reconciler) processStream(modelChan chan<- types.Posting) { } } +// --------------------------------------------------------- func main() { if len(os.Args) < 2 { - fmt.Println("Usage: chifra
") - os.Exit(1) + os.Args = append(os.Args, "0xf") } r := NewReconciler(base.HexToAddress(os.Args[1])) - modelChan := make(chan types.Posting, 1000) + modelChan := make(chan types.Modeler, 1000) go func() { defer close(modelChan) r.processStream(modelChan) }() - types.PrintHeader() + PrintHeader() for p := range modelChan { - p.PrintStatement() + p.Model("mainnet", "text", false, nil) } } +// --------------------------------------------------------- func (r *Reconciler) initData() { - r.balanceMap = make(map[string]int64) - r.logsMap = make(map[MapKey][]types.Posting) - // blockNumber,transactionIndex appsFile, _ := os.Open("tests/apps.csv") defer appsFile.Close() appsReader := csv.NewReader(appsFile) appsRecords, _ := appsReader.ReadAll() for _, record := range appsRecords[1:] { - block, _ := strconv.Atoi(record[0]) - tx, _ := strconv.Atoi(record[1]) apps = append(apps, types.Appearance{ - BlockNumber: uint32(block), - TransactionIndex: uint32(tx), + BlockNumber: uint32(base.MustParseInt64(record[0])), + TransactionIndex: uint32(base.MustParseInt64(record[1])), }) } // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal - logsFile, _ := os.Open("tests/logs.csv") + logsFile, _ := os.Open("tests/transfers.csv") defer logsFile.Close() logsReader := csv.NewReader(logsFile) logsRecords, _ := logsReader.ReadAll() for _, record := range logsRecords[1:] { - block, _ := strconv.Atoi(record[0]) - tx, _ := strconv.Atoi(record[1]) - log, _ := strconv.Atoi(record[2]) - p := types.Posting{} - p.Statement.BlockNumber = base.Blknum(block) - p.Statement.TransactionIndex = base.Txnum(tx) - p.Statement.LogIndex = base.Lognum(log) - p.Statement.AssetAddress = base.HexToAddress(record[3]) - p.Holder = base.HexToAddress(record[4]) - p.EventAmount, _ = strconv.ParseInt(record[5], 10, 64) - p.CheckpointBalance, _ = strconv.ParseInt(record[6], 10, 64) - logKey := logsKey(base.Blknum(block), base.Txnum(tx), base.Lognum(0)) - r.logsMap[logKey] = append(r.logsMap[logKey], p) + p := Posting2{ + BlockNumber: base.Blknum(base.MustParseUint64(record[0])), + TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), + LogIndex: base.Lognum(base.MustParseUint64(record[2])), + AssetAddress: base.HexToAddress(record[3]), + Holder: base.HexToAddress(record[4]), + EventAmount: *base.NewWei(base.MustParseInt64(record[5])), + CheckpointBalance: *base.NewWei(base.MustParseInt64(record[6])), + } + + key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} + r.transfers[key] = append(r.transfers[key], p) } // blockNumber,assetAddress,accountedFor,endBal - mapFile, _ := os.Open("tests/balances.csv") - defer mapFile.Close() - mapReader := csv.NewReader(mapFile) - mapRecords, _ := mapReader.ReadAll() - for _, record := range mapRecords[1:] { - asset := base.HexToAddress(record[1]) - holder := base.HexToAddress(record[2]) - key := fmt.Sprintf("%s|%s|%s", record[0], asset.Hex(), holder.Hex()) - bal, _ := strconv.ParseInt(record[3], 10, 64) - r.balanceMap[key] = bal + balFile, _ := os.Open("tests/balances.csv") + defer balFile.Close() + balReader := csv.NewReader(balFile) + balRecords, _ := balReader.ReadAll() + for _, record := range balRecords[1:] { + b := Balance2{ + BlockNumber: base.Blknum(base.MustParseUint64(record[0])), + Asset: base.HexToAddress(record[1]), + Holder: base.HexToAddress(record[2]), + Balance: *base.NewWei(base.MustParseInt64(record[3])), + } + + key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.Asset, Holder: b.Holder} + r.conn.balanceMap[key] = b.Balance } - // logger.Info("Data initialized", len(apps), len(logsMap), len(balanceMap)) } -var ( - cc Connection -) - +// --------------------------------------------------------- // Connection provides on-chain balance lookups -type Connection struct{} +type Connection struct { + balanceMap map[bnAssetHolderKey]base.Wei +} + +// --------------------------------------------------------- +func NewConnection() *Connection { + return &Connection{ + balanceMap: make(map[bnAssetHolderKey]base.Wei), + } +} -func (r *Reconciler) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (int64, bool) { - key := fmt.Sprintf("%d|%s|%s", bn, asset.Hex(), holder.Hex()) - if bal, ok := r.balanceMap[key]; ok { +// --------------------------------------------------------- +func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (base.Wei, bool) { + key := bnAssetHolderKey{BlockNumber: bn, Asset: asset, Holder: holder} + if bal, ok := c.balanceMap[key]; ok { return bal, true } - return 0, false + return *base.ZeroWei, false } -type MapKey struct { +// --------------------------------------------------------- +type blockTxKey struct { BlockNumber base.Blknum TransactionIndex base.Txnum - LogIndex base.Lognum - Asset base.Address - Holder base.Address -} - -func runningBalKey(asset base.Address, holder base.Address) MapKey { - return MapKey{Asset: asset, Holder: holder} -} - -func seenBlockKey(bn base.Blknum, asset base.Address, holder base.Address) MapKey { - return MapKey{BlockNumber: bn, Asset: asset, Holder: holder} -} - -func lastPostingsKey(asset base.Address, holder base.Address) MapKey { - return MapKey{Asset: asset, Holder: holder} } -func balanceKey(bn base.Blknum, asset base.Address, holder base.Address) MapKey { - return MapKey{BlockNumber: bn, Asset: asset, Holder: holder} +// --------------------------------------------------------- +type assetHolderKey struct { + Asset base.Address + Holder base.Address } -func logsKey(bn base.Blknum, tx base.Txnum, log base.Lognum) MapKey { - return MapKey{BlockNumber: bn, TransactionIndex: tx, LogIndex: log} +type bnAssetHolderKey struct { + BlockNumber base.Blknum + Asset base.Address + Holder base.Address } diff --git a/accounting/tests/logs.csv b/accounting/tests/transfers.csv similarity index 100% rename from accounting/tests/logs.csv rename to accounting/tests/transfers.csv From 10117d84551f1a9a5e6039fcb838efe038d59e12 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Tue, 25 Feb 2025 07:18:29 -0500 Subject: [PATCH 19/36] Removed weird balance in transfers.csv --- accounting/main.go | 50 ++++++++++----------- accounting/one/file | 14 +++--- accounting/save/{logs.csv => transfers.csv} | 0 accounting/tests/transfers.csv | 44 +++++++++--------- 4 files changed, 53 insertions(+), 55 deletions(-) rename accounting/save/{logs.csv => transfers.csv} (100%) diff --git a/accounting/main.go b/accounting/main.go index 661a52f..2399858 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -171,12 +171,10 @@ func (r *Reconciler) flushBlock(postings []Posting2, modelChan chan<- types.Mode for _, idx := range assetLastSeen { p := postings[idx] key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber); ok { - currentBal := r.runningBal[key] - if !onChain.Equal(¤tBal) { - correctingEntry := r.correctingEntry("imb", onChain, currentBal, &p) - modelChan <- &correctingEntry - } + currentBal := r.runningBal[key] + if !p.CheckpointBalance.Equal(¤tBal) { + correctingEntry := r.correctingEntry("imb", p.CheckpointBalance, currentBal, &p) + modelChan <- &correctingEntry } } } @@ -262,26 +260,6 @@ func (r *Reconciler) initData() { }) } - // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal - logsFile, _ := os.Open("tests/transfers.csv") - defer logsFile.Close() - logsReader := csv.NewReader(logsFile) - logsRecords, _ := logsReader.ReadAll() - for _, record := range logsRecords[1:] { - p := Posting2{ - BlockNumber: base.Blknum(base.MustParseUint64(record[0])), - TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), - LogIndex: base.Lognum(base.MustParseUint64(record[2])), - AssetAddress: base.HexToAddress(record[3]), - Holder: base.HexToAddress(record[4]), - EventAmount: *base.NewWei(base.MustParseInt64(record[5])), - CheckpointBalance: *base.NewWei(base.MustParseInt64(record[6])), - } - - key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} - r.transfers[key] = append(r.transfers[key], p) - } - // blockNumber,assetAddress,accountedFor,endBal balFile, _ := os.Open("tests/balances.csv") defer balFile.Close() @@ -298,6 +276,26 @@ func (r *Reconciler) initData() { key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.Asset, Holder: b.Holder} r.conn.balanceMap[key] = b.Balance } + + // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal + logsFile, _ := os.Open("tests/transfers.csv") + defer logsFile.Close() + logsReader := csv.NewReader(logsFile) + logsRecords, _ := logsReader.ReadAll() + for _, record := range logsRecords[1:] { + p := Posting2{ + BlockNumber: base.Blknum(base.MustParseUint64(record[0])), + TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), + LogIndex: base.Lognum(base.MustParseUint64(record[2])), + AssetAddress: base.HexToAddress(record[3]), + Holder: base.HexToAddress(record[4]), + EventAmount: *base.NewWei(base.MustParseInt64(record[5])), + } + p.CheckpointBalance, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) + + key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} + r.transfers[key] = append(r.transfers[key], p) + } } // --------------------------------------------------------- diff --git a/accounting/one/file b/accounting/one/file index 678988d..1850503 100644 --- a/accounting/one/file +++ b/accounting/one/file @@ -1,25 +1,25 @@ Asset Holder Block Tx Log Row Corr Reason BegBal Amount TenBal ChkBal Check1 Check2 Rec Cp 0x6 0xf 12 1 0 1 0 0 1000 1000 1000 0 0 true true 0x6 0xf 14 200 4 2 1 mis 1000 500 1500 1500 0 0 true true -0x6 0xf 14 200 4 3 0 1500 200 1700 1000 0 700 true false -0x6 0xf 14 200 101 4 0 1700 200 1900 1000 0 900 true false +0x6 0xf 14 200 4 3 0 1500 200 1700 2000 0 -300 true false +0x6 0xf 14 200 101 4 0 1700 200 1900 2000 0 -100 true false 0x6 0xf 14 202 0 5 0 1900 600 2500 2000 0 500 true false 0x6 0xf 14 202 0 6 2 imb 2500 -500 2000 2000 0 0 true true 0x5 0xf 18 400 0 7 0 0 500 500 500 0 0 true true 0x6 0xf 20 14 8 8 0 2000 -1300 700 700 0 0 true true 0x6 0xf 22 30 0 9 0 700 500 1200 1200 0 0 true true -0x3 0xf 22 30 1 10 0 0 300 300 300 0 0 true true +0x3 0xf 22 30 1 10 0 0 300 300 400 0 -100 true false 0x4 0xf 22 30 2 11 0 0 700 700 700 0 0 true true 0x3 0xf 22 30 1 12 3 imb 300 100 400 400 0 0 true true -0x6 0xf 25 300 0 13 0 1200 1500 2700 1500 0 1200 true false -0x6 0xf 25 300 1 14 0 2700 -500 2200 1000 0 1200 true false +0x6 0xf 25 300 0 13 0 1200 1500 2700 2400 0 300 true false +0x6 0xf 25 300 1 14 0 2700 -500 2200 2400 0 -200 true false 0x6 0xf 25 300 2 15 0 2200 200 2400 2400 0 0 true true -0x7 0xf 30 400 0 16 0 0 750 750 750 0 0 true true +0x7 0xf 30 400 0 16 0 0 750 750 1000 0 -250 true false 0x7 0xf 30 400 1 17 0 750 250 1000 1000 0 0 true true 0x8 0xf 30 401 0 18 0 0 500 500 500 0 0 true true 0x9 0xf 32 500 0 19 0 0 500 500 600 0 -100 true false 0x9 0xf 32 500 1 20 0 500 50 550 600 0 -50 true false 0x9 0xf 32 500 2 21 0 550 50 600 600 0 0 true true 0xa 0xf 32 501 0 22 0 0 600 600 600 0 0 true true -0x7 0xf 32 501 1 23 0 1000 300 1300 1300 0 0 true true +0x7 0xf 32 501 1 23 0 1000 300 1300 1200 0 100 true false 0x7 0xf 32 501 1 24 4 imb 1300 -100 1200 1200 0 0 true true diff --git a/accounting/save/logs.csv b/accounting/save/transfers.csv similarity index 100% rename from accounting/save/logs.csv rename to accounting/save/transfers.csv diff --git a/accounting/tests/transfers.csv b/accounting/tests/transfers.csv index 22fb906..b847f44 100644 --- a/accounting/tests/transfers.csv +++ b/accounting/tests/transfers.csv @@ -1,22 +1,22 @@ -block,tx,log,asset,holder,amount,endBal -12,1,0,0x6,0xf,1000,1000 -14,200,4,0x6,0xf,200,1000 -14,200,101,0x6,0xf,200,1000 -14,202,0,0x6,0xf,600,2000 -18,400,0,0x5,0xf,500,500 -20,14,8,0x6,0xf,-1300,700 -22,30,0,0x6,0xf,500,1200 -22,30,1,0x3,0xf,300,300 -22,30,2,0x4,0xf,700,700 -25,300,0,0x6,0xf,1500,1500 -25,300,1,0x6,0xf,-500,1000 -25,300,2,0x6,0xf,200,2400 -25,301,0,0x6,0x9,1000,1000 -30,400,0,0x7,0xf,750,750 -30,400,1,0x7,0xf,250,1000 -30,401,0,0x8,0xf,500,500 -32,500,0,0x9,0xf,500,600 -32,500,1,0x9,0xf,50,600 -32,500,2,0x9,0xf,50,600 -32,501,0,0xA,0xf,600,600 -32,501,1,0x7,0xf,300,1300 +block,tx,log,asset,holder,amount +12,1,0,0x6,0xf,1000 +14,200,4,0x6,0xf,200 +14,200,101,0x6,0xf,200 +14,202,0,0x6,0xf,600 +18,400,0,0x5,0xf,500 +20,14,8,0x6,0xf,-1300 +22,30,0,0x6,0xf,500 +22,30,1,0x3,0xf,300 +22,30,2,0x4,0xf,700 +25,300,0,0x6,0xf,1500 +25,300,1,0x6,0xf,-500 +25,300,2,0x6,0xf,200 +25,301,0,0x6,0x9,1000 +30,400,0,0x7,0xf,750 +30,400,1,0x7,0xf,250 +30,401,0,0x8,0xf,500 +32,500,0,0x9,0xf,500 +32,500,1,0x9,0xf,50 +32,500,2,0x9,0xf,50 +32,501,0,0xA,0xf,600 +32,501,1,0x7,0xf,300 From 9ca78f6abb5d6c8a52201f44deb56820a35c3d36 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Tue, 25 Feb 2025 15:00:54 -0500 Subject: [PATCH 20/36] Removes endBal from transfers --- accounting/.gitignore | 4 ++++ accounting/1.sh | 10 ++++++-- accounting/2.sh | 10 ++++++++ accounting/main.go | 21 ++++++++++++++--- accounting/save/transfers.csv | 44 +++++++++++++++++------------------ 5 files changed, 62 insertions(+), 27 deletions(-) create mode 100755 accounting/2.sh diff --git a/accounting/.gitignore b/accounting/.gitignore index 7c67d9e..a12e237 100644 --- a/accounting/.gitignore +++ b/accounting/.gitignore @@ -2,3 +2,7 @@ two ick main all_tests.txt +tests/0x* +x +xx +x.txt diff --git a/accounting/1.sh b/accounting/1.sh index da8b76a..b669716 100755 --- a/accounting/1.sh +++ b/accounting/1.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash -chifra list $1 | cut -f2,3 | tr '\t' ',' >tests/apps.csv -chifra export --accounting --statements 0xccd7fc08532953676ff801791def07d3617ec712 2>/dev/null | cut -f1,2,3,7,12,15,16,17 | tr '\t' ',' >tests/logs.csv +echo "block,tx" >$1/apps.csv +cat $1/$1.json | jq -r '.data[] | [.blockNumber, .transactionIndex] | join(",")' >>$1/apps.csv + +echo "block,tx,log,asset,holder,amount" >$1/transfers.csv +cat $1/$1.json | jq -r '.data[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>$1/transfers.csv + +echo "block,asset,holder,endBal" >$1/balances.csv +cat $1/$1.json | jq -r '.data[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>$1/balances.csv diff --git a/accounting/2.sh b/accounting/2.sh new file mode 100755 index 0000000..b72fa9b --- /dev/null +++ b/accounting/2.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +echo "block,tx" >$1/apps.csv +cat $1/$1.json | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex] | join(",")' >>$1/apps.csv + +echo "block,tx,log,asset,holder,amount" >$1/transfers.csv +cat $1/$1.json | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>$1/transfers.csv + +echo "block,asset,holder,endBal" >$1/balances.csv +cat $1/$1.json | jq -r '.data[].statements[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>$1/balances.csv diff --git a/accounting/main.go b/accounting/main.go index 2399858..bd59119 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -4,6 +4,8 @@ import ( "encoding/csv" "fmt" "os" + "path/filepath" + "strings" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" @@ -248,12 +250,19 @@ func main() { // --------------------------------------------------------- func (r *Reconciler) initData() { + folder := os.Getenv("FOLDER") + if folder == "" { + folder = "tests" + } // blockNumber,transactionIndex - appsFile, _ := os.Open("tests/apps.csv") + appsFile, _ := os.Open(filepath.Join(folder, "apps.csv")) defer appsFile.Close() appsReader := csv.NewReader(appsFile) appsRecords, _ := appsReader.ReadAll() for _, record := range appsRecords[1:] { + if strings.HasPrefix(record[0], "#") { + continue + } apps = append(apps, types.Appearance{ BlockNumber: uint32(base.MustParseInt64(record[0])), TransactionIndex: uint32(base.MustParseInt64(record[1])), @@ -261,11 +270,14 @@ func (r *Reconciler) initData() { } // blockNumber,assetAddress,accountedFor,endBal - balFile, _ := os.Open("tests/balances.csv") + balFile, _ := os.Open(filepath.Join(folder, "balances.csv")) defer balFile.Close() balReader := csv.NewReader(balFile) balRecords, _ := balReader.ReadAll() for _, record := range balRecords[1:] { + if strings.HasPrefix(record[0], "#") { + continue + } b := Balance2{ BlockNumber: base.Blknum(base.MustParseUint64(record[0])), Asset: base.HexToAddress(record[1]), @@ -278,11 +290,14 @@ func (r *Reconciler) initData() { } // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal - logsFile, _ := os.Open("tests/transfers.csv") + logsFile, _ := os.Open(filepath.Join(folder, "transfers.csv")) defer logsFile.Close() logsReader := csv.NewReader(logsFile) logsRecords, _ := logsReader.ReadAll() for _, record := range logsRecords[1:] { + if strings.HasPrefix(record[0], "#") { + continue + } p := Posting2{ BlockNumber: base.Blknum(base.MustParseUint64(record[0])), TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), diff --git a/accounting/save/transfers.csv b/accounting/save/transfers.csv index 22fb906..b847f44 100644 --- a/accounting/save/transfers.csv +++ b/accounting/save/transfers.csv @@ -1,22 +1,22 @@ -block,tx,log,asset,holder,amount,endBal -12,1,0,0x6,0xf,1000,1000 -14,200,4,0x6,0xf,200,1000 -14,200,101,0x6,0xf,200,1000 -14,202,0,0x6,0xf,600,2000 -18,400,0,0x5,0xf,500,500 -20,14,8,0x6,0xf,-1300,700 -22,30,0,0x6,0xf,500,1200 -22,30,1,0x3,0xf,300,300 -22,30,2,0x4,0xf,700,700 -25,300,0,0x6,0xf,1500,1500 -25,300,1,0x6,0xf,-500,1000 -25,300,2,0x6,0xf,200,2400 -25,301,0,0x6,0x9,1000,1000 -30,400,0,0x7,0xf,750,750 -30,400,1,0x7,0xf,250,1000 -30,401,0,0x8,0xf,500,500 -32,500,0,0x9,0xf,500,600 -32,500,1,0x9,0xf,50,600 -32,500,2,0x9,0xf,50,600 -32,501,0,0xA,0xf,600,600 -32,501,1,0x7,0xf,300,1300 +block,tx,log,asset,holder,amount +12,1,0,0x6,0xf,1000 +14,200,4,0x6,0xf,200 +14,200,101,0x6,0xf,200 +14,202,0,0x6,0xf,600 +18,400,0,0x5,0xf,500 +20,14,8,0x6,0xf,-1300 +22,30,0,0x6,0xf,500 +22,30,1,0x3,0xf,300 +22,30,2,0x4,0xf,700 +25,300,0,0x6,0xf,1500 +25,300,1,0x6,0xf,-500 +25,300,2,0x6,0xf,200 +25,301,0,0x6,0x9,1000 +30,400,0,0x7,0xf,750 +30,400,1,0x7,0xf,250 +30,401,0,0x8,0xf,500 +32,500,0,0x9,0xf,500 +32,500,1,0x9,0xf,50 +32,500,2,0x9,0xf,50 +32,501,0,0xA,0xf,600 +32,501,1,0x7,0xf,300 From e932030604676643074c172dc5b491f7a5afadfc Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Wed, 26 Feb 2025 08:06:51 -0500 Subject: [PATCH 21/36] Best version yet with some cleanings --- accounting/.gitignore | 2 ++ accounting/fix.sh | 29 +++++++++++++++++++++++++++++ accounting/ick.sh | 4 ++++ accounting/main.go | 25 +++++++++++++++---------- accounting/main_test.go | 12 ++++++++++++ 5 files changed, 62 insertions(+), 10 deletions(-) create mode 100755 accounting/fix.sh create mode 100755 accounting/ick.sh create mode 100644 accounting/main_test.go diff --git a/accounting/.gitignore b/accounting/.gitignore index a12e237..9c459ca 100644 --- a/accounting/.gitignore +++ b/accounting/.gitignore @@ -3,6 +3,8 @@ ick main all_tests.txt tests/0x* +tests.2/0x* x xx x.txt +output diff --git a/accounting/fix.sh b/accounting/fix.sh new file mode 100755 index 0000000..1dba4d3 --- /dev/null +++ b/accounting/fix.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +for file in ./tests/*.txt; do + filename=$(basename "$file") + folder=$(dirname "$file") + address="${filename%%_*}" + mkdir -p "./output/${filename}" + echo "FOLDER=./output/${filename} accounting $address >./output/${filename}/${filename}.txt" + echo "block,tx" > "./output/${filename}/apps.csv" + cat "$file" | jq -r '.data[] | [.blockNumber, .transactionIndex] | join(",")' >> "./output/${filename}/apps.csv" + echo "block,tx,log,asset,holder,amount" >./output/${filename}/transfers.csv + cat "$file" | jq -r '.data[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>./output/${filename}/transfers.csv + echo "block,asset,holder,endBal" >./output/${filename}/balances.csv + cat "$file" | jq -r '.data[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>./output/${filename}/balances.csv +done + +for file in ./tests.2/*.txt; do + filename=$(basename "$file") + folder=$(dirname "$file") + address="${filename%%_*}" + mkdir -p "./output/${filename}" + echo "FOLDER=./output/${filename} accounting $address >./output/${filename}/${filename}.txt" + echo "block,tx" > "./output/${filename}/apps.csv" + cat "$file" | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex] | join(",")' >> "./output/${filename}/apps.csv" + echo "block,tx,log,asset,holder,amount" >./output/${filename}/transfers.csv + cat "$file" | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>./output/${filename}/transfers.csv + echo "block,asset,holder,endBal" >./output/${filename}/balances.csv + cat "$file" | jq -r '.data[].statements[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>./output/${filename}/balances.csv +done diff --git a/accounting/ick.sh b/accounting/ick.sh new file mode 100755 index 0000000..edeb4b4 --- /dev/null +++ b/accounting/ick.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +go build -o ../../bin/examples/accounting *.go +#accounting $1 | tee two/file diff --git a/accounting/main.go b/accounting/main.go index bd59119..f1a6058 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -11,8 +11,8 @@ import ( "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) +// --------------------------------------------------------- type Posting2 struct { - // Statement Holder base.Address StatementId int CorrectionIndex int @@ -27,6 +27,7 @@ type Posting2 struct { TransactionIndex base.Txnum `json:"transactionIndex"` } +// --------------------------------------------------------- func (p Posting2) Reconciled() (base.Wei, base.Wei, bool, bool) { checkVal := *new(base.Wei).Add(&p.BeginBalance, &p.EventAmount) tentativeDiff := *new(base.Wei).Sub(&checkVal, &p.TentativeBalance) @@ -39,6 +40,7 @@ func (p Posting2) Reconciled() (base.Wei, base.Wei, bool, bool) { return tentativeDiff, checkpointDiff, tentativeEqual, false } +// --------------------------------------------------------- func PrintHeader() { fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tBegBal\tAmount\tTenBal\tChkBal\tCheck1\tCheck2\tRec\tCp") } @@ -255,7 +257,8 @@ func (r *Reconciler) initData() { folder = "tests" } // blockNumber,transactionIndex - appsFile, _ := os.Open(filepath.Join(folder, "apps.csv")) + appsFn := filepath.Join(folder, "apps.csv") + appsFile, _ := os.Open(appsFn) defer appsFile.Close() appsReader := csv.NewReader(appsFile) appsRecords, _ := appsReader.ReadAll() @@ -270,7 +273,8 @@ func (r *Reconciler) initData() { } // blockNumber,assetAddress,accountedFor,endBal - balFile, _ := os.Open(filepath.Join(folder, "balances.csv")) + balFn := filepath.Join(folder, "balances.csv") + balFile, _ := os.Open(balFn) defer balFile.Close() balReader := csv.NewReader(balFile) balRecords, _ := balReader.ReadAll() @@ -282,7 +286,7 @@ func (r *Reconciler) initData() { BlockNumber: base.Blknum(base.MustParseUint64(record[0])), Asset: base.HexToAddress(record[1]), Holder: base.HexToAddress(record[2]), - Balance: *base.NewWei(base.MustParseInt64(record[3])), + Balance: *base.NewWeiStr(record[3]), } key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.Asset, Holder: b.Holder} @@ -290,11 +294,12 @@ func (r *Reconciler) initData() { } // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal - logsFile, _ := os.Open(filepath.Join(folder, "transfers.csv")) - defer logsFile.Close() - logsReader := csv.NewReader(logsFile) - logsRecords, _ := logsReader.ReadAll() - for _, record := range logsRecords[1:] { + transfersFn := filepath.Join(folder, "transfers.csv") + transfersFile, _ := os.Open(transfersFn) + defer transfersFile.Close() + transfersReader := csv.NewReader(transfersFile) + transfersRecords, _ := transfersReader.ReadAll() + for _, record := range transfersRecords[1:] { if strings.HasPrefix(record[0], "#") { continue } @@ -304,7 +309,7 @@ func (r *Reconciler) initData() { LogIndex: base.Lognum(base.MustParseUint64(record[2])), AssetAddress: base.HexToAddress(record[3]), Holder: base.HexToAddress(record[4]), - EventAmount: *base.NewWei(base.MustParseInt64(record[5])), + EventAmount: *base.NewWeiStr(record[5]), } p.CheckpointBalance, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) diff --git a/accounting/main_test.go b/accounting/main_test.go new file mode 100644 index 0000000..298da52 --- /dev/null +++ b/accounting/main_test.go @@ -0,0 +1,12 @@ +package main + +import ( + "testing" +) + +func Test1(t *testing.T) { + // os.Setenv("FOLDER", "shit") + // prog := os.Args[0] + // os.Args = []string{prog, "0xf503017d7baf7fbc0fff7492b751025c6a78179b"} + // main() +} From 551ed0d761d70f47c0fcb68dc3db170d99f8c2a8 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Thu, 27 Feb 2025 17:27:13 -0500 Subject: [PATCH 22/36] Updating --- .gitignore | 2 + accounting/main.go | 179 +++++++++++++++++++++++++++------------------ 2 files changed, 110 insertions(+), 71 deletions(-) diff --git a/.gitignore b/.gitignore index 5836961..e11a70f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +tools +input .DS_Store shit *.exe diff --git a/accounting/main.go b/accounting/main.go index f1a6058..5de30f6 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "path/filepath" + "sort" "strings" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" @@ -12,43 +13,52 @@ import ( ) // --------------------------------------------------------- -type Posting2 struct { - Holder base.Address - StatementId int - CorrectionIndex int - CorrectionReason string - BeginBalance base.Wei - EventAmount base.Wei - TentativeBalance base.Wei - CheckpointBalance base.Wei - AssetAddress base.Address `json:"assetAddress"` - BlockNumber base.Blknum `json:"blockNumber"` - LogIndex base.Lognum `json:"logIndex"` - TransactionIndex base.Txnum `json:"transactionIndex"` +type LedgerEntry struct { + Holder base.Address + StatementId int + CorrectionId int + CorrectionReason string + Opening base.Wei + Amount base.Wei + Verified base.Wei + AssetAddress base.Address `json:"assetAddress"` + BlockNumber base.Blknum `json:"blockNumber"` + LogIndex base.Lognum `json:"logIndex"` + TransactionIndex base.Txnum `json:"transactionIndex"` } // --------------------------------------------------------- -func (p Posting2) Reconciled() (base.Wei, base.Wei, bool, bool) { - checkVal := *new(base.Wei).Add(&p.BeginBalance, &p.EventAmount) - tentativeDiff := *new(base.Wei).Sub(&checkVal, &p.TentativeBalance) - checkpointDiff := *new(base.Wei).Sub(&checkVal, &p.CheckpointBalance) - tentativeEqual := checkVal.Equal(&p.TentativeBalance) - checkpointEqual := checkVal.Equal(&p.CheckpointBalance) +func (p LedgerEntry) Calculated() base.Wei { + return *new(base.Wei).Add(&p.Opening, &p.Amount) +} + +// --------------------------------------------------------- +func (p LedgerEntry) Reconciled() (base.Wei, base.Wei, bool, bool) { + calc := p.Calculated() + checkVal := *new(base.Wei).Add(&p.Opening, &p.Amount) + tentativeDiff := *new(base.Wei).Sub(&checkVal, &calc) + checkpointDiff := *new(base.Wei).Sub(&checkVal, &p.Verified) + + checkpointEqual := checkVal.Equal(&p.Verified) if checkpointEqual { return tentativeDiff, checkpointDiff, true, true } + + tentativeEqual := checkVal.Equal(&calc) return tentativeDiff, checkpointDiff, tentativeEqual, false } // --------------------------------------------------------- func PrintHeader() { + // fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tOpening\tAmount\tCalculated\tVerified\tCheck1\tCheck2\tRec\tCp") fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tBegBal\tAmount\tTenBal\tChkBal\tCheck1\tCheck2\tRec\tCp") } // --------------------------------------------------------- -func (p *Posting2) Model(chain, format string, verbose bool, extraOpts map[string]any) types.Model { +func (p *LedgerEntry) Model(chain, format string, verbose bool, extraOpts map[string]any) types.Model { _, _, _, _ = chain, format, verbose, extraOpts check1, check2, reconciles, byCheckpoint := p.Reconciled() + calc := p.Calculated() fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%t\t%t\n", p.AssetAddress.Display(0, 1), p.Holder.Display(0, 1), @@ -56,12 +66,12 @@ func (p *Posting2) Model(chain, format string, verbose bool, extraOpts map[strin p.TransactionIndex, p.LogIndex, p.StatementId, - p.CorrectionIndex, + p.CorrectionId, p.CorrectionReason, - p.BeginBalance.Text(10), - p.EventAmount.Text(10), - p.TentativeBalance.Text(10), - p.CheckpointBalance.Text(10), + p.Opening.Text(10), + p.Amount.Text(10), + calc.Text(10), + p.Verified.Text(10), check1.Text(10), check2.Text(10), reconciles, @@ -82,19 +92,23 @@ type Balance2 struct { type Reconciler struct { conn *Connection account base.Address - runningBal map[assetHolderKey]base.Wei - transfers map[blockTxKey][]Posting2 + accountLedger map[assetHolderKey]base.Wei + transfers map[blockTxKey][]LedgerEntry correctionCounter int - statementIndex int + entryCounter int + hasStartBlock bool + ledgerAssets map[base.Address]bool } // --------------------------------------------------------- func NewReconciler(addr base.Address) *Reconciler { r := &Reconciler{ - account: addr, - runningBal: make(map[assetHolderKey]base.Wei), - transfers: make(map[blockTxKey][]Posting2), - conn: NewConnection(), + account: addr, + accountLedger: make(map[assetHolderKey]base.Wei), + transfers: make(map[blockTxKey][]LedgerEntry), + conn: NewConnection(), + hasStartBlock: false, + ledgerAssets: make(map[base.Address]bool), } r.initData() @@ -110,8 +124,8 @@ var ( ) // --------------------------------------------------------- -func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan Posting2 { - ch := make(chan Posting2) +func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry { + ch := make(chan LedgerEntry) go func() { defer close(ch) key := blockTxKey{BlockNumber: base.Blknum(app.BlockNumber), TransactionIndex: base.Txnum(app.TransactionIndex)} @@ -125,74 +139,93 @@ func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan Posting2 { } // --------------------------------------------------------- -func (r *Reconciler) correctingEntry(reason string, onChain, currentBal base.Wei, p *Posting2) Posting2 { +func (r *Reconciler) correctingEntry(reason string, onChain, currentBal base.Wei, p *LedgerEntry) LedgerEntry { correction := *p - correction.EventAmount = *new(base.Wei).Sub(&onChain, ¤tBal) - correction.BeginBalance = currentBal - correction.TentativeBalance = onChain - correction.CheckpointBalance = onChain - - r.correctionCounter++ - correction.CorrectionIndex = r.correctionCounter + correction.Amount = *new(base.Wei).Sub(&onChain, ¤tBal) + correction.Opening = currentBal + correction.Verified = onChain correction.CorrectionReason = reason - - r.statementIndex++ - correction.StatementId = r.statementIndex - - key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - r.runningBal[key] = onChain return correction } // --------------------------------------------------------- -func (r *Reconciler) flushBlock(postings []Posting2, modelChan chan<- types.Modeler) { - assetSeen := make(map[base.Address]bool) +func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.Modeler) { + blockProcessedAssets := make(map[base.Address]bool) assetLastSeen := make(map[base.Address]int) for i, p := range postings { key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - if !assetSeen[p.AssetAddress] { + if !blockProcessedAssets[p.AssetAddress] { + if r.hasStartBlock && !r.ledgerAssets[p.AssetAddress] { + if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber-1); ok { + r.accountLedger[key] = onChain + } + r.ledgerAssets[p.AssetAddress] = true + } if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber-1); ok { - currentBal := r.runningBal[key] + currentBal := r.accountLedger[key] if !onChain.Equal(¤tBal) { correctingEntry := r.correctingEntry("mis", onChain, currentBal, &p) + r.correctionCounter++ + correctingEntry.CorrectionId = r.correctionCounter + r.entryCounter++ + correctingEntry.StatementId = r.entryCounter modelChan <- &correctingEntry } } - assetSeen[p.AssetAddress] = true + blockProcessedAssets[p.AssetAddress] = true } - p.BeginBalance = r.runningBal[key] - p.TentativeBalance = *new(base.Wei).Add(&p.BeginBalance, &p.EventAmount) - r.runningBal[key] = p.TentativeBalance - r.statementIndex++ - p.StatementId = r.statementIndex - + p.Opening = r.accountLedger[key] + r.accountLedger[key] = p.Calculated() + r.entryCounter++ + p.StatementId = r.entryCounter postings[i] = p assetLastSeen[p.AssetAddress] = i modelChan <- &p } + var corrections []LedgerEntry for _, idx := range assetLastSeen { p := postings[idx] key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - currentBal := r.runningBal[key] - if !p.CheckpointBalance.Equal(¤tBal) { - correctingEntry := r.correctingEntry("imb", p.CheckpointBalance, currentBal, &p) - modelChan <- &correctingEntry + currentBal := r.accountLedger[key] + if !p.Verified.Equal(¤tBal) { + correctingEntry := r.correctingEntry("imb", p.Verified, currentBal, &p) + corrections = append(corrections, correctingEntry) + } + } + + sort.SliceStable(corrections, func(i, j int) bool { + if corrections[i].TransactionIndex != corrections[j].TransactionIndex { + return corrections[i].TransactionIndex < corrections[j].TransactionIndex + } + if corrections[i].LogIndex != corrections[j].LogIndex { + return corrections[i].LogIndex < corrections[j].LogIndex } + return corrections[i].AssetAddress.Hex() < corrections[j].AssetAddress.Hex() + }) + + for _, correction := range corrections { + r.correctionCounter++ + correction.CorrectionId = r.correctionCounter + r.entryCounter++ + correction.StatementId = r.entryCounter + modelChan <- &correction + key := assetHolderKey{Asset: correction.AssetAddress, Holder: correction.Holder} + r.accountLedger[key] = correction.Verified } } // --------------------------------------------------------- func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { - postingStream := make(chan Posting2, 100) + postingStream := make(chan LedgerEntry, 100) go func() { defer close(postingStream) var prevBlock base.Blknum for _, app := range apps { bn := base.Blknum(app.BlockNumber) if bn != prevBlock && prevBlock != 0 { - postingStream <- Posting2{ + postingStream <- LedgerEntry{ BlockNumber: prevBlock, AssetAddress: EndOfBlockSentinel, } @@ -203,17 +236,17 @@ func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { prevBlock = bn } if prevBlock != 0 { - postingStream <- Posting2{ + postingStream <- LedgerEntry{ BlockNumber: prevBlock, AssetAddress: EndOfBlockSentinel, } } - postingStream <- Posting2{ + postingStream <- LedgerEntry{ AssetAddress: EndOfStreamSentinel, } }() - var postings []Posting2 + var postings []LedgerEntry for posting := range postingStream { switch posting.AssetAddress { case EndOfBlockSentinel: @@ -303,19 +336,23 @@ func (r *Reconciler) initData() { if strings.HasPrefix(record[0], "#") { continue } - p := Posting2{ + p := LedgerEntry{ BlockNumber: base.Blknum(base.MustParseUint64(record[0])), TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), LogIndex: base.Lognum(base.MustParseUint64(record[2])), AssetAddress: base.HexToAddress(record[3]), Holder: base.HexToAddress(record[4]), - EventAmount: *base.NewWeiStr(record[5]), + Amount: *base.NewWeiStr(record[5]), } - p.CheckpointBalance, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) + p.Verified, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} r.transfers[key] = append(r.transfers[key], p) } + + if firstBlock := os.Getenv("FIRST_BLOCK"); firstBlock != "" { + r.hasStartBlock = true + } } // --------------------------------------------------------- From 0f616f84282a137260ec53790f451f66ac33812d Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Thu, 27 Feb 2025 20:45:37 -0500 Subject: [PATCH 23/36] Cleaning --- accounting/1.sh | 10 ---------- accounting/2.sh | 10 ---------- accounting/fix.sh | 29 ----------------------------- accounting/one/file | 25 ------------------------- accounting/save/apps.csv | 13 ------------- accounting/save/balances.csv | 16 ---------------- accounting/save/file | 25 ------------------------- accounting/save/transfers.csv | 22 ---------------------- accounting/tests/apps.csv | 13 ------------- accounting/tests/balances.csv | 16 ---------------- accounting/tests/file | 25 ------------------------- accounting/tests/transfers.csv | 22 ---------------------- 12 files changed, 226 deletions(-) delete mode 100755 accounting/1.sh delete mode 100755 accounting/2.sh delete mode 100755 accounting/fix.sh delete mode 100644 accounting/one/file delete mode 100644 accounting/save/apps.csv delete mode 100644 accounting/save/balances.csv delete mode 100644 accounting/save/file delete mode 100644 accounting/save/transfers.csv delete mode 100644 accounting/tests/apps.csv delete mode 100644 accounting/tests/balances.csv delete mode 100644 accounting/tests/file delete mode 100644 accounting/tests/transfers.csv diff --git a/accounting/1.sh b/accounting/1.sh deleted file mode 100755 index b669716..0000000 --- a/accounting/1.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -echo "block,tx" >$1/apps.csv -cat $1/$1.json | jq -r '.data[] | [.blockNumber, .transactionIndex] | join(",")' >>$1/apps.csv - -echo "block,tx,log,asset,holder,amount" >$1/transfers.csv -cat $1/$1.json | jq -r '.data[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>$1/transfers.csv - -echo "block,asset,holder,endBal" >$1/balances.csv -cat $1/$1.json | jq -r '.data[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>$1/balances.csv diff --git a/accounting/2.sh b/accounting/2.sh deleted file mode 100755 index b72fa9b..0000000 --- a/accounting/2.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -echo "block,tx" >$1/apps.csv -cat $1/$1.json | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex] | join(",")' >>$1/apps.csv - -echo "block,tx,log,asset,holder,amount" >$1/transfers.csv -cat $1/$1.json | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>$1/transfers.csv - -echo "block,asset,holder,endBal" >$1/balances.csv -cat $1/$1.json | jq -r '.data[].statements[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>$1/balances.csv diff --git a/accounting/fix.sh b/accounting/fix.sh deleted file mode 100755 index 1dba4d3..0000000 --- a/accounting/fix.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -for file in ./tests/*.txt; do - filename=$(basename "$file") - folder=$(dirname "$file") - address="${filename%%_*}" - mkdir -p "./output/${filename}" - echo "FOLDER=./output/${filename} accounting $address >./output/${filename}/${filename}.txt" - echo "block,tx" > "./output/${filename}/apps.csv" - cat "$file" | jq -r '.data[] | [.blockNumber, .transactionIndex] | join(",")' >> "./output/${filename}/apps.csv" - echo "block,tx,log,asset,holder,amount" >./output/${filename}/transfers.csv - cat "$file" | jq -r '.data[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>./output/${filename}/transfers.csv - echo "block,asset,holder,endBal" >./output/${filename}/balances.csv - cat "$file" | jq -r '.data[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>./output/${filename}/balances.csv -done - -for file in ./tests.2/*.txt; do - filename=$(basename "$file") - folder=$(dirname "$file") - address="${filename%%_*}" - mkdir -p "./output/${filename}" - echo "FOLDER=./output/${filename} accounting $address >./output/${filename}/${filename}.txt" - echo "block,tx" > "./output/${filename}/apps.csv" - cat "$file" | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex] | join(",")' >> "./output/${filename}/apps.csv" - echo "block,tx,log,asset,holder,amount" >./output/${filename}/transfers.csv - cat "$file" | jq -r '.data[].statements[] | [.blockNumber, .transactionIndex, .logIndex, .assetAddress, .accountedFor, .amountNet] | join(",")' >>./output/${filename}/transfers.csv - echo "block,asset,holder,endBal" >./output/${filename}/balances.csv - cat "$file" | jq -r '.data[].statements[] | [.blockNumber, .assetAddress, .accountedFor, .endBal] | join(",")' >>./output/${filename}/balances.csv -done diff --git a/accounting/one/file b/accounting/one/file deleted file mode 100644 index 1850503..0000000 --- a/accounting/one/file +++ /dev/null @@ -1,25 +0,0 @@ -Asset Holder Block Tx Log Row Corr Reason BegBal Amount TenBal ChkBal Check1 Check2 Rec Cp -0x6 0xf 12 1 0 1 0 0 1000 1000 1000 0 0 true true -0x6 0xf 14 200 4 2 1 mis 1000 500 1500 1500 0 0 true true -0x6 0xf 14 200 4 3 0 1500 200 1700 2000 0 -300 true false -0x6 0xf 14 200 101 4 0 1700 200 1900 2000 0 -100 true false -0x6 0xf 14 202 0 5 0 1900 600 2500 2000 0 500 true false -0x6 0xf 14 202 0 6 2 imb 2500 -500 2000 2000 0 0 true true -0x5 0xf 18 400 0 7 0 0 500 500 500 0 0 true true -0x6 0xf 20 14 8 8 0 2000 -1300 700 700 0 0 true true -0x6 0xf 22 30 0 9 0 700 500 1200 1200 0 0 true true -0x3 0xf 22 30 1 10 0 0 300 300 400 0 -100 true false -0x4 0xf 22 30 2 11 0 0 700 700 700 0 0 true true -0x3 0xf 22 30 1 12 3 imb 300 100 400 400 0 0 true true -0x6 0xf 25 300 0 13 0 1200 1500 2700 2400 0 300 true false -0x6 0xf 25 300 1 14 0 2700 -500 2200 2400 0 -200 true false -0x6 0xf 25 300 2 15 0 2200 200 2400 2400 0 0 true true -0x7 0xf 30 400 0 16 0 0 750 750 1000 0 -250 true false -0x7 0xf 30 400 1 17 0 750 250 1000 1000 0 0 true true -0x8 0xf 30 401 0 18 0 0 500 500 500 0 0 true true -0x9 0xf 32 500 0 19 0 0 500 500 600 0 -100 true false -0x9 0xf 32 500 1 20 0 500 50 550 600 0 -50 true false -0x9 0xf 32 500 2 21 0 550 50 600 600 0 0 true true -0xa 0xf 32 501 0 22 0 0 600 600 600 0 0 true true -0x7 0xf 32 501 1 23 0 1000 300 1300 1200 0 100 true false -0x7 0xf 32 501 1 24 4 imb 1300 -100 1200 1200 0 0 true true diff --git a/accounting/save/apps.csv b/accounting/save/apps.csv deleted file mode 100644 index 4df8070..0000000 --- a/accounting/save/apps.csv +++ /dev/null @@ -1,13 +0,0 @@ -block,tx -12,1 -14,200 -14,202 -18,400 -20,14 -22,30 -25,300 -25,301 -30,400 -30,401 -32,500 -32,501 diff --git a/accounting/save/balances.csv b/accounting/save/balances.csv deleted file mode 100644 index 1778184..0000000 --- a/accounting/save/balances.csv +++ /dev/null @@ -1,16 +0,0 @@ -block,asset,holder,endBal -12,0x6,0xf,1000 -13,0x6,0xf,1500 -14,0x6,0xf,2000 -18,0x5,0xf,500 -20,0x6,0xf,700 -22,0x6,0xf,1200 -22,0x3,0xf,400 -22,0x4,0xf,700 -25,0x6,0xf,2400 -25,0x6,0x9,800 -30,0x7,0xf,1000 -30,0x8,0xf,500 -32,0x9,0xf,600 -32,0xA,0xf,600 -32,0x7,0xf,1200 diff --git a/accounting/save/file b/accounting/save/file deleted file mode 100644 index 678988d..0000000 --- a/accounting/save/file +++ /dev/null @@ -1,25 +0,0 @@ -Asset Holder Block Tx Log Row Corr Reason BegBal Amount TenBal ChkBal Check1 Check2 Rec Cp -0x6 0xf 12 1 0 1 0 0 1000 1000 1000 0 0 true true -0x6 0xf 14 200 4 2 1 mis 1000 500 1500 1500 0 0 true true -0x6 0xf 14 200 4 3 0 1500 200 1700 1000 0 700 true false -0x6 0xf 14 200 101 4 0 1700 200 1900 1000 0 900 true false -0x6 0xf 14 202 0 5 0 1900 600 2500 2000 0 500 true false -0x6 0xf 14 202 0 6 2 imb 2500 -500 2000 2000 0 0 true true -0x5 0xf 18 400 0 7 0 0 500 500 500 0 0 true true -0x6 0xf 20 14 8 8 0 2000 -1300 700 700 0 0 true true -0x6 0xf 22 30 0 9 0 700 500 1200 1200 0 0 true true -0x3 0xf 22 30 1 10 0 0 300 300 300 0 0 true true -0x4 0xf 22 30 2 11 0 0 700 700 700 0 0 true true -0x3 0xf 22 30 1 12 3 imb 300 100 400 400 0 0 true true -0x6 0xf 25 300 0 13 0 1200 1500 2700 1500 0 1200 true false -0x6 0xf 25 300 1 14 0 2700 -500 2200 1000 0 1200 true false -0x6 0xf 25 300 2 15 0 2200 200 2400 2400 0 0 true true -0x7 0xf 30 400 0 16 0 0 750 750 750 0 0 true true -0x7 0xf 30 400 1 17 0 750 250 1000 1000 0 0 true true -0x8 0xf 30 401 0 18 0 0 500 500 500 0 0 true true -0x9 0xf 32 500 0 19 0 0 500 500 600 0 -100 true false -0x9 0xf 32 500 1 20 0 500 50 550 600 0 -50 true false -0x9 0xf 32 500 2 21 0 550 50 600 600 0 0 true true -0xa 0xf 32 501 0 22 0 0 600 600 600 0 0 true true -0x7 0xf 32 501 1 23 0 1000 300 1300 1300 0 0 true true -0x7 0xf 32 501 1 24 4 imb 1300 -100 1200 1200 0 0 true true diff --git a/accounting/save/transfers.csv b/accounting/save/transfers.csv deleted file mode 100644 index b847f44..0000000 --- a/accounting/save/transfers.csv +++ /dev/null @@ -1,22 +0,0 @@ -block,tx,log,asset,holder,amount -12,1,0,0x6,0xf,1000 -14,200,4,0x6,0xf,200 -14,200,101,0x6,0xf,200 -14,202,0,0x6,0xf,600 -18,400,0,0x5,0xf,500 -20,14,8,0x6,0xf,-1300 -22,30,0,0x6,0xf,500 -22,30,1,0x3,0xf,300 -22,30,2,0x4,0xf,700 -25,300,0,0x6,0xf,1500 -25,300,1,0x6,0xf,-500 -25,300,2,0x6,0xf,200 -25,301,0,0x6,0x9,1000 -30,400,0,0x7,0xf,750 -30,400,1,0x7,0xf,250 -30,401,0,0x8,0xf,500 -32,500,0,0x9,0xf,500 -32,500,1,0x9,0xf,50 -32,500,2,0x9,0xf,50 -32,501,0,0xA,0xf,600 -32,501,1,0x7,0xf,300 diff --git a/accounting/tests/apps.csv b/accounting/tests/apps.csv deleted file mode 100644 index 4df8070..0000000 --- a/accounting/tests/apps.csv +++ /dev/null @@ -1,13 +0,0 @@ -block,tx -12,1 -14,200 -14,202 -18,400 -20,14 -22,30 -25,300 -25,301 -30,400 -30,401 -32,500 -32,501 diff --git a/accounting/tests/balances.csv b/accounting/tests/balances.csv deleted file mode 100644 index 1778184..0000000 --- a/accounting/tests/balances.csv +++ /dev/null @@ -1,16 +0,0 @@ -block,asset,holder,endBal -12,0x6,0xf,1000 -13,0x6,0xf,1500 -14,0x6,0xf,2000 -18,0x5,0xf,500 -20,0x6,0xf,700 -22,0x6,0xf,1200 -22,0x3,0xf,400 -22,0x4,0xf,700 -25,0x6,0xf,2400 -25,0x6,0x9,800 -30,0x7,0xf,1000 -30,0x8,0xf,500 -32,0x9,0xf,600 -32,0xA,0xf,600 -32,0x7,0xf,1200 diff --git a/accounting/tests/file b/accounting/tests/file deleted file mode 100644 index 678988d..0000000 --- a/accounting/tests/file +++ /dev/null @@ -1,25 +0,0 @@ -Asset Holder Block Tx Log Row Corr Reason BegBal Amount TenBal ChkBal Check1 Check2 Rec Cp -0x6 0xf 12 1 0 1 0 0 1000 1000 1000 0 0 true true -0x6 0xf 14 200 4 2 1 mis 1000 500 1500 1500 0 0 true true -0x6 0xf 14 200 4 3 0 1500 200 1700 1000 0 700 true false -0x6 0xf 14 200 101 4 0 1700 200 1900 1000 0 900 true false -0x6 0xf 14 202 0 5 0 1900 600 2500 2000 0 500 true false -0x6 0xf 14 202 0 6 2 imb 2500 -500 2000 2000 0 0 true true -0x5 0xf 18 400 0 7 0 0 500 500 500 0 0 true true -0x6 0xf 20 14 8 8 0 2000 -1300 700 700 0 0 true true -0x6 0xf 22 30 0 9 0 700 500 1200 1200 0 0 true true -0x3 0xf 22 30 1 10 0 0 300 300 300 0 0 true true -0x4 0xf 22 30 2 11 0 0 700 700 700 0 0 true true -0x3 0xf 22 30 1 12 3 imb 300 100 400 400 0 0 true true -0x6 0xf 25 300 0 13 0 1200 1500 2700 1500 0 1200 true false -0x6 0xf 25 300 1 14 0 2700 -500 2200 1000 0 1200 true false -0x6 0xf 25 300 2 15 0 2200 200 2400 2400 0 0 true true -0x7 0xf 30 400 0 16 0 0 750 750 750 0 0 true true -0x7 0xf 30 400 1 17 0 750 250 1000 1000 0 0 true true -0x8 0xf 30 401 0 18 0 0 500 500 500 0 0 true true -0x9 0xf 32 500 0 19 0 0 500 500 600 0 -100 true false -0x9 0xf 32 500 1 20 0 500 50 550 600 0 -50 true false -0x9 0xf 32 500 2 21 0 550 50 600 600 0 0 true true -0xa 0xf 32 501 0 22 0 0 600 600 600 0 0 true true -0x7 0xf 32 501 1 23 0 1000 300 1300 1300 0 0 true true -0x7 0xf 32 501 1 24 4 imb 1300 -100 1200 1200 0 0 true true diff --git a/accounting/tests/transfers.csv b/accounting/tests/transfers.csv deleted file mode 100644 index b847f44..0000000 --- a/accounting/tests/transfers.csv +++ /dev/null @@ -1,22 +0,0 @@ -block,tx,log,asset,holder,amount -12,1,0,0x6,0xf,1000 -14,200,4,0x6,0xf,200 -14,200,101,0x6,0xf,200 -14,202,0,0x6,0xf,600 -18,400,0,0x5,0xf,500 -20,14,8,0x6,0xf,-1300 -22,30,0,0x6,0xf,500 -22,30,1,0x3,0xf,300 -22,30,2,0x4,0xf,700 -25,300,0,0x6,0xf,1500 -25,300,1,0x6,0xf,-500 -25,300,2,0x6,0xf,200 -25,301,0,0x6,0x9,1000 -30,400,0,0x7,0xf,750 -30,400,1,0x7,0xf,250 -30,401,0,0x8,0xf,500 -32,500,0,0x9,0xf,500 -32,500,1,0x9,0xf,50 -32,500,2,0x9,0xf,50 -32,501,0,0xA,0xf,600 -32,501,1,0x7,0xf,300 From d01c39b87ca10f5460afc5a5b0a9aca271570579 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Thu, 27 Feb 2025 22:01:54 -0500 Subject: [PATCH 24/36] Cleanings --- accounting/.gitignore | 3 +-- accounting/go.sum | 2 ++ accounting/ick.sh | 4 ---- accounting/main.go | 7 +++---- accounting/main_test.go | 12 ------------ accounting/makefile | 26 ++++++++++++++++++++++++++ 6 files changed, 32 insertions(+), 22 deletions(-) delete mode 100755 accounting/ick.sh delete mode 100644 accounting/main_test.go create mode 100644 accounting/makefile diff --git a/accounting/.gitignore b/accounting/.gitignore index 9c459ca..74fa50a 100644 --- a/accounting/.gitignore +++ b/accounting/.gitignore @@ -2,8 +2,7 @@ two ick main all_tests.txt -tests/0x* -tests.2/0x* +tests x xx x.txt diff --git a/accounting/go.sum b/accounting/go.sum index 00089cd..8acca6c 100644 --- a/accounting/go.sum +++ b/accounting/go.sum @@ -20,6 +20,8 @@ github.com/ethereum/go-ethereum v1.14.13 h1:L81Wmv0OUP6cf4CW6wtXsr23RUrDhKs2+Y9Q github.com/ethereum/go-ethereum v1.14.13/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= diff --git a/accounting/ick.sh b/accounting/ick.sh deleted file mode 100755 index edeb4b4..0000000 --- a/accounting/ick.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash - -go build -o ../../bin/examples/accounting *.go -#accounting $1 | tee two/file diff --git a/accounting/main.go b/accounting/main.go index 5de30f6..89922f4 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -50,8 +50,7 @@ func (p LedgerEntry) Reconciled() (base.Wei, base.Wei, bool, bool) { // --------------------------------------------------------- func PrintHeader() { - // fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tOpening\tAmount\tCalculated\tVerified\tCheck1\tCheck2\tRec\tCp") - fmt.Println("Asset\tHolder\tBlock\tTx\tLog\tRow\tCorr\tReason\tBegBal\tAmount\tTenBal\tChkBal\tCheck1\tCheck2\tRec\tCp") + fmt.Println("asset\tholder\tblockNumber\ttransactionIndex\tlogIndex\trowIndex\tcorrectionIndex\tcorrectionReason\tbegBal\tamountNet\tendBalCalc\tendBal\tcheck1\tcheck2\treconciled\tcheckpoint") } // --------------------------------------------------------- @@ -60,8 +59,8 @@ func (p *LedgerEntry) Model(chain, format string, verbose bool, extraOpts map[st check1, check2, reconciles, byCheckpoint := p.Reconciled() calc := p.Calculated() fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%t\t%t\n", - p.AssetAddress.Display(0, 1), - p.Holder.Display(0, 1), + p.AssetAddress.Hex(), + p.Holder.Hex(), p.BlockNumber, p.TransactionIndex, p.LogIndex, diff --git a/accounting/main_test.go b/accounting/main_test.go deleted file mode 100644 index 298da52..0000000 --- a/accounting/main_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import ( - "testing" -) - -func Test1(t *testing.T) { - // os.Setenv("FOLDER", "shit") - // prog := os.Args[0] - // os.Args = []string{prog, "0xf503017d7baf7fbc0fff7492b751025c6a78179b"} - // main() -} diff --git a/accounting/makefile b/accounting/makefile new file mode 100644 index 0000000..b8d699a --- /dev/null +++ b/accounting/makefile @@ -0,0 +1,26 @@ +#------------------------------------------------- +bin=../../bin/examples/ + +#------------------------------------------------- +exec=accounting +dest=$(bin)/$(exec) + +#------------------------------------------------- +all: + @make app + +every: + @cd ../../build ; make ; cd - + @make app + +app: + @mkdir -p bin + @go build -o $(dest) *.go + +test: + @make app + @cd tests && ./run_all.sh && cd - + +#------------------------------------------------- +clean: + -@$(RM) -f $(dest) From d9929ee5de72ed95ab9943281390fdd90a15c2ab Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Thu, 27 Feb 2025 22:07:35 -0500 Subject: [PATCH 25/36] Cleanings --- accounting/main.go | 68 +++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 89922f4..b27089c 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -14,32 +14,32 @@ import ( // --------------------------------------------------------- type LedgerEntry struct { - Holder base.Address - StatementId int - CorrectionId int - CorrectionReason string - Opening base.Wei - Amount base.Wei - Verified base.Wei + Amount base.Wei `json:"amount"` AssetAddress base.Address `json:"assetAddress"` BlockNumber base.Blknum `json:"blockNumber"` + CorrectionId base.Value `json:"correctionId"` + CorrectingReason string `json:"correctingReason"` + Holder base.Address `json:"holder"` LogIndex base.Lognum `json:"logIndex"` + BegBal base.Wei `json:"begBal"` + StatementId base.Value `json:"statementId"` TransactionIndex base.Txnum `json:"transactionIndex"` + EndBal base.Wei `json:"endBal"` } // --------------------------------------------------------- func (p LedgerEntry) Calculated() base.Wei { - return *new(base.Wei).Add(&p.Opening, &p.Amount) + return *new(base.Wei).Add(&p.BegBal, &p.Amount) } // --------------------------------------------------------- func (p LedgerEntry) Reconciled() (base.Wei, base.Wei, bool, bool) { calc := p.Calculated() - checkVal := *new(base.Wei).Add(&p.Opening, &p.Amount) + checkVal := *new(base.Wei).Add(&p.BegBal, &p.Amount) tentativeDiff := *new(base.Wei).Sub(&checkVal, &calc) - checkpointDiff := *new(base.Wei).Sub(&checkVal, &p.Verified) + checkpointDiff := *new(base.Wei).Sub(&checkVal, &p.EndBal) - checkpointEqual := checkVal.Equal(&p.Verified) + checkpointEqual := checkVal.Equal(&p.EndBal) if checkpointEqual { return tentativeDiff, checkpointDiff, true, true } @@ -66,11 +66,11 @@ func (p *LedgerEntry) Model(chain, format string, verbose bool, extraOpts map[st p.LogIndex, p.StatementId, p.CorrectionId, - p.CorrectionReason, - p.Opening.Text(10), + p.CorrectingReason, + p.BegBal.Text(10), p.Amount.Text(10), calc.Text(10), - p.Verified.Text(10), + p.EndBal.Text(10), check1.Text(10), check2.Text(10), reconciles, @@ -81,10 +81,10 @@ func (p *LedgerEntry) Model(chain, format string, verbose bool, extraOpts map[st // --------------------------------------------------------- type Balance2 struct { - BlockNumber base.Blknum - Asset base.Address - Holder base.Address - Balance base.Wei + BlockNumber base.Blknum + AssetAddress base.Address + Holder base.Address + EndBal base.Wei } // --------------------------------------------------------- @@ -93,8 +93,8 @@ type Reconciler struct { account base.Address accountLedger map[assetHolderKey]base.Wei transfers map[blockTxKey][]LedgerEntry - correctionCounter int - entryCounter int + correctionCounter base.Value + entryCounter base.Value hasStartBlock bool ledgerAssets map[base.Address]bool } @@ -141,9 +141,9 @@ func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry func (r *Reconciler) correctingEntry(reason string, onChain, currentBal base.Wei, p *LedgerEntry) LedgerEntry { correction := *p correction.Amount = *new(base.Wei).Sub(&onChain, ¤tBal) - correction.Opening = currentBal - correction.Verified = onChain - correction.CorrectionReason = reason + correction.BegBal = currentBal + correction.EndBal = onChain + correction.CorrectingReason = reason return correction } @@ -174,7 +174,7 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M blockProcessedAssets[p.AssetAddress] = true } - p.Opening = r.accountLedger[key] + p.BegBal = r.accountLedger[key] r.accountLedger[key] = p.Calculated() r.entryCounter++ p.StatementId = r.entryCounter @@ -188,8 +188,8 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M p := postings[idx] key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} currentBal := r.accountLedger[key] - if !p.Verified.Equal(¤tBal) { - correctingEntry := r.correctingEntry("imb", p.Verified, currentBal, &p) + if !p.EndBal.Equal(¤tBal) { + correctingEntry := r.correctingEntry("imb", p.EndBal, currentBal, &p) corrections = append(corrections, correctingEntry) } } @@ -211,7 +211,7 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M correction.StatementId = r.entryCounter modelChan <- &correction key := assetHolderKey{Asset: correction.AssetAddress, Holder: correction.Holder} - r.accountLedger[key] = correction.Verified + r.accountLedger[key] = correction.EndBal } } @@ -315,14 +315,14 @@ func (r *Reconciler) initData() { continue } b := Balance2{ - BlockNumber: base.Blknum(base.MustParseUint64(record[0])), - Asset: base.HexToAddress(record[1]), - Holder: base.HexToAddress(record[2]), - Balance: *base.NewWeiStr(record[3]), + BlockNumber: base.Blknum(base.MustParseUint64(record[0])), + AssetAddress: base.HexToAddress(record[1]), + Holder: base.HexToAddress(record[2]), + EndBal: *base.NewWeiStr(record[3]), } - key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.Asset, Holder: b.Holder} - r.conn.balanceMap[key] = b.Balance + key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.AssetAddress, Holder: b.Holder} + r.conn.balanceMap[key] = b.EndBal } // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal @@ -343,7 +343,7 @@ func (r *Reconciler) initData() { Holder: base.HexToAddress(record[4]), Amount: *base.NewWeiStr(record[5]), } - p.Verified, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) + p.EndBal, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} r.transfers[key] = append(r.transfers[key], p) From 01b465e23050a1c902d425a26a49d6d88903b983 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Thu, 27 Feb 2025 22:17:43 -0500 Subject: [PATCH 26/36] Cleanings --- accounting/main.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index b27089c..3936fda 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -28,15 +28,15 @@ type LedgerEntry struct { } // --------------------------------------------------------- -func (p LedgerEntry) Calculated() base.Wei { - return *new(base.Wei).Add(&p.BegBal, &p.Amount) +func (p LedgerEntry) EndBalCalc() *base.Wei { + return new(base.Wei).Add(&p.BegBal, &p.Amount) } // --------------------------------------------------------- func (p LedgerEntry) Reconciled() (base.Wei, base.Wei, bool, bool) { - calc := p.Calculated() + calc := p.EndBalCalc() checkVal := *new(base.Wei).Add(&p.BegBal, &p.Amount) - tentativeDiff := *new(base.Wei).Sub(&checkVal, &calc) + tentativeDiff := *new(base.Wei).Sub(&checkVal, calc) checkpointDiff := *new(base.Wei).Sub(&checkVal, &p.EndBal) checkpointEqual := checkVal.Equal(&p.EndBal) @@ -44,7 +44,7 @@ func (p LedgerEntry) Reconciled() (base.Wei, base.Wei, bool, bool) { return tentativeDiff, checkpointDiff, true, true } - tentativeEqual := checkVal.Equal(&calc) + tentativeEqual := checkVal.Equal(calc) return tentativeDiff, checkpointDiff, tentativeEqual, false } @@ -57,7 +57,7 @@ func PrintHeader() { func (p *LedgerEntry) Model(chain, format string, verbose bool, extraOpts map[string]any) types.Model { _, _, _, _ = chain, format, verbose, extraOpts check1, check2, reconciles, byCheckpoint := p.Reconciled() - calc := p.Calculated() + calc := p.EndBalCalc() fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%t\t%t\n", p.AssetAddress.Hex(), p.Holder.Hex(), @@ -175,7 +175,7 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M } p.BegBal = r.accountLedger[key] - r.accountLedger[key] = p.Calculated() + r.accountLedger[key] = *p.EndBalCalc() r.entryCounter++ p.StatementId = r.entryCounter postings[i] = p From cc7ce0a53ac5986dc88970b935d00c6f0d800de7 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 28 Feb 2025 00:10:31 -0500 Subject: [PATCH 27/36] Cleaning --- accounting/go.mod | 27 ++ accounting/go.sum | 756 +++++++++++++++++++++++++++++++++++++++++++++ accounting/main.go | 202 +++++------- 3 files changed, 853 insertions(+), 132 deletions(-) diff --git a/accounting/go.mod b/accounting/go.mod index 4a71070..30ce518 100644 --- a/accounting/go.mod +++ b/accounting/go.mod @@ -5,11 +5,25 @@ go 1.23.1 require github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c require ( + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/benbjohnson/clock v1.3.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/bykof/gostradamus v1.0.4 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-ethereum v1.14.13 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/gocarina/gocsv v0.0.0-20230123225133-763e25b40669 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.3.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ipfs/boxo v0.8.0 // indirect @@ -21,6 +35,7 @@ require ( github.com/libp2p/go-libp2p v0.27.8 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect @@ -32,13 +47,25 @@ require ( github.com/multiformats/go-varint v0.0.7 // indirect github.com/panjf2000/ants/v2 v2.10.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/supranational/blst v0.3.13 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/wealdtech/go-ens/v3 v3.5.2 // indirect + github.com/wealdtech/go-multicodec v1.4.0 // indirect + github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.31.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/net v0.33.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/protobuf v1.34.2 // indirect lukechampine.com/blake3 v1.1.7 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/accounting/go.sum b/accounting/go.sum index 8acca6c..179ebf2 100644 --- a/accounting/go.sum +++ b/accounting/go.sum @@ -1,87 +1,540 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +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.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bykof/gostradamus v1.0.4 h1:77iq/tANg5rZSxjoZ98zepZbv3VrotijEmlnH/WycD4= github.com/bykof/gostradamus v1.0.4/go.mod h1:pdH0bv8yFLwr4G6EbM1j3QUb4AdCmiG7xlTjVwYyPNM= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +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.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/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.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +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.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= +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/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= +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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.10.15/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/ethereum/go-ethereum v1.14.13 h1:L81Wmv0OUP6cf4CW6wtXsr23RUrDhKs2+Y9Qto+OgHU= github.com/ethereum/go-ethereum v1.14.13/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +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/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +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/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/gocarina/gocsv v0.0.0-20230123225133-763e25b40669 h1:MvZzCA/mduVWoBSVKJeMdv+AqXQmZZ8i6p8889ejt/Y= +github.com/gocarina/gocsv v0.0.0-20230123225133-763e25b40669/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +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.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= +github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs= github.com/ipfs/boxo v0.8.0/go.mod h1:RIsi4CnTyQ7AUsNn5gXljJYZlQrHBMnJp94p73liFiA= +github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-ipfs-api v0.6.1 h1:nK5oeFOdMh1ogT+GCOcyBFOOcFGNuudSb1rg9YDyAKE= github.com/ipfs/go-ipfs-api v0.6.1/go.mod h1:8pl+ZMF2LX42szbqGbpOBEiI1/rYaImvTvJtG0g+rL4= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU= +github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.11/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +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/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= github.com/libp2p/go-libp2p v0.27.8 h1:IX5x/4yKwyPQeVS2AXHZ3J4YATM9oHBGH1gBc23jBAI= github.com/libp2p/go-libp2p v0.27.8/go.mod h1:eCFFtd0s5i/EVKR7+5Ki8bM7qwkNW3TPTTSSW9sz8NE= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +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/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= +github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= +github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= +github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= +github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= 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/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/status-im/keycard-go v0.0.0-20200402102358-957c09536969/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -89,22 +542,325 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= +github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wealdtech/go-ens/v3 v3.5.2 h1:70CAIiG9hcue6Ja5wxWcnCwi5UfmiW5NH1styxpAbgU= +github.com/wealdtech/go-ens/v3 v3.5.2/go.mod h1:4qs2EEeTmv538RoB8QjLS9w5N1HSXS253qhLyNEShBs= +github.com/wealdtech/go-multicodec v1.4.0 h1:iq5PgxwssxnXGGPTIK1srvt6U5bJwIp7k6kBrudIWxg= +github.com/wealdtech/go-multicodec v1.4.0/go.mod h1:aedGMaTeYkIqi/KCPre1ho5rTb3hGpu/snBOS3GQLw4= +github.com/wealdtech/go-string2eth v1.1.0 h1:USJQmysUrBYYmZs7d45pMb90hRSyEwizP7lZaOZLDAw= +github.com/wealdtech/go-string2eth v1.1.0/go.mod h1:RUzsLjJtbZaJ/3UKn9kY19a/vCCUHtEWoUW3uiK6yGU= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20220213190939-1e6e3497d506/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +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/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/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= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/accounting/main.go b/accounting/main.go index 3936fda..48c5ab1 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -2,7 +2,6 @@ package main import ( "encoding/csv" - "fmt" "os" "path/filepath" "sort" @@ -13,83 +12,12 @@ import ( ) // --------------------------------------------------------- -type LedgerEntry struct { - Amount base.Wei `json:"amount"` - AssetAddress base.Address `json:"assetAddress"` - BlockNumber base.Blknum `json:"blockNumber"` - CorrectionId base.Value `json:"correctionId"` - CorrectingReason string `json:"correctingReason"` - Holder base.Address `json:"holder"` - LogIndex base.Lognum `json:"logIndex"` - BegBal base.Wei `json:"begBal"` - StatementId base.Value `json:"statementId"` - TransactionIndex base.Txnum `json:"transactionIndex"` - EndBal base.Wei `json:"endBal"` -} - -// --------------------------------------------------------- -func (p LedgerEntry) EndBalCalc() *base.Wei { - return new(base.Wei).Add(&p.BegBal, &p.Amount) -} - -// --------------------------------------------------------- -func (p LedgerEntry) Reconciled() (base.Wei, base.Wei, bool, bool) { - calc := p.EndBalCalc() - checkVal := *new(base.Wei).Add(&p.BegBal, &p.Amount) - tentativeDiff := *new(base.Wei).Sub(&checkVal, calc) - checkpointDiff := *new(base.Wei).Sub(&checkVal, &p.EndBal) - - checkpointEqual := checkVal.Equal(&p.EndBal) - if checkpointEqual { - return tentativeDiff, checkpointDiff, true, true - } - - tentativeEqual := checkVal.Equal(calc) - return tentativeDiff, checkpointDiff, tentativeEqual, false -} - -// --------------------------------------------------------- -func PrintHeader() { - fmt.Println("asset\tholder\tblockNumber\ttransactionIndex\tlogIndex\trowIndex\tcorrectionIndex\tcorrectionReason\tbegBal\tamountNet\tendBalCalc\tendBal\tcheck1\tcheck2\treconciled\tcheckpoint") -} - -// --------------------------------------------------------- -func (p *LedgerEntry) Model(chain, format string, verbose bool, extraOpts map[string]any) types.Model { - _, _, _, _ = chain, format, verbose, extraOpts - check1, check2, reconciles, byCheckpoint := p.Reconciled() - calc := p.EndBalCalc() - fmt.Printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%t\t%t\n", - p.AssetAddress.Hex(), - p.Holder.Hex(), - p.BlockNumber, - p.TransactionIndex, - p.LogIndex, - p.StatementId, - p.CorrectionId, - p.CorrectingReason, - p.BegBal.Text(10), - p.Amount.Text(10), - calc.Text(10), - p.EndBal.Text(10), - check1.Text(10), - check2.Text(10), - reconciles, - byCheckpoint, - ) - return types.Model{} -} - -// --------------------------------------------------------- -type Balance2 struct { - BlockNumber base.Blknum - AssetAddress base.Address - Holder base.Address - EndBal base.Wei -} +type LedgerEntry = types.Statement // --------------------------------------------------------- type Reconciler struct { conn *Connection + apps []types.Appearance account base.Address accountLedger map[assetHolderKey]base.Wei transfers map[blockTxKey][]LedgerEntry @@ -116,11 +44,25 @@ func NewReconciler(addr base.Address) *Reconciler { } // --------------------------------------------------------- -var ( - apps []types.Appearance - EndOfBlockSentinel = base.HexToAddress("0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - EndOfStreamSentinel = base.HexToAddress("0xbeefdeadbeefdeadbeefdeadbeefdeadbeefdead") -) +type Connection struct { + balanceMap map[bnAssetHolderKey]base.Wei +} + +// --------------------------------------------------------- +func NewConnection() *Connection { + return &Connection{ + balanceMap: make(map[bnAssetHolderKey]base.Wei), + } +} + +// --------------------------------------------------------- +func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (base.Wei, bool) { + key := bnAssetHolderKey{BlockNumber: bn, Asset: asset, Holder: holder} + if bal, ok := c.balanceMap[key]; ok { + return bal, true + } + return *base.ZeroWei, false +} // --------------------------------------------------------- func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry { @@ -140,10 +82,17 @@ func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry // --------------------------------------------------------- func (r *Reconciler) correctingEntry(reason string, onChain, currentBal base.Wei, p *LedgerEntry) LedgerEntry { correction := *p - correction.Amount = *new(base.Wei).Sub(&onChain, ¤tBal) + correctionDiff := *new(base.Wei).Sub(&onChain, ¤tBal) correction.BegBal = currentBal correction.EndBal = onChain correction.CorrectingReason = reason + correction.AmountIn = *base.ZeroWei + correction.AmountOut = *base.ZeroWei + if correctionDiff.Cmp(base.ZeroWei) > 0 { + correction.AmountIn = correctionDiff + } else if correctionDiff.Cmp(base.ZeroWei) < 0 { + correction.AmountOut = *correctionDiff.Neg() + } return correction } @@ -221,12 +170,12 @@ func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { go func() { defer close(postingStream) var prevBlock base.Blknum - for _, app := range apps { + for _, app := range r.apps { bn := base.Blknum(app.BlockNumber) if bn != prevBlock && prevBlock != 0 { postingStream <- LedgerEntry{ BlockNumber: prevBlock, - AssetAddress: EndOfBlockSentinel, + AssetAddress: base.EndOfBlockSentinel, } } for p := range r.getPostingChannel(&app) { @@ -237,21 +186,21 @@ func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { if prevBlock != 0 { postingStream <- LedgerEntry{ BlockNumber: prevBlock, - AssetAddress: EndOfBlockSentinel, + AssetAddress: base.EndOfBlockSentinel, } } postingStream <- LedgerEntry{ - AssetAddress: EndOfStreamSentinel, + AssetAddress: base.EndOfStreamSentinel, } }() var postings []LedgerEntry for posting := range postingStream { switch posting.AssetAddress { - case EndOfBlockSentinel: + case base.EndOfBlockSentinel: r.flushBlock(postings, modelChan) postings = nil - case EndOfStreamSentinel: + case base.EndOfStreamSentinel: if len(postings) > 0 { r.flushBlock(postings, modelChan) } @@ -262,26 +211,6 @@ func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { } } -// --------------------------------------------------------- -func main() { - if len(os.Args) < 2 { - os.Args = append(os.Args, "0xf") - } - - r := NewReconciler(base.HexToAddress(os.Args[1])) - - modelChan := make(chan types.Modeler, 1000) - go func() { - defer close(modelChan) - r.processStream(modelChan) - }() - - PrintHeader() - for p := range modelChan { - p.Model("mainnet", "text", false, nil) - } -} - // --------------------------------------------------------- func (r *Reconciler) initData() { folder := os.Getenv("FOLDER") @@ -298,7 +227,7 @@ func (r *Reconciler) initData() { if strings.HasPrefix(record[0], "#") { continue } - apps = append(apps, types.Appearance{ + r.apps = append(r.apps, types.Appearance{ BlockNumber: uint32(base.MustParseInt64(record[0])), TransactionIndex: uint32(base.MustParseInt64(record[1])), }) @@ -314,7 +243,7 @@ func (r *Reconciler) initData() { if strings.HasPrefix(record[0], "#") { continue } - b := Balance2{ + b := LedgerEntry{ BlockNumber: base.Blknum(base.MustParseUint64(record[0])), AssetAddress: base.HexToAddress(record[1]), Holder: base.HexToAddress(record[2]), @@ -335,47 +264,31 @@ func (r *Reconciler) initData() { if strings.HasPrefix(record[0], "#") { continue } + amt := base.NewWeiStr(record[5]) p := LedgerEntry{ BlockNumber: base.Blknum(base.MustParseUint64(record[0])), TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), LogIndex: base.Lognum(base.MustParseUint64(record[2])), AssetAddress: base.HexToAddress(record[3]), + AmountIn: *base.ZeroWei, + AmountOut: *base.ZeroWei, Holder: base.HexToAddress(record[4]), - Amount: *base.NewWeiStr(record[5]), + } + if amt.Cmp(base.ZeroWei) > 0 { + p.AmountIn = *amt + } else if amt.Cmp(base.ZeroWei) < 0 { + p.AmountOut = *amt.Neg() } p.EndBal, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} r.transfers[key] = append(r.transfers[key], p) } - if firstBlock := os.Getenv("FIRST_BLOCK"); firstBlock != "" { r.hasStartBlock = true } } -// --------------------------------------------------------- -// Connection provides on-chain balance lookups -type Connection struct { - balanceMap map[bnAssetHolderKey]base.Wei -} - -// --------------------------------------------------------- -func NewConnection() *Connection { - return &Connection{ - balanceMap: make(map[bnAssetHolderKey]base.Wei), - } -} - -// --------------------------------------------------------- -func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (base.Wei, bool) { - key := bnAssetHolderKey{BlockNumber: bn, Asset: asset, Holder: holder} - if bal, ok := c.balanceMap[key]; ok { - return bal, true - } - return *base.ZeroWei, false -} - // --------------------------------------------------------- type blockTxKey struct { BlockNumber base.Blknum @@ -388,8 +301,33 @@ type assetHolderKey struct { Holder base.Address } +// --------------------------------------------------------- type bnAssetHolderKey struct { BlockNumber base.Blknum Asset base.Address Holder base.Address } + +// --------------------------------------------------------- +func main() { + if len(os.Args) < 2 { + os.Args = append(os.Args, "0xf") + } + + r := NewReconciler(base.HexToAddress(os.Args[1])) + + modelChan := make(chan types.Modeler, 1000) + go func() { + defer close(modelChan) + r.processStream(modelChan) + }() + + extraOpts := map[string]any{ + "accounting": true, + } + + types.PrintHeader() + for p := range modelChan { + p.Model("mainnet", "text", false, extraOpts) + } +} From ceb4afd979203a03ddd62a121aed050db57362d7 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Fri, 28 Feb 2025 23:20:29 -0500 Subject: [PATCH 28/36] Cleaning --- accounting/go.mod | 27 -- accounting/go.sum | 756 -------------------------------------------- accounting/main.go | 115 ++++--- accounting/makefile | 4 + 4 files changed, 73 insertions(+), 829 deletions(-) diff --git a/accounting/go.mod b/accounting/go.mod index 30ce518..4a71070 100644 --- a/accounting/go.mod +++ b/accounting/go.mod @@ -5,25 +5,11 @@ go 1.23.1 require github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c require ( - github.com/Microsoft/go-winio v0.6.2 // indirect github.com/benbjohnson/clock v1.3.0 // indirect - github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/bykof/gostradamus v1.0.4 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-ethereum v1.14.13 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/gocarina/gocsv v0.0.0-20230123225133-763e25b40669 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.3.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ipfs/boxo v0.8.0 // indirect @@ -35,7 +21,6 @@ require ( github.com/libp2p/go-libp2p v0.27.8 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect @@ -47,25 +32,13 @@ require ( github.com/multiformats/go-varint v0.0.7 // indirect github.com/panjf2000/ants/v2 v2.10.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/supranational/blst v0.3.13 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/wealdtech/go-ens/v3 v3.5.2 // indirect - github.com/wealdtech/go-multicodec v1.4.0 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.31.0 // indirect - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/net v0.33.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/term v0.27.0 // indirect - golang.org/x/text v0.21.0 // indirect google.golang.org/protobuf v1.34.2 // indirect lukechampine.com/blake3 v1.1.7 // indirect - rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/accounting/go.sum b/accounting/go.sum index 179ebf2..8acca6c 100644 --- a/accounting/go.sum +++ b/accounting/go.sum @@ -1,540 +1,87 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c h1:Wrfb99W0n3klva0ML2HGvHsW+A2TlfU7LC8MSjBBKHk= github.com/TrueBlocks/trueblocks-core/src/apps/chifra v0.0.0-20250131141006-ca15858b0e7c/go.mod h1:UkmTpxKWh9RkC8V1LEi0MpjHKchRdptAalt6rf6zhks= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -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.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= -github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bykof/gostradamus v1.0.4 h1:77iq/tANg5rZSxjoZ98zepZbv3VrotijEmlnH/WycD4= github.com/bykof/gostradamus v1.0.4/go.mod h1:pdH0bv8yFLwr4G6EbM1j3QUb4AdCmiG7xlTjVwYyPNM= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= -github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -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.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= -github.com/cockroachdb/pebble v1.1.2/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.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -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.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -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/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= -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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= -github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.10.15/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/ethereum/go-ethereum v1.14.13 h1:L81Wmv0OUP6cf4CW6wtXsr23RUrDhKs2+Y9Qto+OgHU= github.com/ethereum/go-ethereum v1.14.13/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= -github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= -github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -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/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -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/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/gocarina/gocsv v0.0.0-20230123225133-763e25b40669 h1:MvZzCA/mduVWoBSVKJeMdv+AqXQmZZ8i6p8889ejt/Y= -github.com/gocarina/gocsv v0.0.0-20230123225133-763e25b40669/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= -github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -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.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= -github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs= github.com/ipfs/boxo v0.8.0/go.mod h1:RIsi4CnTyQ7AUsNn5gXljJYZlQrHBMnJp94p73liFiA= -github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-ipfs-api v0.6.1 h1:nK5oeFOdMh1ogT+GCOcyBFOOcFGNuudSb1rg9YDyAKE= github.com/ipfs/go-ipfs-api v0.6.1/go.mod h1:8pl+ZMF2LX42szbqGbpOBEiI1/rYaImvTvJtG0g+rL4= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU= -github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.11/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -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/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= github.com/libp2p/go-libp2p v0.27.8 h1:IX5x/4yKwyPQeVS2AXHZ3J4YATM9oHBGH1gBc23jBAI= github.com/libp2p/go-libp2p v0.27.8/go.mod h1:eCFFtd0s5i/EVKR7+5Ki8bM7qwkNW3TPTTSSW9sz8NE= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -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/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= 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/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/status-im/keycard-go v0.0.0-20200402102358-957c09536969/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -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.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -542,325 +89,22 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= -github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= -github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/wealdtech/go-ens/v3 v3.5.2 h1:70CAIiG9hcue6Ja5wxWcnCwi5UfmiW5NH1styxpAbgU= -github.com/wealdtech/go-ens/v3 v3.5.2/go.mod h1:4qs2EEeTmv538RoB8QjLS9w5N1HSXS253qhLyNEShBs= -github.com/wealdtech/go-multicodec v1.4.0 h1:iq5PgxwssxnXGGPTIK1srvt6U5bJwIp7k6kBrudIWxg= -github.com/wealdtech/go-multicodec v1.4.0/go.mod h1:aedGMaTeYkIqi/KCPre1ho5rTb3hGpu/snBOS3GQLw4= -github.com/wealdtech/go-string2eth v1.1.0 h1:USJQmysUrBYYmZs7d45pMb90hRSyEwizP7lZaOZLDAw= -github.com/wealdtech/go-string2eth v1.1.0/go.mod h1:RUzsLjJtbZaJ/3UKn9kY19a/vCCUHtEWoUW3uiK6yGU= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220213190939-1e6e3497d506/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -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/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/accounting/main.go b/accounting/main.go index 48c5ab1..4c15437 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -2,12 +2,14 @@ package main import ( "encoding/csv" + "fmt" "os" "path/filepath" "sort" "strings" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) @@ -222,15 +224,22 @@ func (r *Reconciler) initData() { appsFile, _ := os.Open(appsFn) defer appsFile.Close() appsReader := csv.NewReader(appsFile) - appsRecords, _ := appsReader.ReadAll() - for _, record := range appsRecords[1:] { - if strings.HasPrefix(record[0], "#") { - continue + appsReader.Comment = '#' + if appsRecords, err := appsReader.ReadAll(); err != nil { + fmt.Println("Problem with data file:", appsFn) + logger.Fatal(err) + } else if len(appsRecords) == 0 { + logger.Fatal("no transfers") + } else { + for _, record := range appsRecords[1:] { + if strings.HasPrefix(record[0], "#") { + continue + } + r.apps = append(r.apps, types.Appearance{ + BlockNumber: uint32(base.MustParseInt64(record[0])), + TransactionIndex: uint32(base.MustParseInt64(record[1])), + }) } - r.apps = append(r.apps, types.Appearance{ - BlockNumber: uint32(base.MustParseInt64(record[0])), - TransactionIndex: uint32(base.MustParseInt64(record[1])), - }) } // blockNumber,assetAddress,accountedFor,endBal @@ -238,20 +247,27 @@ func (r *Reconciler) initData() { balFile, _ := os.Open(balFn) defer balFile.Close() balReader := csv.NewReader(balFile) - balRecords, _ := balReader.ReadAll() - for _, record := range balRecords[1:] { - if strings.HasPrefix(record[0], "#") { - continue - } - b := LedgerEntry{ - BlockNumber: base.Blknum(base.MustParseUint64(record[0])), - AssetAddress: base.HexToAddress(record[1]), - Holder: base.HexToAddress(record[2]), - EndBal: *base.NewWeiStr(record[3]), - } + balReader.Comment = '#' + if balRecords, err := balReader.ReadAll(); err != nil { + fmt.Println("Problem with data file:", balFn) + logger.Fatal(err) + } else if len(balRecords) == 0 { + logger.Fatal("no transfers") + } else { + for _, record := range balRecords[1:] { + if strings.HasPrefix(record[0], "#") { + continue + } + b := LedgerEntry{ + BlockNumber: base.Blknum(base.MustParseUint64(record[0])), + AssetAddress: base.HexToAddress(record[1]), + Holder: base.HexToAddress(record[2]), + EndBal: *base.NewWeiStr(record[3]), + } - key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.AssetAddress, Holder: b.Holder} - r.conn.balanceMap[key] = b.EndBal + key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.AssetAddress, Holder: b.Holder} + r.conn.balanceMap[key] = b.EndBal + } } // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal @@ -259,33 +275,40 @@ func (r *Reconciler) initData() { transfersFile, _ := os.Open(transfersFn) defer transfersFile.Close() transfersReader := csv.NewReader(transfersFile) - transfersRecords, _ := transfersReader.ReadAll() - for _, record := range transfersRecords[1:] { - if strings.HasPrefix(record[0], "#") { - continue - } - amt := base.NewWeiStr(record[5]) - p := LedgerEntry{ - BlockNumber: base.Blknum(base.MustParseUint64(record[0])), - TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), - LogIndex: base.Lognum(base.MustParseUint64(record[2])), - AssetAddress: base.HexToAddress(record[3]), - AmountIn: *base.ZeroWei, - AmountOut: *base.ZeroWei, - Holder: base.HexToAddress(record[4]), + transfersReader.Comment = '#' + if transfersRecords, err := transfersReader.ReadAll(); err != nil { + fmt.Println("Problem with data file:", transfersFn) + logger.Fatal(err) + } else if len(transfersRecords) == 0 { + logger.Fatal("no transfers") + } else { + for _, record := range transfersRecords[1:] { + if strings.HasPrefix(record[0], "#") { + continue + } + amt := base.NewWeiStr(record[5]) + p := LedgerEntry{ + BlockNumber: base.Blknum(base.MustParseUint64(record[0])), + TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), + LogIndex: base.Lognum(base.MustParseUint64(record[2])), + AssetAddress: base.HexToAddress(record[3]), + AmountIn: *base.ZeroWei, + AmountOut: *base.ZeroWei, + Holder: base.HexToAddress(record[4]), + } + if amt.Cmp(base.ZeroWei) > 0 { + p.AmountIn = *amt + } else if amt.Cmp(base.ZeroWei) < 0 { + p.AmountOut = *amt.Neg() + } + p.EndBal, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) + + key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} + r.transfers[key] = append(r.transfers[key], p) } - if amt.Cmp(base.ZeroWei) > 0 { - p.AmountIn = *amt - } else if amt.Cmp(base.ZeroWei) < 0 { - p.AmountOut = *amt.Neg() + if firstBlock := os.Getenv("FIRST_BLOCK"); firstBlock != "" { + r.hasStartBlock = true } - p.EndBal, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) - - key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} - r.transfers[key] = append(r.transfers[key], p) - } - if firstBlock := os.Getenv("FIRST_BLOCK"); firstBlock != "" { - r.hasStartBlock = true } } diff --git a/accounting/makefile b/accounting/makefile index b8d699a..ef457e8 100644 --- a/accounting/makefile +++ b/accounting/makefile @@ -21,6 +21,10 @@ test: @make app @cd tests && ./run_all.sh && cd - +data: + @make app + @cd tests && source xxx && cd - + #------------------------------------------------- clean: -@$(RM) -f $(dest) From f458fb6c7894d5cd8229b5bb770a391434664717 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sat, 1 Mar 2025 14:49:21 -0500 Subject: [PATCH 29/36] Cleaning --- accounting/.gitignore | 1 - accounting/makefile | 2 +- accounting/tests/.gitignore | 1 + accounting/tests/run_all.sh | 11 +++++ accounting/tests/run_one.sh | 10 +++++ accounting/tests/update_data.sh | 77 +++++++++++++++++++++++++++++++++ 6 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 accounting/tests/.gitignore create mode 100755 accounting/tests/run_all.sh create mode 100755 accounting/tests/run_one.sh create mode 100755 accounting/tests/update_data.sh diff --git a/accounting/.gitignore b/accounting/.gitignore index 74fa50a..438a2e8 100644 --- a/accounting/.gitignore +++ b/accounting/.gitignore @@ -2,7 +2,6 @@ two ick main all_tests.txt -tests x xx x.txt diff --git a/accounting/makefile b/accounting/makefile index ef457e8..fb41545 100644 --- a/accounting/makefile +++ b/accounting/makefile @@ -23,7 +23,7 @@ test: data: @make app - @cd tests && source xxx && cd - + @cd tests && ./update_data.sh && cd - #------------------------------------------------- clean: diff --git a/accounting/tests/.gitignore b/accounting/tests/.gitignore new file mode 100644 index 0000000..00d344d --- /dev/null +++ b/accounting/tests/.gitignore @@ -0,0 +1 @@ +acctExport* diff --git a/accounting/tests/run_all.sh b/accounting/tests/run_all.sh new file mode 100755 index 0000000..f4e75a5 --- /dev/null +++ b/accounting/tests/run_all.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Find all directories starting with acctExport +for dir in acctExport*/; do + if [ -d "$dir" ] && [ -f "$dir/run_account.sh" ]; then + echo "Running script in: $dir" + cd "$dir" + ./run_account.sh + cd .. + fi +done diff --git a/accounting/tests/run_one.sh b/accounting/tests/run_one.sh new file mode 100755 index 0000000..28ac788 --- /dev/null +++ b/accounting/tests/run_one.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +FOLDER=./ accounting $1 >output.txt + +# Compare to gold tests +CURRENT_DIR=$(pwd) +RELATIVE_PATH=${CURRENT_DIR#*/tests/} +DIR1="$CURRENT_DIR" +DIR2="/Users/jrush/Development.2/trueblocks-core/examples/accounting/tests/$RELATIVE_PATH" +diff -r "$DIR1" "$DIR2" diff --git a/accounting/tests/update_data.sh b/accounting/tests/update_data.sh new file mode 100755 index 0000000..9dd9290 --- /dev/null +++ b/accounting/tests/update_data.sh @@ -0,0 +1,77 @@ +cd acctExport_transfer_2 +echo "# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --transfers --last_block 4000000 --fmt csv" >transfers.csv +chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --transfers --last_block 4000000 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_2_asset_filt +echo "# chifra export trueblocks.eth --accounting --transfers --asset 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee --asset 0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359 --fmt csv --first_block 8856476 --last_block 9193814 --fmt csv" >transfers.csv +chifra export trueblocks.eth --accounting --transfers --asset 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee --asset 0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359 --fmt csv --first_block 8856476 --last_block 9193814 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_2_ether +echo "# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --transfers --last_block 4000000 --fmt csv" >transfers.csv +chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --transfers --last_block 4000000 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_3 +echo "# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --transfers --last_block 4000000 --fmt csv" >transfers.csv +chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --transfers --last_block 4000000 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_failed_2572_1 +echo "# chifra export 0x054993ab0f2b1acc0fdc65405ee203b4271bebe6 --accounting --transfers --asset 0xf5b2c59f6db42ffcdfc1625999c81fdf17953384 --last_block 15549163 --max_records 40 --fmt csv" >transfers.csv +chifra export 0x054993ab0f2b1acc0fdc65405ee203b4271bebe6 --accounting --transfers --asset 0xf5b2c59f6db42ffcdfc1625999c81fdf17953384 --last_block 15549163 --max_records 40 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_failed_2572_2 +echo "# chifra export 0x65b0d5e1dc0dee0704f53f660aa865c72e986fc7 --accounting --transfers --asset 0xc713e5e149d5d0715dcd1c156a020976e7e56b88 --first_block 11670418 --last_block 11670420 --max_records 40 --fmt csv" >transfers.csv +chifra export 0x65b0d5e1dc0dee0704f53f660aa865c72e986fc7 --accounting --transfers --asset 0xc713e5e149d5d0715dcd1c156a020976e7e56b88 --first_block 11670418 --last_block 11670420 --max_records 40 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_filter_traces +echo "# chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --traces --first_block 8860513 --last_block 8860531 --asset 0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359 --fmt csv" >transfers.csv +chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --traces --first_block 8860513 --last_block 8860531 --asset 0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_filtered +echo "# chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --first_block 8860513 --last_block 8860531 --asset 0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359 --fmt csv" >transfers.csv +chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --first_block 8860513 --last_block 8860531 --asset 0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_forward +echo "# chifra export 0x868b8fd259abfcfdf9634c343593b34ef359641d --accounting --transfers --traces --last_block 8769141 --fmt csv" >transfers.csv +chifra export 0x868b8fd259abfcfdf9634c343593b34ef359641d --accounting --transfers --traces --last_block 8769141 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_nft +echo "# chifra export trueblocks.eth --accounting --transfers --first_block 8876230 --last_block 9024186 --fmt csv" >transfers.csv +chifra export trueblocks.eth --accounting --transfers --first_block 8876230 --last_block 9024186 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_token_ibt +echo "# chifra export 0xec3ef464bf821c3b10a18adf9ac7177a628e87cc --accounting --transfers --first_block 7005600 --last_block 7005780 --fmt csv" >transfers.csv +chifra export 0xec3ef464bf821c3b10a18adf9ac7177a628e87cc --accounting --transfers --first_block 7005600 --last_block 7005780 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_token_ibt_2 +echo "# chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --first_block 12704455 --last_block 12705893 --max_records 9 --fmt csv" >transfers.csv +chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --first_block 12704455 --last_block 12705893 --max_records 9 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_tributes +echo "# chifra export 0x868b8fd259abfcfdf9634c343593b34ef359641d --accounting --transfers --first_block 8769018 --last_block 8769053 --asset 0x0ba45a8b5d5575935b8158a88c631e9f9c95a2e5 --fmt csv" >transfers.csv +chifra export 0x868b8fd259abfcfdf9634c343593b34ef359641d --accounting --transfers --first_block 8769018 --last_block 8769053 --asset 0x0ba45a8b5d5575935b8158a88c631e9f9c95a2e5 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_unfiltered +echo "# chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --first_block 8860513 --last_block 8860531 --fmt csv" >transfers.csv +chifra export 0xf503017d7baf7fbc0fff7492b751025c6a78179b --accounting --transfers --first_block 8860513 --last_block 8860531 --fmt csv --append --output transfers.csv + +cd ../acctExport_transfer_wei_2_1 +echo "# chifra export 0x05a56e2d52c817161883f50c441c3228cfe54d9f --accounting --transfers --first_record 0 --max_records 15 --fmt csv" >transfers.csv +chifra export 0x05a56e2d52c817161883f50c441c3228cfe54d9f --accounting --transfers --first_record 0 --max_records 15 --fmt csv --append --output transfers.csv + +# cd ../acctExport_transfer_wei_2_2 +# echo "# chifra export 0x05a56e2d52c817161883f50c441c3228cfe54d9f --accounting --statements --first_record 250 --max_records 15 --fmt csv" >transfers.csv +# chifra export 0x05a56e2d52c817161883f50c441c3228cfe54d9f --accounting --statements --first_record 250 --max_records 15 --fmt csv --append --output transfers.csv + +# cd ../acctExport_transfer_wei_2_3 +# echo "# chifra export 0x05a56e2d52c817161883f50c441c3228cfe54d9f --accounting --statements --first_block 15700073 --last_block 15700075 --fmt csv" >transfers.csv +# chifra export 0x05a56e2d52c817161883f50c441c3228cfe54d9f --accounting --statements --first_block 15700073 --last_block 15700075 --fmt csv --append --output transfers.csv + +# cd ../acctExport_transfer_3_accounting +# echo "# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --last_block 4000000 --fmt csv" >transfers.csv +# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --accounting --last_block 4000000 --fmt csv --append --output transfers.csv + +# cd ../acctExport_transfer_3_bad +# echo "# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --transfers --last_block 4000000 --fmt csv" >transfers.csv +# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --transfers --last_block 4000000 --fmt csv --append --output transfers.csv + +cd .. From 799f38d3d3c75bdc2c6000aca7248990a6234815 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sat, 1 Mar 2025 16:52:32 -0500 Subject: [PATCH 30/36] Best version yet. Still slightly broken. --- accounting/makefile | 2 +- accounting/tests/update_data.sh | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/accounting/makefile b/accounting/makefile index fb41545..faf073f 100644 --- a/accounting/makefile +++ b/accounting/makefile @@ -22,7 +22,7 @@ test: @cd tests && ./run_all.sh && cd - data: - @make app + @make every @cd tests && ./update_data.sh && cd - #------------------------------------------------- diff --git a/accounting/tests/update_data.sh b/accounting/tests/update_data.sh index 9dd9290..c8d33a8 100755 --- a/accounting/tests/update_data.sh +++ b/accounting/tests/update_data.sh @@ -74,4 +74,11 @@ chifra export 0x05a56e2d52c817161883f50c441c3228cfe54d9f --accounting --transfer # echo "# chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --transfers --last_block 4000000 --fmt csv" >transfers.csv # chifra export 0x08166f02313feae18bb044e7877c808b55b5bf58 --transfers --last_block 4000000 --fmt csv --append --output transfers.csv +# Compare to gold tests +CURRENT_DIR=$(pwd) +RELATIVE_PATH=${CURRENT_DIR#*/tests/} +DIR1="$CURRENT_DIR" +DIR2="/Users/jrush/Development.2/trueblocks-core/examples/accounting/tests/$RELATIVE_PATH" +diff -r "$DIR1" "$DIR2" + cd .. From 7919ef61a538e2adf1f184a3e07fef346682d454 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Sun, 2 Mar 2025 17:58:48 -0500 Subject: [PATCH 31/36] Cleangins --- accounting/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 4c15437..6b938c5 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -58,9 +58,9 @@ func NewConnection() *Connection { } // --------------------------------------------------------- -func (c *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (base.Wei, bool) { +func (conn *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (base.Wei, bool) { key := bnAssetHolderKey{BlockNumber: bn, Asset: asset, Holder: holder} - if bal, ok := c.balanceMap[key]; ok { + if bal, ok := conn.balanceMap[key]; ok { return bal, true } return *base.ZeroWei, false From b50665dbb88c81e605d7e73b471680de9f7948ae Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 3 Mar 2025 15:24:55 -0500 Subject: [PATCH 32/36] Cleanings --- accounting/main.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 6b938c5..520ecd6 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -82,10 +82,10 @@ func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry } // --------------------------------------------------------- -func (r *Reconciler) correctingEntry(reason string, onChain, currentBal base.Wei, p *LedgerEntry) LedgerEntry { +func (r *Reconciler) correctingEntry(reason string, onChain, curBal base.Wei, p *LedgerEntry) LedgerEntry { correction := *p - correctionDiff := *new(base.Wei).Sub(&onChain, ¤tBal) - correction.BegBal = currentBal + correctionDiff := *new(base.Wei).Sub(&onChain, &curBal) + correction.BegBal = curBal correction.EndBal = onChain correction.CorrectingReason = reason correction.AmountIn = *base.ZeroWei @@ -112,9 +112,9 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M r.ledgerAssets[p.AssetAddress] = true } if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber-1); ok { - currentBal := r.accountLedger[key] - if !onChain.Equal(¤tBal) { - correctingEntry := r.correctingEntry("mis", onChain, currentBal, &p) + curBal := r.accountLedger[key] + if !onChain.Equal(&curBal) { + correctingEntry := r.correctingEntry("mis", onChain, curBal, &p) r.correctionCounter++ correctingEntry.CorrectionId = r.correctionCounter r.entryCounter++ @@ -138,9 +138,9 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M for _, idx := range assetLastSeen { p := postings[idx] key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - currentBal := r.accountLedger[key] - if !p.EndBal.Equal(¤tBal) { - correctingEntry := r.correctingEntry("imb", p.EndBal, currentBal, &p) + curBal := r.accountLedger[key] + if !p.EndBal.Equal(&curBal) { + correctingEntry := r.correctingEntry("imb", p.EndBal, curBal, &p) corrections = append(corrections, correctingEntry) } } From d10f2310e941410c37298817b2077b30640b655e Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 3 Mar 2025 16:04:24 -0500 Subject: [PATCH 33/36] Cleanings --- accounting/main.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 6b938c5..520ecd6 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -82,10 +82,10 @@ func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry } // --------------------------------------------------------- -func (r *Reconciler) correctingEntry(reason string, onChain, currentBal base.Wei, p *LedgerEntry) LedgerEntry { +func (r *Reconciler) correctingEntry(reason string, onChain, curBal base.Wei, p *LedgerEntry) LedgerEntry { correction := *p - correctionDiff := *new(base.Wei).Sub(&onChain, ¤tBal) - correction.BegBal = currentBal + correctionDiff := *new(base.Wei).Sub(&onChain, &curBal) + correction.BegBal = curBal correction.EndBal = onChain correction.CorrectingReason = reason correction.AmountIn = *base.ZeroWei @@ -112,9 +112,9 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M r.ledgerAssets[p.AssetAddress] = true } if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber-1); ok { - currentBal := r.accountLedger[key] - if !onChain.Equal(¤tBal) { - correctingEntry := r.correctingEntry("mis", onChain, currentBal, &p) + curBal := r.accountLedger[key] + if !onChain.Equal(&curBal) { + correctingEntry := r.correctingEntry("mis", onChain, curBal, &p) r.correctionCounter++ correctingEntry.CorrectionId = r.correctionCounter r.entryCounter++ @@ -138,9 +138,9 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M for _, idx := range assetLastSeen { p := postings[idx] key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - currentBal := r.accountLedger[key] - if !p.EndBal.Equal(¤tBal) { - correctingEntry := r.correctingEntry("imb", p.EndBal, currentBal, &p) + curBal := r.accountLedger[key] + if !p.EndBal.Equal(&curBal) { + correctingEntry := r.correctingEntry("imb", p.EndBal, curBal, &p) corrections = append(corrections, correctingEntry) } } From 82650dc3a1569ea799fd049c3b48ad14338316b4 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 3 Mar 2025 16:26:52 -0500 Subject: [PATCH 34/36] Cleanings --- accounting/main.go | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 520ecd6..c18bb93 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -9,20 +9,18 @@ import ( "strings" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/ledger3" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) -// --------------------------------------------------------- -type LedgerEntry = types.Statement - // --------------------------------------------------------- type Reconciler struct { conn *Connection apps []types.Appearance account base.Address accountLedger map[assetHolderKey]base.Wei - transfers map[blockTxKey][]LedgerEntry + transfers map[blockTxKey][]ledger3.AssetTransfer correctionCounter base.Value entryCounter base.Value hasStartBlock bool @@ -34,7 +32,7 @@ func NewReconciler(addr base.Address) *Reconciler { r := &Reconciler{ account: addr, accountLedger: make(map[assetHolderKey]base.Wei), - transfers: make(map[blockTxKey][]LedgerEntry), + transfers: make(map[blockTxKey][]ledger3.AssetTransfer), conn: NewConnection(), hasStartBlock: false, ledgerAssets: make(map[base.Address]bool), @@ -67,8 +65,8 @@ func (conn *Connection) GetBalanceAtToken(asset base.Address, holder base.Addres } // --------------------------------------------------------- -func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry { - ch := make(chan LedgerEntry) +func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan ledger3.AssetTransfer { + ch := make(chan ledger3.AssetTransfer) go func() { defer close(ch) key := blockTxKey{BlockNumber: base.Blknum(app.BlockNumber), TransactionIndex: base.Txnum(app.TransactionIndex)} @@ -82,7 +80,7 @@ func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry } // --------------------------------------------------------- -func (r *Reconciler) correctingEntry(reason string, onChain, curBal base.Wei, p *LedgerEntry) LedgerEntry { +func (r *Reconciler) correctingEntry(reason string, onChain, curBal base.Wei, p *ledger3.AssetTransfer) ledger3.AssetTransfer { correction := *p correctionDiff := *new(base.Wei).Sub(&onChain, &curBal) correction.BegBal = curBal @@ -99,7 +97,7 @@ func (r *Reconciler) correctingEntry(reason string, onChain, curBal base.Wei, p } // --------------------------------------------------------- -func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.Modeler) { +func (r *Reconciler) flushBlock(postings []ledger3.AssetTransfer, modelChan chan<- types.Modeler) { blockProcessedAssets := make(map[base.Address]bool) assetLastSeen := make(map[base.Address]int) for i, p := range postings { @@ -134,7 +132,7 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M modelChan <- &p } - var corrections []LedgerEntry + var corrections []ledger3.AssetTransfer for _, idx := range assetLastSeen { p := postings[idx] key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} @@ -168,14 +166,14 @@ func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.M // --------------------------------------------------------- func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { - postingStream := make(chan LedgerEntry, 100) + postingStream := make(chan ledger3.AssetTransfer, 100) go func() { defer close(postingStream) var prevBlock base.Blknum for _, app := range r.apps { bn := base.Blknum(app.BlockNumber) if bn != prevBlock && prevBlock != 0 { - postingStream <- LedgerEntry{ + postingStream <- ledger3.AssetTransfer{ BlockNumber: prevBlock, AssetAddress: base.EndOfBlockSentinel, } @@ -186,17 +184,17 @@ func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { prevBlock = bn } if prevBlock != 0 { - postingStream <- LedgerEntry{ + postingStream <- ledger3.AssetTransfer{ BlockNumber: prevBlock, AssetAddress: base.EndOfBlockSentinel, } } - postingStream <- LedgerEntry{ + postingStream <- ledger3.AssetTransfer{ AssetAddress: base.EndOfStreamSentinel, } }() - var postings []LedgerEntry + var postings []ledger3.AssetTransfer for posting := range postingStream { switch posting.AssetAddress { case base.EndOfBlockSentinel: @@ -258,7 +256,7 @@ func (r *Reconciler) initData() { if strings.HasPrefix(record[0], "#") { continue } - b := LedgerEntry{ + b := ledger3.AssetTransfer{ BlockNumber: base.Blknum(base.MustParseUint64(record[0])), AssetAddress: base.HexToAddress(record[1]), Holder: base.HexToAddress(record[2]), @@ -287,7 +285,7 @@ func (r *Reconciler) initData() { continue } amt := base.NewWeiStr(record[5]) - p := LedgerEntry{ + p := ledger3.AssetTransfer{ BlockNumber: base.Blknum(base.MustParseUint64(record[0])), TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), LogIndex: base.Lognum(base.MustParseUint64(record[2])), From 39a38f3ab49abd437f740460a079b33b32a20225 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Mon, 3 Mar 2025 20:26:00 -0500 Subject: [PATCH 35/36] Moves new ledger from examples/accounting to ledger3 --- accounting/main.go | 330 +-------------------------------------------- 1 file changed, 3 insertions(+), 327 deletions(-) diff --git a/accounting/main.go b/accounting/main.go index 520ecd6..5cce33a 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -1,348 +1,24 @@ package main import ( - "encoding/csv" - "fmt" "os" - "path/filepath" - "sort" - "strings" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/base" - "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger" + "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/ledger3" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/types" ) -// --------------------------------------------------------- -type LedgerEntry = types.Statement - -// --------------------------------------------------------- -type Reconciler struct { - conn *Connection - apps []types.Appearance - account base.Address - accountLedger map[assetHolderKey]base.Wei - transfers map[blockTxKey][]LedgerEntry - correctionCounter base.Value - entryCounter base.Value - hasStartBlock bool - ledgerAssets map[base.Address]bool -} - -// --------------------------------------------------------- -func NewReconciler(addr base.Address) *Reconciler { - r := &Reconciler{ - account: addr, - accountLedger: make(map[assetHolderKey]base.Wei), - transfers: make(map[blockTxKey][]LedgerEntry), - conn: NewConnection(), - hasStartBlock: false, - ledgerAssets: make(map[base.Address]bool), - } - - r.initData() - - return r -} - -// --------------------------------------------------------- -type Connection struct { - balanceMap map[bnAssetHolderKey]base.Wei -} - -// --------------------------------------------------------- -func NewConnection() *Connection { - return &Connection{ - balanceMap: make(map[bnAssetHolderKey]base.Wei), - } -} - -// --------------------------------------------------------- -func (conn *Connection) GetBalanceAtToken(asset base.Address, holder base.Address, bn base.Blknum) (base.Wei, bool) { - key := bnAssetHolderKey{BlockNumber: bn, Asset: asset, Holder: holder} - if bal, ok := conn.balanceMap[key]; ok { - return bal, true - } - return *base.ZeroWei, false -} - -// --------------------------------------------------------- -func (r *Reconciler) getPostingChannel(app *types.Appearance) <-chan LedgerEntry { - ch := make(chan LedgerEntry) - go func() { - defer close(ch) - key := blockTxKey{BlockNumber: base.Blknum(app.BlockNumber), TransactionIndex: base.Txnum(app.TransactionIndex)} - for _, p := range r.transfers[key] { - if p.Holder == r.account { - ch <- p - } - } - }() - return ch -} - -// --------------------------------------------------------- -func (r *Reconciler) correctingEntry(reason string, onChain, curBal base.Wei, p *LedgerEntry) LedgerEntry { - correction := *p - correctionDiff := *new(base.Wei).Sub(&onChain, &curBal) - correction.BegBal = curBal - correction.EndBal = onChain - correction.CorrectingReason = reason - correction.AmountIn = *base.ZeroWei - correction.AmountOut = *base.ZeroWei - if correctionDiff.Cmp(base.ZeroWei) > 0 { - correction.AmountIn = correctionDiff - } else if correctionDiff.Cmp(base.ZeroWei) < 0 { - correction.AmountOut = *correctionDiff.Neg() - } - return correction -} - -// --------------------------------------------------------- -func (r *Reconciler) flushBlock(postings []LedgerEntry, modelChan chan<- types.Modeler) { - blockProcessedAssets := make(map[base.Address]bool) - assetLastSeen := make(map[base.Address]int) - for i, p := range postings { - key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - if !blockProcessedAssets[p.AssetAddress] { - if r.hasStartBlock && !r.ledgerAssets[p.AssetAddress] { - if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber-1); ok { - r.accountLedger[key] = onChain - } - r.ledgerAssets[p.AssetAddress] = true - } - if onChain, ok := r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber-1); ok { - curBal := r.accountLedger[key] - if !onChain.Equal(&curBal) { - correctingEntry := r.correctingEntry("mis", onChain, curBal, &p) - r.correctionCounter++ - correctingEntry.CorrectionId = r.correctionCounter - r.entryCounter++ - correctingEntry.StatementId = r.entryCounter - modelChan <- &correctingEntry - } - } - blockProcessedAssets[p.AssetAddress] = true - } - - p.BegBal = r.accountLedger[key] - r.accountLedger[key] = *p.EndBalCalc() - r.entryCounter++ - p.StatementId = r.entryCounter - postings[i] = p - assetLastSeen[p.AssetAddress] = i - modelChan <- &p - } - - var corrections []LedgerEntry - for _, idx := range assetLastSeen { - p := postings[idx] - key := assetHolderKey{Asset: p.AssetAddress, Holder: p.Holder} - curBal := r.accountLedger[key] - if !p.EndBal.Equal(&curBal) { - correctingEntry := r.correctingEntry("imb", p.EndBal, curBal, &p) - corrections = append(corrections, correctingEntry) - } - } - - sort.SliceStable(corrections, func(i, j int) bool { - if corrections[i].TransactionIndex != corrections[j].TransactionIndex { - return corrections[i].TransactionIndex < corrections[j].TransactionIndex - } - if corrections[i].LogIndex != corrections[j].LogIndex { - return corrections[i].LogIndex < corrections[j].LogIndex - } - return corrections[i].AssetAddress.Hex() < corrections[j].AssetAddress.Hex() - }) - - for _, correction := range corrections { - r.correctionCounter++ - correction.CorrectionId = r.correctionCounter - r.entryCounter++ - correction.StatementId = r.entryCounter - modelChan <- &correction - key := assetHolderKey{Asset: correction.AssetAddress, Holder: correction.Holder} - r.accountLedger[key] = correction.EndBal - } -} - -// --------------------------------------------------------- -func (r *Reconciler) processStream(modelChan chan<- types.Modeler) { - postingStream := make(chan LedgerEntry, 100) - go func() { - defer close(postingStream) - var prevBlock base.Blknum - for _, app := range r.apps { - bn := base.Blknum(app.BlockNumber) - if bn != prevBlock && prevBlock != 0 { - postingStream <- LedgerEntry{ - BlockNumber: prevBlock, - AssetAddress: base.EndOfBlockSentinel, - } - } - for p := range r.getPostingChannel(&app) { - postingStream <- p - } - prevBlock = bn - } - if prevBlock != 0 { - postingStream <- LedgerEntry{ - BlockNumber: prevBlock, - AssetAddress: base.EndOfBlockSentinel, - } - } - postingStream <- LedgerEntry{ - AssetAddress: base.EndOfStreamSentinel, - } - }() - - var postings []LedgerEntry - for posting := range postingStream { - switch posting.AssetAddress { - case base.EndOfBlockSentinel: - r.flushBlock(postings, modelChan) - postings = nil - case base.EndOfStreamSentinel: - if len(postings) > 0 { - r.flushBlock(postings, modelChan) - } - return - default: - postings = append(postings, posting) - } - } -} - -// --------------------------------------------------------- -func (r *Reconciler) initData() { - folder := os.Getenv("FOLDER") - if folder == "" { - folder = "tests" - } - // blockNumber,transactionIndex - appsFn := filepath.Join(folder, "apps.csv") - appsFile, _ := os.Open(appsFn) - defer appsFile.Close() - appsReader := csv.NewReader(appsFile) - appsReader.Comment = '#' - if appsRecords, err := appsReader.ReadAll(); err != nil { - fmt.Println("Problem with data file:", appsFn) - logger.Fatal(err) - } else if len(appsRecords) == 0 { - logger.Fatal("no transfers") - } else { - for _, record := range appsRecords[1:] { - if strings.HasPrefix(record[0], "#") { - continue - } - r.apps = append(r.apps, types.Appearance{ - BlockNumber: uint32(base.MustParseInt64(record[0])), - TransactionIndex: uint32(base.MustParseInt64(record[1])), - }) - } - } - - // blockNumber,assetAddress,accountedFor,endBal - balFn := filepath.Join(folder, "balances.csv") - balFile, _ := os.Open(balFn) - defer balFile.Close() - balReader := csv.NewReader(balFile) - balReader.Comment = '#' - if balRecords, err := balReader.ReadAll(); err != nil { - fmt.Println("Problem with data file:", balFn) - logger.Fatal(err) - } else if len(balRecords) == 0 { - logger.Fatal("no transfers") - } else { - for _, record := range balRecords[1:] { - if strings.HasPrefix(record[0], "#") { - continue - } - b := LedgerEntry{ - BlockNumber: base.Blknum(base.MustParseUint64(record[0])), - AssetAddress: base.HexToAddress(record[1]), - Holder: base.HexToAddress(record[2]), - EndBal: *base.NewWeiStr(record[3]), - } - - key := bnAssetHolderKey{BlockNumber: b.BlockNumber, Asset: b.AssetAddress, Holder: b.Holder} - r.conn.balanceMap[key] = b.EndBal - } - } - - // blockNumber,transactionIndex,logIndex,assetAddress,accountedFor,amountNet,endBal - transfersFn := filepath.Join(folder, "transfers.csv") - transfersFile, _ := os.Open(transfersFn) - defer transfersFile.Close() - transfersReader := csv.NewReader(transfersFile) - transfersReader.Comment = '#' - if transfersRecords, err := transfersReader.ReadAll(); err != nil { - fmt.Println("Problem with data file:", transfersFn) - logger.Fatal(err) - } else if len(transfersRecords) == 0 { - logger.Fatal("no transfers") - } else { - for _, record := range transfersRecords[1:] { - if strings.HasPrefix(record[0], "#") { - continue - } - amt := base.NewWeiStr(record[5]) - p := LedgerEntry{ - BlockNumber: base.Blknum(base.MustParseUint64(record[0])), - TransactionIndex: base.Txnum(base.MustParseUint64(record[1])), - LogIndex: base.Lognum(base.MustParseUint64(record[2])), - AssetAddress: base.HexToAddress(record[3]), - AmountIn: *base.ZeroWei, - AmountOut: *base.ZeroWei, - Holder: base.HexToAddress(record[4]), - } - if amt.Cmp(base.ZeroWei) > 0 { - p.AmountIn = *amt - } else if amt.Cmp(base.ZeroWei) < 0 { - p.AmountOut = *amt.Neg() - } - p.EndBal, _ = r.conn.GetBalanceAtToken(p.AssetAddress, p.Holder, p.BlockNumber) - - key := blockTxKey{BlockNumber: p.BlockNumber, TransactionIndex: p.TransactionIndex} - r.transfers[key] = append(r.transfers[key], p) - } - if firstBlock := os.Getenv("FIRST_BLOCK"); firstBlock != "" { - r.hasStartBlock = true - } - } -} - -// --------------------------------------------------------- -type blockTxKey struct { - BlockNumber base.Blknum - TransactionIndex base.Txnum -} - -// --------------------------------------------------------- -type assetHolderKey struct { - Asset base.Address - Holder base.Address -} - -// --------------------------------------------------------- -type bnAssetHolderKey struct { - BlockNumber base.Blknum - Asset base.Address - Holder base.Address -} - -// --------------------------------------------------------- func main() { if len(os.Args) < 2 { os.Args = append(os.Args, "0xf") } - r := NewReconciler(base.HexToAddress(os.Args[1])) + r := ledger3.NewReconciler3(base.HexToAddress(os.Args[1])) modelChan := make(chan types.Modeler, 1000) go func() { defer close(modelChan) - r.processStream(modelChan) + r.ProcessStream(modelChan) }() extraOpts := map[string]any{ From 03f696b1bb2b162f5d0d8487de20fca3c1bb8fb9 Mon Sep 17 00:00:00 2001 From: Thomas Jay Rush Date: Tue, 4 Mar 2025 00:24:24 -0500 Subject: [PATCH 36/36] Cleanings --- accounting/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accounting/main.go b/accounting/main.go index 5cce33a..d198127 100644 --- a/accounting/main.go +++ b/accounting/main.go @@ -13,7 +13,7 @@ func main() { os.Args = append(os.Args, "0xf") } - r := ledger3.NewReconciler3(base.HexToAddress(os.Args[1])) + r := ledger3.NewReconciler3("mainnet", base.HexToAddress(os.Args[1])) modelChan := make(chan types.Modeler, 1000) go func() {