From aae93a89222c1018852db1f1722f668def3c9adf Mon Sep 17 00:00:00 2001
From: Tyler <48813565+technicallyty@users.noreply.github.com>
Date: Wed, 8 Nov 2023 11:42:48 -0800
Subject: [PATCH 1/4] chore: update sign deps for nakama & cardinal (#406)
---
cardinal/go.mod | 2 +-
cardinal/go.sum | 4 ++--
go.work.sum | 1 +
relay/nakama/go.mod | 2 +-
relay/nakama/go.sum | 4 ++--
5 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/cardinal/go.mod b/cardinal/go.mod
index 66f25e8ee..4fe492bd7 100644
--- a/cardinal/go.mod
+++ b/cardinal/go.mod
@@ -33,7 +33,7 @@ require (
gotest.tools/v3 v3.5.1
pkg.world.dev/world-engine/chain v0.1.12-alpha
pkg.world.dev/world-engine/rift v0.0.5
- pkg.world.dev/world-engine/sign v0.1.10-alpha
+ pkg.world.dev/world-engine/sign v0.1.11-alpha
)
require (
diff --git a/cardinal/go.sum b/cardinal/go.sum
index 6a1bc1865..67b43919b 100644
--- a/cardinal/go.sum
+++ b/cardinal/go.sum
@@ -971,7 +971,7 @@ pkg.world.dev/world-engine/chain v0.1.12-alpha h1:5iHYDJoJKYJ6kC/gxhC+UIOqeQMq+z
pkg.world.dev/world-engine/chain v0.1.12-alpha/go.mod h1:1b70VXbEdiX10x/SShSAm65Rg2VF7TkluAMFPVEaSXs=
pkg.world.dev/world-engine/rift v0.0.5 h1:nRoIIyilio+i5jqflroKcwlLDUa7+8FpWkLI3+za/Cg=
pkg.world.dev/world-engine/rift v0.0.5/go.mod h1:SAo0qDI8C2yFC2WOD3t35H+h9j+RXdap9hDBzw21CWs=
-pkg.world.dev/world-engine/sign v0.1.10-alpha h1:UEkMfsPrhtncVI9n5UWsUSwE0sVwGLZ7b1Go6Zk9Shw=
-pkg.world.dev/world-engine/sign v0.1.10-alpha/go.mod h1:MOwYe8JeB8qAXZnp+jlJnAjYgfzru/S6pllQCrNoMZw=
+pkg.world.dev/world-engine/sign v0.1.11-alpha h1:DrjbCE12xNQ/ayLrmG/PHBDWLD9+/m6QjevmzrpOzvM=
+pkg.world.dev/world-engine/sign v0.1.11-alpha/go.mod h1:MOwYe8JeB8qAXZnp+jlJnAjYgfzru/S6pllQCrNoMZw=
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/go.work.sum b/go.work.sum
index 999df695e..73369cbdf 100644
--- a/go.work.sum
+++ b/go.work.sum
@@ -2719,6 +2719,7 @@ pkg.berachain.dev/polaris/eth v0.0.0-20230827184022-e3cec7a2c178/go.mod h1:W6VZU
pkg.berachain.dev/polaris/lib v0.0.0-20230717165123-80a30c3435c3 h1:Lgswicb60tdTLZak6ud5DxelnTnO9DlJfDqxMHFKIyk=
pkg.berachain.dev/polaris/lib v0.0.0-20230717165123-80a30c3435c3/go.mod h1:JZtndZdLnGavd5b+IiHYew5nMAOoL968nE2cTxk+dEI=
pkg.world.dev/world-engine/sign v0.1.5-alpha/go.mod h1:JcKXhdeYvCPRAgsCUSFEDcAJgf67VgMWWrA2Y2VZJSg=
+pkg.world.dev/world-engine/sign v0.1.11-alpha/go.mod h1:MOwYe8JeB8qAXZnp+jlJnAjYgfzru/S6pllQCrNoMZw=
rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=
rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY=
diff --git a/relay/nakama/go.mod b/relay/nakama/go.mod
index 213124c59..68e63e152 100644
--- a/relay/nakama/go.mod
+++ b/relay/nakama/go.mod
@@ -6,7 +6,7 @@ require (
github.com/ethereum/go-ethereum v1.12.0
github.com/gorilla/websocket v1.5.0
github.com/heroiclabs/nakama-common v1.27.0
- pkg.world.dev/world-engine/sign v0.1.10-alpha
+ pkg.world.dev/world-engine/sign v0.1.11-alpha
)
require (
diff --git a/relay/nakama/go.sum b/relay/nakama/go.sum
index 1e1711256..211a1fa8a 100644
--- a/relay/nakama/go.sum
+++ b/relay/nakama/go.sum
@@ -32,5 +32,5 @@ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
-pkg.world.dev/world-engine/sign v0.1.10-alpha h1:UEkMfsPrhtncVI9n5UWsUSwE0sVwGLZ7b1Go6Zk9Shw=
-pkg.world.dev/world-engine/sign v0.1.10-alpha/go.mod h1:MOwYe8JeB8qAXZnp+jlJnAjYgfzru/S6pllQCrNoMZw=
+pkg.world.dev/world-engine/sign v0.1.11-alpha h1:DrjbCE12xNQ/ayLrmG/PHBDWLD9+/m6QjevmzrpOzvM=
+pkg.world.dev/world-engine/sign v0.1.11-alpha/go.mod h1:MOwYe8JeB8qAXZnp+jlJnAjYgfzru/S6pllQCrNoMZw=
From f681fd0c6177dbfffc793079fee3951bab860a6f Mon Sep 17 00:00:00 2001
From: Tyler <48813565+technicallyty@users.noreply.github.com>
Date: Wed, 8 Nov 2023 12:34:19 -0800
Subject: [PATCH 2/4] refactor(cardinal)!: rename Transaction/TransactionType
to Message/MessageType (#396)
---
cardinal/ecs/chain_recover_test.go | 17 +-
cardinal/ecs/cql/cql.go | 2 +-
cardinal/ecs/ecb/tick.go | 26 +-
cardinal/ecs/ecb/tick_test.go | 26 +-
cardinal/ecs/log/log_test.go | 4 +-
cardinal/ecs/message.go | 242 +++++
cardinal/ecs/message/message.go | 21 +
.../message_test.go} | 194 ++--
.../transaction.go => message/queue.go} | 48 +-
.../{transaction_test.go => message_test.go} | 24 +-
cardinal/ecs/persona.go | 36 +-
cardinal/ecs/persona_test.go | 28 +-
cardinal/ecs/query_test.go | 2 +-
cardinal/ecs/receipt/receipt.go | 26 +-
cardinal/ecs/receipt/receipt_test.go | 6 +-
cardinal/ecs/state_test.go | 6 +-
cardinal/ecs/store/iface.go | 6 +-
cardinal/ecs/tick_test.go | 12 +-
cardinal/ecs/transaction.go | 237 -----
cardinal/ecs/world.go | 141 ++-
cardinal/ecs/world_context.go | 10 +-
cardinal/ecs/world_test.go | 12 +-
cardinal/events/events_test.go | 4 +-
cardinal/evm/server.go | 8 +-
cardinal/evm/server_test.go | 20 +-
...pe_test.go => example_messagetype_test.go} | 18 +-
cardinal/message.go | 105 ++
.../{transaction_test.go => message_test.go} | 18 +-
cardinal/server/persona.go | 15 +-
cardinal/server/server.go | 8 +-
cardinal/server/server_test.go | 92 +-
cardinal/server/tx.go | 16 +-
cardinal/server/utils.go | 4 +-
cardinal/testing.go | 4 +-
cardinal/testutils/test_utils.go | 4 +-
cardinal/transaction.go | 105 --
cardinal/util.go | 6 +-
cardinal/world.go | 18 +-
chain/proto/proto_generate.sh | 1 -
docs/pages/Cardinal/API-Reference/Events.mdx | 4 +-
.../{Transactions.mdx => Messages.mdx} | 112 +-
docs/pages/Cardinal/API-Reference/Systems.mdx | 30 +-
docs/pages/Cardinal/API-Reference/World.mdx | 24 +-
docs/pages/Cardinal/API-Reference/_meta.json | 2 +-
.../Cardinal/API-Reference/evm-support.mdx | 4 +-
go.work.sum | 36 +
internal/e2e/e2e_test.go | 6 +-
internal/e2e/tester/cardinal/go.mod | 10 +-
internal/e2e/tester/cardinal/go.sum | 996 +-----------------
internal/e2e/tester/cardinal/main.go | 4 +-
.../e2e/tester/cardinal/{tx => msg}/join.go | 4 +-
.../e2e/tester/cardinal/{tx => msg}/move.go | 4 +-
internal/e2e/tester/cardinal/sys/join.go | 18 +-
internal/e2e/tester/cardinal/sys/move.go | 18 +-
54 files changed, 959 insertions(+), 1885 deletions(-)
create mode 100644 cardinal/ecs/message.go
create mode 100644 cardinal/ecs/message/message.go
rename cardinal/ecs/{transaction/transaction_test.go => message/message_test.go} (72%)
rename cardinal/ecs/{transaction/transaction.go => message/queue.go} (65%)
rename cardinal/ecs/{transaction_test.go => message_test.go} (64%)
delete mode 100644 cardinal/ecs/transaction.go
rename cardinal/{example_transactiontype_test.go => example_messagetype_test.go} (60%)
create mode 100644 cardinal/message.go
rename cardinal/{transaction_test.go => message_test.go} (84%)
delete mode 100644 cardinal/transaction.go
rename docs/pages/Cardinal/API-Reference/{Transactions.mdx => Messages.mdx} (51%)
rename internal/e2e/tester/cardinal/{tx => msg}/join.go (51%)
rename internal/e2e/tester/cardinal/{tx => msg}/move.go (61%)
diff --git a/cardinal/ecs/chain_recover_test.go b/cardinal/ecs/chain_recover_test.go
index 254c21c14..842c64318 100644
--- a/cardinal/ecs/chain_recover_test.go
+++ b/cardinal/ecs/chain_recover_test.go
@@ -3,6 +3,7 @@ package ecs_test
import (
"context"
"encoding/binary"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"sort"
"testing"
@@ -77,12 +78,12 @@ func (d *DummyAdapter) QueryTransactions(_ context.Context, request *types.Query
}, nil
}
-type SendEnergyTransaction struct {
+type SendEnergyMsg struct {
To, From string
Amount uint64
}
-type SendEnergyTransactionResponse struct{}
+type SendEnergyResult struct{}
// TestWorld_RecoverFromChain tests that after submitting transactions to the chain, they can be queried, re-ran,
// and end up with the same game state as before.
@@ -91,8 +92,8 @@ func TestWorld_RecoverFromChain(t *testing.T) {
ctx := context.Background()
adapter := &DummyAdapter{txs: make(map[uint64][]*types.Transaction, 0)}
w := ecs.NewTestWorld(t, ecs.WithAdapter(adapter))
- sendEnergyTx := ecs.NewTransactionType[SendEnergyTransaction, SendEnergyTransactionResponse]("send_energy")
- err := w.RegisterTransactions(sendEnergyTx)
+ sendEnergyTx := ecs.NewMessageType[SendEnergyMsg, SendEnergyResult]("send_energy")
+ err := w.RegisterMessages(sendEnergyTx)
assert.NilError(t, err)
sysRuns := uint64(0)
@@ -125,14 +126,13 @@ func TestWorld_RecoverFromChain(t *testing.T) {
assert.Equal(t, len(payloads), timesSendEnergyRan)
}
-func generateRandomTransaction(t *testing.T, ns string, tx *ecs.TransactionType[SendEnergyTransaction,
- SendEnergyTransactionResponse]) *sign.Transaction {
- tx1 := SendEnergyTransaction{
+func generateRandomTransaction(t *testing.T, ns string, msg message.Message) *sign.Transaction {
+ tx1 := SendEnergyMsg{
To: rand.Str(5),
From: rand.Str(4),
Amount: rand.Uint64(),
}
- bz, err := tx.Encode(tx1)
+ bz, err := msg.Encode(tx1)
assert.NilError(t, err)
return &sign.Transaction{
PersonaTag: rand.Str(5),
@@ -144,7 +144,6 @@ func generateRandomTransaction(t *testing.T, ns string, tx *ecs.TransactionType[
}
func TestWorld_RecoverShouldErrorIfTickExists(t *testing.T) {
- // setup world and transactions
ctx := context.Background()
adapter := &DummyAdapter{}
w := ecs.NewTestWorld(t, ecs.WithAdapter(adapter))
diff --git a/cardinal/ecs/cql/cql.go b/cardinal/ecs/cql/cql.go
index 84709ad02..ff7c8b864 100644
--- a/cardinal/ecs/cql/cql.go
+++ b/cardinal/ecs/cql/cql.go
@@ -139,7 +139,7 @@ func (t *cqlTerm) String() string {
var internalCQLParser = participle.MustBuild[cqlTerm]()
-// TODO: Value is sum type is represented as a product type. There is a case where multiple properties are filled out.
+// TODO: Msg is sum type is represented as a product type. There is a case where multiple properties are filled out.
// Only one property may not be nil, The parser should prevent this from happening but for safety this should eventually
// be checked.
func valueToComponentFilter(value *cqlValue, stringToComponent func(string) (metadata.ComponentMetadata, error)) (
diff --git a/cardinal/ecs/ecb/tick.go b/cardinal/ecs/ecb/tick.go
index dcb0b0e93..6289a034f 100644
--- a/cardinal/ecs/ecb/tick.go
+++ b/cardinal/ecs/ecb/tick.go
@@ -3,11 +3,11 @@ package ecb
import (
"context"
"errors"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"github.com/redis/go-redis/v9"
"pkg.world.dev/world-engine/cardinal/ecs/codec"
"pkg.world.dev/world-engine/cardinal/ecs/store"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
"pkg.world.dev/world-engine/sign"
)
@@ -38,7 +38,7 @@ func (m *Manager) GetTickNumbers() (start, end uint64, err error) {
// StartNextTick saves the given transactions to the DB and sets the tick trackers to indicate we are in the middle
// of a tick. While transactions are saved to the DB, no state changes take place at this time.
-func (m *Manager) StartNextTick(txs []transaction.ITransaction, queue *transaction.TxQueue) error {
+func (m *Manager) StartNextTick(txs []message.Message, queue *message.TxQueue) error {
ctx := context.Background()
pipe := m.client.TxPipeline()
if err := addPendingTransactionToPipe(ctx, pipe, txs, queue); err != nil {
@@ -70,7 +70,7 @@ func (m *Manager) FinalizeTick() error {
// Recover fetches the pending transactions for an incomplete tick. This should only be called if GetTickNumbers
// indicates that the previous tick was started, but never completed.
-func (m *Manager) Recover(txs []transaction.ITransaction) (*transaction.TxQueue, error) {
+func (m *Manager) Recover(txs []message.Message) (*message.TxQueue, error) {
ctx := context.Background()
key := redisPendingTransactionKey()
bz, err := m.client.Get(ctx, key).Bytes()
@@ -81,12 +81,12 @@ func (m *Manager) Recover(txs []transaction.ITransaction) (*transaction.TxQueue,
if err != nil {
return nil, err
}
- idToTx := map[transaction.TypeID]transaction.ITransaction{}
+ idToTx := map[message.TypeID]message.Message{}
for _, tx := range txs {
idToTx[tx.ID()] = tx
}
- txQueue := transaction.NewTxQueue()
+ txQueue := message.NewTxQueue()
for _, p := range pending {
tx := idToTx[p.TypeID]
var txData any
@@ -94,32 +94,32 @@ func (m *Manager) Recover(txs []transaction.ITransaction) (*transaction.TxQueue,
if err != nil {
return nil, err
}
- txQueue.AddTransaction(tx.ID(), txData, p.Sig)
+ txQueue.AddTransaction(tx.ID(), txData, p.Tx)
}
return txQueue, nil
}
type pendingTransaction struct {
- TypeID transaction.TypeID
- TxHash transaction.TxHash
+ TypeID message.TypeID
+ TxHash message.TxHash
Data []byte
- Sig *sign.Transaction
+ Tx *sign.Transaction
}
-func addPendingTransactionToPipe(ctx context.Context, pipe redis.Pipeliner, txs []transaction.ITransaction,
- queue *transaction.TxQueue) error {
+func addPendingTransactionToPipe(ctx context.Context, pipe redis.Pipeliner, txs []message.Message,
+ queue *message.TxQueue) error {
var pending []pendingTransaction
for _, tx := range txs {
currList := queue.ForID(tx.ID())
for _, txData := range currList {
- buf, err := tx.Encode(txData.Value)
+ buf, err := tx.Encode(txData.Msg)
if err != nil {
return err
}
currItem := pendingTransaction{
TypeID: tx.ID(),
TxHash: txData.TxHash,
- Sig: txData.Sig,
+ Tx: txData.Tx,
Data: buf,
}
pending = append(pending, currItem)
diff --git a/cardinal/ecs/ecb/tick_test.go b/cardinal/ecs/ecb/tick_test.go
index 3effca3c4..d0a08ea25 100644
--- a/cardinal/ecs/ecb/tick_test.go
+++ b/cardinal/ecs/ecb/tick_test.go
@@ -1,44 +1,44 @@
package ecb_test
import (
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"testing"
"gotest.tools/v3/assert"
"pkg.world.dev/world-engine/cardinal/ecs"
"pkg.world.dev/world-engine/cardinal/ecs/internal/testutil"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
)
func TestCanSaveAndRecoverTransactions(t *testing.T) {
- type TxIn struct {
+ type MsgIn struct {
Value int
}
- type TxOut struct {
+ type MsgOut struct {
Value int
}
- txAlpha := ecs.NewTransactionType[TxIn, TxOut]("alpha")
- txBeta := ecs.NewTransactionType[TxIn, TxOut]("beta")
- assert.NilError(t, txAlpha.SetID(16))
- assert.NilError(t, txBeta.SetID(32))
- txs := []transaction.ITransaction{txAlpha, txBeta}
+ msgAlpha := ecs.NewMessageType[MsgIn, MsgOut]("alpha")
+ msgBeta := ecs.NewMessageType[MsgIn, MsgOut]("beta")
+ assert.NilError(t, msgAlpha.SetID(16))
+ assert.NilError(t, msgBeta.SetID(32))
+ msgs := []message.Message{msgAlpha, msgBeta}
manager, client := newCmdBufferAndRedisClientForTest(t, nil)
- originalQueue := transaction.NewTxQueue()
+ originalQueue := message.NewTxQueue()
sig := testutil.UniqueSignature(t)
- _ = originalQueue.AddTransaction(txAlpha.ID(), TxIn{100}, sig)
+ _ = originalQueue.AddTransaction(msgAlpha.ID(), MsgIn{100}, sig)
- assert.NilError(t, manager.StartNextTick(txs, originalQueue))
+ assert.NilError(t, manager.StartNextTick(msgs, originalQueue))
// Pretend some problem was encountered here. Make sure we can recover the transactions from redis.
manager, _ = newCmdBufferAndRedisClientForTest(t, client)
- gotQueue, err := manager.Recover(txs)
+ gotQueue, err := manager.Recover(msgs)
assert.NilError(t, err)
assert.Equal(t, gotQueue.GetAmountOfTxs(), originalQueue.GetAmountOfTxs())
// Make sure we can finalize the tick
- assert.NilError(t, manager.StartNextTick(txs, gotQueue))
+ assert.NilError(t, manager.StartNextTick(msgs, gotQueue))
assert.NilError(t, manager.FinalizeTick())
}
diff --git a/cardinal/ecs/log/log_test.go b/cardinal/ecs/log/log_test.go
index be5383acf..9f5bd7c31 100644
--- a/cardinal/ecs/log/log_test.go
+++ b/cardinal/ecs/log/log_test.go
@@ -70,8 +70,8 @@ func TestWorldLogger(t *testing.T) {
&bufLogger,
}
w.InjectLogger(&cardinalLogger)
- alphaTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("alpha")
- assert.NilError(t, w.RegisterTransactions(alphaTx))
+ alphaTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("alpha")
+ assert.NilError(t, w.RegisterMessages(alphaTx))
assert.NilError(t, ecs.RegisterComponent[EnergyComp](w))
cardinalLogger.LogWorld(w, zerolog.InfoLevel)
jsonWorldInfoString := `{
diff --git a/cardinal/ecs/message.go b/cardinal/ecs/message.go
new file mode 100644
index 000000000..897f44eaa
--- /dev/null
+++ b/cardinal/ecs/message.go
@@ -0,0 +1,242 @@
+package ecs
+
+import (
+ "errors"
+ "fmt"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
+ "reflect"
+
+ ethereumAbi "github.com/ethereum/go-ethereum/accounts/abi"
+ "pkg.world.dev/world-engine/cardinal/ecs/abi"
+ "pkg.world.dev/world-engine/cardinal/ecs/codec"
+ "pkg.world.dev/world-engine/sign"
+)
+
+var (
+ ErrEVMTypeNotSet = errors.New("EVM type is not set")
+)
+
+var _ message.Message = &MessageType[struct{}, struct{}]{}
+
+// MessageType manages a user defined state transition message struct.
+type MessageType[In, Out any] struct {
+ id message.TypeID
+ isIDSet bool
+ name string
+ inEVMType *ethereumAbi.Type
+ outEVMType *ethereumAbi.Type
+}
+
+func WithMsgEVMSupport[In, Out any]() func(messageType *MessageType[In, Out]) {
+ return func(msg *MessageType[In, Out]) {
+ var in In
+ var err error
+ msg.inEVMType, err = abi.GenerateABIType(in)
+ if err != nil {
+ panic(err)
+ }
+
+ var out Out
+ msg.outEVMType, err = abi.GenerateABIType(out)
+ if err != nil {
+ panic(err)
+ }
+ }
+}
+
+// NewMessageType creates a new message type. It accepts two generic type parameters: the first for the message input,
+// which defines the data needed to make a state transition, and the second for the message output, commonly used
+// for the results of a state transition.
+func NewMessageType[In, Out any](
+ name string,
+ opts ...func() func(*MessageType[In, Out]),
+) *MessageType[In, Out] {
+ if name == "" {
+ panic("cannot create message without name")
+ }
+ var in In
+ var out Out
+ inType := reflect.TypeOf(in)
+ inKind := inType.Kind()
+ inValid := false
+ if (inKind == reflect.Pointer && inType.Elem().Kind() == reflect.Struct) || inKind == reflect.Struct {
+ inValid = true
+ }
+ outType := reflect.TypeOf(out)
+ outKind := inType.Kind()
+ outValid := false
+ if (outKind == reflect.Pointer && outType.Elem().Kind() == reflect.Struct) || outKind == reflect.Struct {
+ outValid = true
+ }
+
+ if !outValid || !inValid {
+ panic(fmt.Sprintf("Invalid MessageType: %s: The In and Out must be both structs", name))
+ }
+
+ msg := &MessageType[In, Out]{
+ name: name,
+ }
+ for _, opt := range opts {
+ opt()(msg)
+ }
+ return msg
+}
+
+func (t *MessageType[In, Out]) Name() string {
+ return t.name
+}
+
+func (t *MessageType[In, Out]) IsEVMCompatible() bool {
+ return t.inEVMType != nil && t.outEVMType != nil
+}
+
+func (t *MessageType[In, Out]) ID() message.TypeID {
+ if !t.isIDSet {
+ panic(fmt.Sprintf("id on msg %q is not set", t.name))
+ }
+ return t.id
+}
+
+var emptyTx = &sign.Transaction{}
+
+// AddToQueue adds a message with the given data to the world. The message will be executed
+// at the next game tick. An optional sign.Transaction can be associated with this message.
+func (t *MessageType[In, Out]) AddToQueue(world *World, data In, sigs ...*sign.Transaction) message.TxHash {
+ sig := emptyTx
+ if len(sigs) > 0 {
+ sig = sigs[0]
+ }
+ _, id := world.AddTransaction(t.ID(), data, sig)
+ return id
+}
+
+func (t *MessageType[In, Out]) SetID(id message.TypeID) error {
+ if t.isIDSet {
+ // In games implemented with Cardinal, messages will only be initialized one time (on startup).
+ // In tests, it's often useful to use the same message in multiple worlds. This check will allow for the
+ // re-initialization of messages, as long as the ID doesn't change.
+ if id == t.id {
+ return nil
+ }
+ return fmt.Errorf("id on message %q is already set to %d and cannot change to %d", t.name, t.id, id)
+ }
+ t.id = id
+ t.isIDSet = true
+ return nil
+}
+
+type TxData[In any] struct {
+ Hash message.TxHash
+ Msg In
+ Tx *sign.Transaction
+}
+
+func (t *MessageType[In, Out]) AddError(wCtx WorldContext, hash message.TxHash, err error) {
+ wCtx.GetWorld().AddMessageError(hash, err)
+}
+
+func (t *MessageType[In, Out]) SetResult(wCtx WorldContext, hash message.TxHash, result Out) {
+ wCtx.GetWorld().SetMessageResult(hash, result)
+}
+
+func (t *MessageType[In, Out]) GetReceipt(wCtx WorldContext, hash message.TxHash) (
+ v Out, errs []error, ok bool,
+) {
+ world := wCtx.GetWorld()
+ iface, errs, ok := world.GetTransactionReceipt(hash)
+ if !ok {
+ return v, nil, false
+ }
+ // if iface is nil, maybe the result has never been set. The errors may still be valid.
+ if iface == nil {
+ return v, errs, true
+ }
+ value, ok := iface.(Out)
+ if !ok {
+ return v, nil, false
+ }
+ return value, errs, true
+}
+
+func (t *MessageType[In, Out]) ForEach(wCtx WorldContext, fn func(TxData[In]) (Out, error)) {
+ for _, txData := range t.In(wCtx) {
+ if result, err := fn(txData); err != nil {
+ wCtx.Logger().Err(err).Msgf("tx %s from %s encountered an error with message=%+v",
+ txData.Hash,
+ txData.Tx.PersonaTag,
+ txData.Msg,
+ )
+ t.AddError(wCtx, txData.Hash, err)
+ } else {
+ t.SetResult(wCtx, txData.Hash, result)
+ }
+ }
+}
+
+// In extracts all the TxData in the tx queue that match this MessageType's ID.
+func (t *MessageType[In, Out]) In(wCtx WorldContext) []TxData[In] {
+ tq := wCtx.GetTxQueue()
+ var txs []TxData[In]
+ for _, txData := range tq.ForID(t.ID()) {
+ if val, ok := txData.Msg.(In); ok {
+ txs = append(txs, TxData[In]{
+ Hash: txData.TxHash,
+ Msg: val,
+ Tx: txData.Tx,
+ })
+ }
+ }
+ return txs
+}
+
+func (t *MessageType[In, Out]) Encode(a any) ([]byte, error) {
+ return codec.Encode(a)
+}
+
+func (t *MessageType[In, Out]) Decode(bytes []byte) (any, error) {
+ return codec.Decode[In](bytes)
+}
+
+// ABIEncode encodes the input to the message's matching evm type. If the input is not either of the message's
+// evm types, an error is returned.
+func (t *MessageType[In, Out]) ABIEncode(v any) ([]byte, error) {
+ if t.inEVMType == nil || t.outEVMType == nil {
+ return nil, ErrEVMTypeNotSet
+ }
+
+ var args ethereumAbi.Arguments
+ var input any
+ //nolint:gocritic // its fine.
+ switch in := v.(type) {
+ case Out:
+ input = in
+ args = ethereumAbi.Arguments{{Type: *t.outEVMType}}
+ case In:
+ input = in
+ args = ethereumAbi.Arguments{{Type: *t.inEVMType}}
+ default:
+ return nil, fmt.Errorf("expected input to be of type %T or %T, got %T", new(In), new(Out), v)
+ }
+
+ return args.Pack(input)
+}
+
+// DecodeEVMBytes decodes abi encoded solidity structs into the message's "In" type.
+func (t *MessageType[In, Out]) DecodeEVMBytes(bz []byte) (any, error) {
+ if t.inEVMType == nil {
+ return nil, ErrEVMTypeNotSet
+ }
+ args := ethereumAbi.Arguments{{Type: *t.inEVMType}}
+ unpacked, err := args.Unpack(bz)
+ if err != nil {
+ return nil, err
+ }
+ if len(unpacked) < 1 {
+ return nil, fmt.Errorf("error decoding EVM bytes: no values could be unpacked into the abi type")
+ }
+ input, err := abi.SerdeInto[In](unpacked[0])
+ if err != nil {
+ return nil, err
+ }
+ return input, nil
+}
diff --git a/cardinal/ecs/message/message.go b/cardinal/ecs/message/message.go
new file mode 100644
index 000000000..9186c928e
--- /dev/null
+++ b/cardinal/ecs/message/message.go
@@ -0,0 +1,21 @@
+package message
+
+type TxHash string
+
+// TypeID represents a message's ID. ID's are assigned to messages when they are registered in a World object.
+type TypeID int
+
+type Message interface {
+ SetID(TypeID) error
+ Name() string
+ ID() TypeID
+ Encode(any) ([]byte, error)
+ Decode([]byte) (any, error)
+ // DecodeEVMBytes decodes ABI encoded bytes into the message's input type.
+ DecodeEVMBytes([]byte) (any, error)
+ // ABIEncode encodes the given type in ABI encoding, given that the input is the message type's input or output
+ // type.
+ ABIEncode(any) ([]byte, error)
+ // IsEVMCompatible reports if this message can be sent from the EVM.
+ IsEVMCompatible() bool
+}
diff --git a/cardinal/ecs/transaction/transaction_test.go b/cardinal/ecs/message/message_test.go
similarity index 72%
rename from cardinal/ecs/transaction/transaction_test.go
rename to cardinal/ecs/message/message_test.go
index 332e9570e..8a87ddb43 100644
--- a/cardinal/ecs/transaction/transaction_test.go
+++ b/cardinal/ecs/message/message_test.go
@@ -1,13 +1,13 @@
-package transaction_test
+package message_test
import (
"context"
"errors"
"github.com/stretchr/testify/require"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"testing"
"time"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
"pkg.world.dev/world-engine/sign"
"gotest.tools/v3/assert"
@@ -25,12 +25,12 @@ func (ScoreComponent) Name() string {
return "score"
}
-type ModifyScoreTx struct {
+type ModifyScoreMsg struct {
PlayerID entity.ID
Amount int
}
-type EmptyTxResult struct{}
+type EmptyMsgResult struct{}
func TestReadTypeNotStructs(t *testing.T) {
defer func() {
@@ -44,9 +44,9 @@ func TestReadTypeNotStructs(t *testing.T) {
assert.Assert(t, panicValue == nil)
}()
- ecs.NewTransactionType[*ModifyScoreTx, *EmptyTxResult]("modify_score2")
+ ecs.NewMessageType[*ModifyScoreMsg, *EmptyMsgResult]("modify_score2")
}()
- ecs.NewTransactionType[string, string]("modify_score1")
+ ecs.NewMessageType[string, string]("modify_score1")
}
func TestCanQueueTransactions(t *testing.T) {
@@ -54,8 +54,8 @@ func TestCanQueueTransactions(t *testing.T) {
// Create an entity with a score component
assert.NilError(t, ecs.RegisterComponent[ScoreComponent](world))
- modifyScoreTx := ecs.NewTransactionType[*ModifyScoreTx, *EmptyTxResult]("modify_score")
- assert.NilError(t, world.RegisterTransactions(modifyScoreTx))
+ modifyScoreMsg := ecs.NewMessageType[*ModifyScoreMsg, *EmptyMsgResult]("modify_score")
+ assert.NilError(t, world.RegisterMessages(modifyScoreMsg))
wCtx := ecs.NewWorldContext(world)
id, err := component.Create(wCtx, ScoreComponent{})
@@ -63,9 +63,9 @@ func TestCanQueueTransactions(t *testing.T) {
// Set up a system that allows for the modification of a player's score
world.AddSystem(func(wCtx ecs.WorldContext) error {
- modifyScore := modifyScoreTx.In(wCtx)
+ modifyScore := modifyScoreMsg.In(wCtx)
for _, txData := range modifyScore {
- ms := txData.Value
+ ms := txData.Msg
err = component.UpdateComponent[ScoreComponent](wCtx, ms.PlayerID, func(s *ScoreComponent) *ScoreComponent {
s.Score += ms.Amount
return s
@@ -78,7 +78,7 @@ func TestCanQueueTransactions(t *testing.T) {
})
assert.NilError(t, world.LoadGameState())
- modifyScoreTx.AddToQueue(world, &ModifyScoreTx{id, 100})
+ modifyScoreMsg.AddToQueue(world, &ModifyScoreMsg{id, 100})
assert.NilError(t, component.SetComponent[ScoreComponent](wCtx, id, &ScoreComponent{}))
@@ -95,7 +95,7 @@ func TestCanQueueTransactions(t *testing.T) {
assert.NilError(t, err)
assert.Equal(t, 100, s.Score)
- // Tick again, but no new modifyScoreTx was added to the queue
+ // Tick again, but no new modifyScoreMsg was added to the queue
assert.NilError(t, world.Tick(context.Background()))
// Verify the score hasn't changed
@@ -141,13 +141,13 @@ func TestTransactionAreAppliedToSomeEntities(t *testing.T) {
world := ecs.NewTestWorld(t)
assert.NilError(t, ecs.RegisterComponent[ScoreComponent](world))
- modifyScoreTx := ecs.NewTransactionType[*ModifyScoreTx, *EmptyTxResult]("modify_score")
- assert.NilError(t, world.RegisterTransactions(modifyScoreTx))
+ modifyScoreMsg := ecs.NewMessageType[*ModifyScoreMsg, *EmptyMsgResult]("modify_score")
+ assert.NilError(t, world.RegisterMessages(modifyScoreMsg))
world.AddSystem(func(wCtx ecs.WorldContext) error {
- modifyScores := modifyScoreTx.In(wCtx)
+ modifyScores := modifyScoreMsg.In(wCtx)
for _, msData := range modifyScores {
- ms := msData.Value
+ ms := msData.Msg
err := component.UpdateComponent[ScoreComponent](wCtx, ms.PlayerID, func(s *ScoreComponent) *ScoreComponent {
s.Score += ms.Amount
return s
@@ -162,15 +162,15 @@ func TestTransactionAreAppliedToSomeEntities(t *testing.T) {
ids, err := component.CreateMany(wCtx, 100, ScoreComponent{})
assert.NilError(t, err)
// Entities at index 5, 10 and 50 will be updated with some values
- modifyScoreTx.AddToQueue(world, &ModifyScoreTx{
+ modifyScoreMsg.AddToQueue(world, &ModifyScoreMsg{
PlayerID: ids[5],
Amount: 105,
})
- modifyScoreTx.AddToQueue(world, &ModifyScoreTx{
+ modifyScoreMsg.AddToQueue(world, &ModifyScoreMsg{
PlayerID: ids[10],
Amount: 110,
})
- modifyScoreTx.AddToQueue(world, &ModifyScoreTx{
+ modifyScoreMsg.AddToQueue(world, &ModifyScoreMsg{
PlayerID: ids[50],
Amount: 150,
})
@@ -198,8 +198,8 @@ func TestTransactionAreAppliedToSomeEntities(t *testing.T) {
func TestAddToQueueDuringTickDoesNotTimeout(t *testing.T) {
world := ecs.NewTestWorld(t)
- modScore := ecs.NewTransactionType[*ModifyScoreTx, *EmptyTxResult]("modify_Score")
- assert.NilError(t, world.RegisterTransactions(modScore))
+ modScore := ecs.NewMessageType[*ModifyScoreMsg, *EmptyMsgResult]("modify_Score")
+ assert.NilError(t, world.RegisterMessages(modScore))
inSystemCh := make(chan struct{})
// This system will block forever. This will give us a never-ending game tick that we can use
@@ -210,7 +210,7 @@ func TestAddToQueueDuringTickDoesNotTimeout(t *testing.T) {
})
assert.NilError(t, world.LoadGameState())
- modScore.AddToQueue(world, &ModifyScoreTx{})
+ modScore.AddToQueue(world, &ModifyScoreMsg{})
// Start a tick in the background.
go func() {
@@ -223,7 +223,7 @@ func TestAddToQueueDuringTickDoesNotTimeout(t *testing.T) {
timeout := time.After(500 * time.Millisecond)
doneWithAddToQueue := make(chan struct{})
go func() {
- modScore.AddToQueue(world, &ModifyScoreTx{})
+ modScore.AddToQueue(world, &ModifyScoreMsg{})
doneWithAddToQueue <- struct{}{}
}()
@@ -239,8 +239,8 @@ func TestAddToQueueDuringTickDoesNotTimeout(t *testing.T) {
// are added to some queue that is not processed until the NEXT tick.
func TestTransactionsAreExecutedAtNextTick(t *testing.T) {
world := ecs.NewTestWorld(t)
- modScoreTx := ecs.NewTransactionType[*ModifyScoreTx, *EmptyTxResult]("modify_score")
- assert.NilError(t, world.RegisterTransactions(modScoreTx))
+ modScoreMsg := ecs.NewMessageType[*ModifyScoreMsg, *EmptyMsgResult]("modify_score")
+ assert.NilError(t, world.RegisterMessages(modScoreMsg))
ctx := context.Background()
tickStart := make(chan time.Time)
tickDone := make(chan uint64)
@@ -248,24 +248,24 @@ func TestTransactionsAreExecutedAtNextTick(t *testing.T) {
modScoreCountCh := make(chan int)
- // Create two system that report how many instances of the ModifyScoreTx exist in the
+ // Create two system that report how many instances of the ModifyScoreMsg exist in the
// transaction queue. These counts should be the same for each tick. modScoreCountCh is an unbuffered channel
// so these systems will block while writing to modScoreCountCh. This allows the test to ensure that we can run
// commands mid-tick.
world.AddSystem(func(wCtx ecs.WorldContext) error {
- modScores := modScoreTx.In(wCtx)
+ modScores := modScoreMsg.In(wCtx)
modScoreCountCh <- len(modScores)
return nil
})
world.AddSystem(func(wCtx ecs.WorldContext) error {
- modScores := modScoreTx.In(wCtx)
+ modScores := modScoreMsg.In(wCtx)
modScoreCountCh <- len(modScores)
return nil
})
assert.NilError(t, world.LoadGameState())
- modScoreTx.AddToQueue(world, &ModifyScoreTx{})
+ modScoreMsg.AddToQueue(world, &ModifyScoreMsg{})
// Start the game tick. The tick will block while waiting to write to modScoreCountCh
tickStart <- time.Now()
@@ -275,8 +275,8 @@ func TestTransactionsAreExecutedAtNextTick(t *testing.T) {
assert.Equal(t, 1, count)
// Add two transactions mid-tick.
- modScoreTx.AddToQueue(world, &ModifyScoreTx{})
- modScoreTx.AddToQueue(world, &ModifyScoreTx{})
+ modScoreMsg.AddToQueue(world, &ModifyScoreMsg{})
+ modScoreMsg.AddToQueue(world, &ModifyScoreMsg{})
// The tick is still not over, so we should still only see 1 modify score transaction
count = <-modScoreCountCh
@@ -307,16 +307,16 @@ func TestTransactionsAreExecutedAtNextTick(t *testing.T) {
}
// TestIdenticallyTypedTransactionCanBeDistinguished verifies that two transactions of the same type
-// can be distinguished if they were added with different TransactionType[T]s.
+// can be distinguished if they were added with different MessageType[T]s.
func TestIdenticallyTypedTransactionCanBeDistinguished(t *testing.T) {
world := ecs.NewTestWorld(t)
type NewOwner struct {
Name string
}
- alpha := ecs.NewTransactionType[NewOwner, EmptyTxResult]("alpha_tx")
- beta := ecs.NewTransactionType[NewOwner, EmptyTxResult]("beta_tx")
- assert.NilError(t, world.RegisterTransactions(alpha, beta))
+ alpha := ecs.NewMessageType[NewOwner, EmptyMsgResult]("alpha_msg")
+ beta := ecs.NewMessageType[NewOwner, EmptyMsgResult]("beta_msg")
+ assert.NilError(t, world.RegisterMessages(alpha, beta))
alpha.AddToQueue(world, NewOwner{"alpha"})
beta.AddToQueue(world, NewOwner{"beta"})
@@ -324,11 +324,11 @@ func TestIdenticallyTypedTransactionCanBeDistinguished(t *testing.T) {
world.AddSystem(func(wCtx ecs.WorldContext) error {
newNames := alpha.In(wCtx)
assert.Check(t, len(newNames) == 1, "expected 1 transaction, not %d", len(newNames))
- assert.Check(t, newNames[0].Value.Name == "alpha")
+ assert.Check(t, newNames[0].Msg.Name == "alpha")
newNames = beta.In(wCtx)
assert.Check(t, len(newNames) == 1, "expected 1 transaction, not %d", len(newNames))
- assert.Check(t, newNames[0].Value.Name == "beta")
+ assert.Check(t, newNames[0].Msg.Name == "beta")
return nil
})
assert.NilError(t, world.LoadGameState())
@@ -337,103 +337,103 @@ func TestIdenticallyTypedTransactionCanBeDistinguished(t *testing.T) {
}
func TestCannotRegisterDuplicateTransaction(t *testing.T) {
- tx := ecs.NewTransactionType[ModifyScoreTx, EmptyTxResult]("modify_score")
+ msg := ecs.NewMessageType[ModifyScoreMsg, EmptyMsgResult]("modify_score")
world := ecs.NewTestWorld(t)
- assert.Check(t, nil != world.RegisterTransactions(tx, tx))
+ assert.Check(t, nil != world.RegisterMessages(msg, msg))
}
func TestCannotCallRegisterTransactionsMultipleTimes(t *testing.T) {
- tx := ecs.NewTransactionType[ModifyScoreTx, EmptyTxResult]("modify_score")
+ msg := ecs.NewMessageType[ModifyScoreMsg, EmptyMsgResult]("modify_score")
world := ecs.NewTestWorld(t)
- assert.NilError(t, world.RegisterTransactions(tx))
- assert.Check(t, nil != world.RegisterTransactions(tx))
+ assert.NilError(t, world.RegisterMessages(msg))
+ assert.Check(t, nil != world.RegisterMessages(msg))
}
func TestCanEncodeDecodeEVMTransactions(t *testing.T) {
- // the tx we are going to test against
- type FooTx struct {
+ // the msg we are going to test against
+ type FooMsg struct {
X, Y uint64
Name string
}
- tx := FooTx{1, 2, "foo"}
- // set up the ITransaction.
- itx := ecs.NewTransactionType[FooTx, EmptyTxResult]("FooTx", ecs.WithTxEVMSupport[FooTx, EmptyTxResult])
- bz, err := itx.ABIEncode(tx)
+ msg := FooMsg{1, 2, "foo"}
+ // set up the Message.
+ iMsg := ecs.NewMessageType[FooMsg, EmptyMsgResult]("FooMsg", ecs.WithMsgEVMSupport[FooMsg, EmptyMsgResult])
+ bz, err := iMsg.ABIEncode(msg)
assert.NilError(t, err)
// decode the evm bytes
- fooTx, err := itx.DecodeEVMBytes(bz)
+ fooMsg, err := iMsg.DecodeEVMBytes(bz)
assert.NilError(t, err)
// we should be able to cast back to our concrete Go struct.
- f, ok := fooTx.(FooTx)
+ f, ok := fooMsg.(FooMsg)
assert.Equal(t, ok, true)
- assert.DeepEqual(t, f, tx)
+ assert.DeepEqual(t, f, msg)
}
func TestCannotDecodeEVMBeforeSetEVM(t *testing.T) {
type foo struct{}
- tx := ecs.NewTransactionType[foo, EmptyTxResult]("foo")
- _, err := tx.DecodeEVMBytes([]byte{})
+ msg := ecs.NewMessageType[foo, EmptyMsgResult]("foo")
+ _, err := msg.DecodeEVMBytes([]byte{})
assert.ErrorIs(t, err, ecs.ErrEVMTypeNotSet)
}
func TestCannotHaveDuplicateTransactionNames(t *testing.T) {
- type SomeTx struct {
+ type SomeMsg struct {
X, Y, Z int
}
- type OtherTx struct {
+ type OtherMsg struct {
Alpha, Beta string
}
world := ecs.NewTestWorld(t)
- alphaTx := ecs.NewTransactionType[SomeTx, EmptyTxResult]("name_match")
- betaTx := ecs.NewTransactionType[OtherTx, EmptyTxResult]("name_match")
- assert.ErrorIs(t, world.RegisterTransactions(alphaTx, betaTx), ecs.ErrDuplicateTransactionName)
+ alphaMsg := ecs.NewMessageType[SomeMsg, EmptyMsgResult]("name_match")
+ betaMsg := ecs.NewMessageType[OtherMsg, EmptyMsgResult]("name_match")
+ assert.ErrorIs(t, world.RegisterMessages(alphaMsg, betaMsg), ecs.ErrDuplicateMessageName)
}
func TestCanGetTransactionErrorsAndResults(t *testing.T) {
- type MoveTx struct {
+ type MoveMsg struct {
DeltaX, DeltaY int
}
- type MoveTxResult struct {
+ type MoveMsgResult struct {
EndX, EndY int
}
world := ecs.NewTestWorld(t)
// Each transaction now needs an input and an output
- moveTx := ecs.NewTransactionType[MoveTx, MoveTxResult]("move")
- assert.NilError(t, world.RegisterTransactions(moveTx))
+ moveMsg := ecs.NewMessageType[MoveMsg, MoveMsgResult]("move")
+ assert.NilError(t, world.RegisterMessages(moveMsg))
wantFirstError := errors.New("this is a transaction error")
wantSecondError := errors.New("another transaction error")
wantDeltaX, wantDeltaY := 99, 100
world.AddSystem(func(wCtx ecs.WorldContext) error {
- // This new TxsIn function returns a triplet of information:
+ // This new In function returns a triplet of information:
// 1) The transaction input
// 2) An ID that uniquely identifies this specific transaction
// 3) The signature
// This function would replace both "In" and "TxsAndSigsIn"
- txs := moveTx.In(wCtx)
- assert.Equal(t, 1, len(txs), "expected 1 move transaction")
- tx := txs[0]
+ txData := moveMsg.In(wCtx)
+ assert.Equal(t, 1, len(txData), "expected 1 move transaction")
+ tx := txData[0]
// The input for the transaction is found at tx.Val
- assert.Equal(t, wantDeltaX, tx.Value.DeltaX)
- assert.Equal(t, wantDeltaY, tx.Value.DeltaY)
+ assert.Equal(t, wantDeltaX, tx.Msg.DeltaX)
+ assert.Equal(t, wantDeltaY, tx.Msg.DeltaY)
// AddError will associate an error with the tx.TxHash. Multiple errors can be
// associated with a transaction.
- moveTx.AddError(wCtx, tx.TxHash, wantFirstError)
- moveTx.AddError(wCtx, tx.TxHash, wantSecondError)
+ moveMsg.AddError(wCtx, tx.Hash, wantFirstError)
+ moveMsg.AddError(wCtx, tx.Hash, wantSecondError)
// SetResult sets the output for the transaction. Only one output can be set
// for a tx.TxHash (the last assigned result will clobber other results)
- moveTx.SetResult(wCtx, tx.TxHash, MoveTxResult{42, 42})
+ moveMsg.SetResult(wCtx, tx.Hash, MoveMsgResult{42, 42})
return nil
})
assert.NilError(t, world.LoadGameState())
- _ = moveTx.AddToQueue(world, MoveTx{99, 100})
+ _ = moveMsg.AddToQueue(world, MoveMsg{99, 100})
// Tick the game so the transaction is processed
assert.NilError(t, world.Tick(context.Background()))
@@ -446,28 +446,28 @@ func TestCanGetTransactionErrorsAndResults(t *testing.T) {
assert.Equal(t, 2, len(r.Errs))
assert.ErrorIs(t, wantFirstError, r.Errs[0])
assert.ErrorIs(t, wantSecondError, r.Errs[1])
- got, ok := r.Result.(MoveTxResult)
+ got, ok := r.Result.(MoveMsgResult)
assert.Check(t, ok)
- assert.Equal(t, MoveTxResult{42, 42}, got)
+ assert.Equal(t, MoveMsgResult{42, 42}, got)
}
func TestSystemCanFindErrorsFromEarlierSystem(t *testing.T) {
- type TxIn struct {
+ type MsgIn struct {
Number int
}
- type TxOut struct {
+ type MsgOut struct {
Number int
}
world := ecs.NewTestWorld(t)
- numTx := ecs.NewTransactionType[TxIn, TxOut]("number")
- assert.NilError(t, world.RegisterTransactions(numTx))
+ numTx := ecs.NewMessageType[MsgIn, MsgOut]("number")
+ assert.NilError(t, world.RegisterMessages(numTx))
wantErr := errors.New("some transaction error")
systemCalls := 0
world.AddSystem(func(wCtx ecs.WorldContext) error {
systemCalls++
txs := numTx.In(wCtx)
assert.Equal(t, 1, len(txs))
- hash := txs[0].TxHash
+ hash := txs[0].Hash
_, _, ok := numTx.GetReceipt(wCtx, hash)
assert.Check(t, !ok)
numTx.AddError(wCtx, hash, wantErr)
@@ -478,7 +478,7 @@ func TestSystemCanFindErrorsFromEarlierSystem(t *testing.T) {
systemCalls++
txs := numTx.In(wCtx)
assert.Equal(t, 1, len(txs))
- hash := txs[0].TxHash
+ hash := txs[0].Hash
_, errs, ok := numTx.GetReceipt(wCtx, hash)
assert.Check(t, ok)
assert.Equal(t, 1, len(errs))
@@ -487,31 +487,31 @@ func TestSystemCanFindErrorsFromEarlierSystem(t *testing.T) {
})
assert.NilError(t, world.LoadGameState())
- _ = numTx.AddToQueue(world, TxIn{100})
+ _ = numTx.AddToQueue(world, MsgIn{100})
assert.NilError(t, world.Tick(context.Background()))
assert.Equal(t, 2, systemCalls)
}
func TestSystemCanClobberTransactionResult(t *testing.T) {
- type TxIn struct {
+ type MsgIn struct {
Number int
}
- type TxOut struct {
+ type MsgOut struct {
Number int
}
world := ecs.NewTestWorld(t)
- numTx := ecs.NewTransactionType[TxIn, TxOut]("number")
- assert.NilError(t, world.RegisterTransactions(numTx))
+ numTx := ecs.NewMessageType[MsgIn, MsgOut]("number")
+ assert.NilError(t, world.RegisterMessages(numTx))
systemCalls := 0
- firstResult := TxOut{1234}
- secondResult := TxOut{5678}
+ firstResult := MsgOut{1234}
+ secondResult := MsgOut{5678}
world.AddSystem(func(wCtx ecs.WorldContext) error {
systemCalls++
txs := numTx.In(wCtx)
assert.Equal(t, 1, len(txs))
- hash := txs[0].TxHash
+ hash := txs[0].Hash
_, _, ok := numTx.GetReceipt(wCtx, hash)
assert.Check(t, !ok)
numTx.SetResult(wCtx, hash, firstResult)
@@ -522,17 +522,17 @@ func TestSystemCanClobberTransactionResult(t *testing.T) {
systemCalls++
txs := numTx.In(wCtx)
assert.Equal(t, 1, len(txs))
- hash := txs[0].TxHash
+ hash := txs[0].Hash
out, errs, ok := numTx.GetReceipt(wCtx, hash)
assert.Check(t, ok)
assert.Equal(t, 0, len(errs))
- assert.Equal(t, TxOut{1234}, out)
+ assert.Equal(t, MsgOut{1234}, out)
numTx.SetResult(wCtx, hash, secondResult)
return nil
})
assert.NilError(t, world.LoadGameState())
- _ = numTx.AddToQueue(world, TxIn{100})
+ _ = numTx.AddToQueue(world, MsgIn{100})
assert.NilError(t, world.Tick(context.Background()))
@@ -542,18 +542,18 @@ func TestSystemCanClobberTransactionResult(t *testing.T) {
assert.Equal(t, 1, len(receipts))
r := receipts[0]
assert.Equal(t, 0, len(r.Errs))
- gotResult, ok := r.Result.(TxOut)
+ gotResult, ok := r.Result.(MsgOut)
assert.Check(t, ok)
assert.Equal(t, secondResult, gotResult)
}
func TestCopyTransactions(t *testing.T) {
- type FooTx struct {
+ type FooMsg struct {
X int
}
- txq := transaction.NewTxQueue()
- txq.AddTransaction(1, FooTx{X: 3}, &sign.Transaction{PersonaTag: "foo"})
- txq.AddTransaction(2, FooTx{X: 4}, &sign.Transaction{PersonaTag: "bar"})
+ txq := message.NewTxQueue()
+ txq.AddTransaction(1, FooMsg{X: 3}, &sign.Transaction{PersonaTag: "foo"})
+ txq.AddTransaction(2, FooMsg{X: 4}, &sign.Transaction{PersonaTag: "bar"})
copyTxq := txq.CopyTransactions()
assert.Equal(t, copyTxq.GetAmountOfTxs(), 2)
@@ -563,6 +563,6 @@ func TestCopyTransactions(t *testing.T) {
func TestNewTransactionPanicsIfNoName(t *testing.T) {
type Foo struct{}
require.Panics(t, func() {
- ecs.NewTransactionType[Foo, Foo]("")
+ ecs.NewMessageType[Foo, Foo]("")
})
}
diff --git a/cardinal/ecs/transaction/transaction.go b/cardinal/ecs/message/queue.go
similarity index 65%
rename from cardinal/ecs/transaction/transaction.go
rename to cardinal/ecs/message/queue.go
index 91e610afc..bdf29a8c7 100644
--- a/cardinal/ecs/transaction/transaction.go
+++ b/cardinal/ecs/message/queue.go
@@ -1,9 +1,8 @@
-package transaction
+package message
import (
- "sync"
-
"pkg.world.dev/world-engine/sign"
+ "sync"
)
type TxQueue struct {
@@ -25,8 +24,8 @@ func (t *TxQueue) GetAmountOfTxs() int {
// GetEVMTxs gets all the txs in the queue that originated from the EVM.
// NOTE: this is called ONLY in the copied tx queue in world.Tick, so we do not need to use the mutex here.
-func (t *TxQueue) GetEVMTxs() []TxAny {
- transactions := make([]TxAny, 0)
+func (t *TxQueue) GetEVMTxs() []TxData {
+ transactions := make([]TxData, 0)
for _, txs := range t.m {
// skip if theres nothing
if len(txs) == 0 {
@@ -53,11 +52,11 @@ func (t *TxQueue) addTransaction(id TypeID, v any, sig *sign.Transaction, evmTxH
t.mux.Lock()
defer t.mux.Unlock()
txHash := TxHash(sig.HashHex())
- t.m[id] = append(t.m[id], TxAny{
- TxID: id,
+ t.m[id] = append(t.m[id], TxData{
+ MsgID: id,
TxHash: txHash,
- Value: v,
- Sig: sig,
+ Msg: v,
+ Tx: sig,
EVMSourceTxHash: evmTxHash,
})
t.txsInQueue++
@@ -78,36 +77,17 @@ func (t *TxQueue) reset() {
t.txsInQueue = 0
}
-func (t *TxQueue) ForID(id TypeID) []TxAny {
+func (t *TxQueue) ForID(id TypeID) []TxData {
return t.m[id]
}
-type txMap map[TypeID][]TxAny
+type txMap map[TypeID][]TxData
-type TxAny struct {
- TxID TypeID
- Value any
+type TxData struct {
+ MsgID TypeID
+ Msg any
TxHash TxHash
- Sig *sign.Transaction
+ Tx *sign.Transaction
// EVMSourceTxHash is the tx hash of the EVM tx that triggered this tx.
EVMSourceTxHash string
}
-
-type TxHash string
-
-type TypeID int
-
-type ITransaction interface {
- SetID(TypeID) error
- Name() string
- ID() TypeID
- Encode(any) ([]byte, error)
- Decode([]byte) (any, error)
- // DecodeEVMBytes decodes ABI encoded bytes into the transactions input type.
- DecodeEVMBytes([]byte) (any, error)
- // ABIEncode encodes the given type in ABI encoding, given that the input is the transaction types input or output
- // type.
- ABIEncode(any) ([]byte, error)
- // IsEVMCompatible reports if this tx can be sent from the EVM.
- IsEVMCompatible() bool
-}
diff --git a/cardinal/ecs/transaction_test.go b/cardinal/ecs/message_test.go
similarity index 64%
rename from cardinal/ecs/transaction_test.go
rename to cardinal/ecs/message_test.go
index 4b05883bc..e8137e8b4 100644
--- a/cardinal/ecs/transaction_test.go
+++ b/cardinal/ecs/message_test.go
@@ -3,33 +3,33 @@ package ecs_test
import (
"context"
"errors"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"testing"
"gotest.tools/v3/assert"
"pkg.world.dev/world-engine/cardinal/ecs"
"pkg.world.dev/world-engine/cardinal/ecs/internal/testutil"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
)
func TestForEachTransaction(t *testing.T) {
world := ecs.NewTestWorld(t)
- type SomeTxRequest struct {
+ type SomeMsgRequest struct {
GenerateError bool
}
- type SomeTxResponse struct {
+ type SomeMsgResponse struct {
Successful bool
}
- someTx := ecs.NewTransactionType[SomeTxRequest, SomeTxResponse]("some_tx")
- assert.NilError(t, world.RegisterTransactions(someTx))
+ someMsg := ecs.NewMessageType[SomeMsgRequest, SomeMsgResponse]("some_msg")
+ assert.NilError(t, world.RegisterMessages(someMsg))
world.AddSystem(func(wCtx ecs.WorldContext) error {
- someTx.ForEach(wCtx, func(t ecs.TxData[SomeTxRequest]) (result SomeTxResponse, err error) {
- if t.Value.GenerateError {
+ someMsg.ForEach(wCtx, func(t ecs.TxData[SomeMsgRequest]) (result SomeMsgResponse, err error) {
+ if t.Msg.GenerateError {
return result, errors.New("some error")
}
- return SomeTxResponse{
+ return SomeMsgResponse{
Successful: true,
}, nil
})
@@ -38,10 +38,10 @@ func TestForEachTransaction(t *testing.T) {
assert.NilError(t, world.LoadGameState())
// Add 10 transactions to the tx queue and keep track of the hashes that we just created
- knownTxHashes := map[transaction.TxHash]SomeTxRequest{}
+ knownTxHashes := map[message.TxHash]SomeMsgRequest{}
for i := 0; i < 10; i++ {
- req := SomeTxRequest{GenerateError: i%2 == 0}
- txHash := someTx.AddToQueue(world, req, testutil.UniqueSignature(t))
+ req := SomeMsgRequest{GenerateError: i%2 == 0}
+ txHash := someMsg.AddToQueue(world, req, testutil.UniqueSignature(t))
knownTxHashes[txHash] = req
}
@@ -59,7 +59,7 @@ func TestForEachTransaction(t *testing.T) {
assert.Check(t, len(receipt.Errs) > 0)
} else {
assert.Equal(t, 0, len(receipt.Errs))
- assert.Equal(t, receipt.Result.(SomeTxResponse), SomeTxResponse{Successful: true})
+ assert.Equal(t, receipt.Result.(SomeMsgResponse), SomeMsgResponse{Successful: true})
}
}
}
diff --git a/cardinal/ecs/persona.go b/cardinal/ecs/persona.go
index 268ae0246..9c081ed78 100644
--- a/cardinal/ecs/persona.go
+++ b/cardinal/ecs/persona.go
@@ -9,20 +9,20 @@ import (
"pkg.world.dev/world-engine/cardinal/ecs/entity"
)
-// CreatePersonaTransaction allows for the associating of a persona tag with a signer address.
-type CreatePersonaTransaction struct {
+// CreatePersona allows for the associating of a persona tag with a signer address.
+type CreatePersona struct {
PersonaTag string `json:"personaTag"`
SignerAddress string `json:"signerAddress"`
}
-type CreatePersonaTransactionResult struct {
+type CreatePersonaResult struct {
Success bool `json:"success"`
}
-// CreatePersonaTx is a concrete ECS transaction.
-var CreatePersonaTx = NewTransactionType[CreatePersonaTransaction, CreatePersonaTransactionResult](
+// CreatePersonaMsg is a message that facilitates the creation of a persona tag.
+var CreatePersonaMsg = NewMessageType[CreatePersona, CreatePersonaResult](
"create-persona",
- WithTxEVMSupport[CreatePersonaTransaction, CreatePersonaTransactionResult],
+ WithMsgEVMSupport[CreatePersona, CreatePersonaResult],
)
type AuthorizePersonaAddress struct {
@@ -33,7 +33,7 @@ type AuthorizePersonaAddressResult struct {
Success bool `json:"success"`
}
-var AuthorizePersonaAddressTx = NewTransactionType[AuthorizePersonaAddress, AuthorizePersonaAddressResult](
+var AuthorizePersonaAddressMsg = NewMessageType[AuthorizePersonaAddress, AuthorizePersonaAddressResult](
"authorize-persona-address",
)
@@ -45,22 +45,22 @@ func AuthorizePersonaAddressSystem(wCtx WorldContext) error {
if err != nil {
return err
}
- AuthorizePersonaAddressTx.ForEach(wCtx, func(tx TxData[AuthorizePersonaAddress],
+ AuthorizePersonaAddressMsg.ForEach(wCtx, func(txData TxData[AuthorizePersonaAddress],
) (AuthorizePersonaAddressResult, error) {
- val, sig := tx.Value, tx.Sig
+ msg, tx := txData.Msg, txData.Tx
result := AuthorizePersonaAddressResult{Success: false}
- data, ok := personaTagToAddress[sig.PersonaTag]
+ data, ok := personaTagToAddress[tx.PersonaTag]
if !ok {
- return result, fmt.Errorf("persona %s does not exist", sig.PersonaTag)
+ return result, fmt.Errorf("persona %s does not exist", tx.PersonaTag)
}
err = updateComponent[SignerComponent](wCtx, data.EntityID, func(s *SignerComponent) *SignerComponent {
for _, addr := range s.AuthorizedAddresses {
- if addr == val.Address {
+ if addr == msg.Address {
return s
}
}
- s.AuthorizedAddresses = append(s.AuthorizedAddresses, val.Address)
+ s.AuthorizedAddresses = append(s.AuthorizedAddresses, msg.Address)
return s
})
if err != nil {
@@ -118,7 +118,7 @@ func buildPersonaTagMapping(wCtx WorldContext) (map[string]personaTagComponentDa
// RegisterPersonaSystem is an ecs.System that will associate persona tags with signature addresses. Each persona tag
// may have at most 1 signer, so additional attempts to register a signer with a persona tag will be ignored.
func RegisterPersonaSystem(wCtx WorldContext) error {
- createTxs := CreatePersonaTx.In(wCtx)
+ createTxs := CreatePersonaMsg.In(wCtx)
if len(createTxs) == 0 {
return nil
}
@@ -127,28 +127,28 @@ func RegisterPersonaSystem(wCtx WorldContext) error {
return err
}
for _, txData := range createTxs {
- tx := txData.Value
+ tx := txData.Msg
if _, ok := personaTagToAddress[tx.PersonaTag]; ok {
// This PersonaTag has already been registered. Don't do anything
continue
}
id, err := create(wCtx, SignerComponent{})
if err != nil {
- CreatePersonaTx.AddError(wCtx, txData.TxHash, err)
+ CreatePersonaMsg.AddError(wCtx, txData.Hash, err)
continue
}
if err = setComponent[SignerComponent](wCtx, id, &SignerComponent{
PersonaTag: tx.PersonaTag,
SignerAddress: tx.SignerAddress,
}); err != nil {
- CreatePersonaTx.AddError(wCtx, txData.TxHash, err)
+ CreatePersonaMsg.AddError(wCtx, txData.Hash, err)
continue
}
personaTagToAddress[tx.PersonaTag] = personaTagComponentData{
SignerAddress: tx.SignerAddress,
EntityID: id,
}
- CreatePersonaTx.SetResult(wCtx, txData.TxHash, CreatePersonaTransactionResult{
+ CreatePersonaMsg.SetResult(wCtx, txData.Hash, CreatePersonaResult{
Success: true,
})
}
diff --git a/cardinal/ecs/persona_test.go b/cardinal/ecs/persona_test.go
index 193c29bc8..116f1300c 100644
--- a/cardinal/ecs/persona_test.go
+++ b/cardinal/ecs/persona_test.go
@@ -15,19 +15,19 @@ import (
)
func TestCreatePersonaTransactionAutomaticallyCreated(t *testing.T) {
- // Verify that the CreatePersonaTransaction is automatically created and registered with a world.
+ // Verify that the CreatePersona is automatically created and registered with a world.
world := ecs.NewTestWorld(t)
assert.NilError(t, world.LoadGameState())
wantTag := "CoolMage"
wantAddress := "123-456"
- ecs.CreatePersonaTx.AddToQueue(world, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(world, ecs.CreatePersona{
PersonaTag: wantTag,
SignerAddress: wantAddress,
})
- // This CreatePersonaTx has the same persona tag, but it shouldn't be registered because
+ // This CreatePersona has the same persona tag, but it shouldn't be registered because
// it comes second.
- ecs.CreatePersonaTx.AddToQueue(world, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(world, ecs.CreatePersona{
PersonaTag: wantTag,
SignerAddress: "some-other-address",
})
@@ -64,21 +64,21 @@ func TestGetSignerForPersonaTagReturnsErrorWhenNotRegistered(t *testing.T) {
_, err := world.GetSignerForPersonaTag("missing_persona", 1)
assert.ErrorIs(t, err, ecs.ErrPersonaTagHasNoSigner)
- // Queue up a CreatePersonaTx
+ // Queue up a CreatePersona
personaTag := "foobar"
signerAddress := "xyzzy"
- ecs.CreatePersonaTx.AddToQueue(world, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(world, ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: signerAddress,
})
- // This CreatePersonaTx will not be processed until the world.CurrentTick() is greater than the tick that
- // originally got the CreatePersonaTx.
+ // This CreatePersona will not be processed until the world.CurrentTick() is greater than the tick that
+ // originally got the CreatePersona.
tick := world.CurrentTick()
_, err = world.GetSignerForPersonaTag(personaTag, tick)
assert.ErrorIs(t, err, ecs.ErrCreatePersonaTxsNotProcessed)
assert.NilError(t, world.Tick(ctx))
- // The CreatePersonaTx has now been processed
+ // The CreatePersona has now been processed
addr, err := world.GetSignerForPersonaTag(personaTag, tick)
assert.NilError(t, err)
assert.Equal(t, addr, signerAddress)
@@ -92,7 +92,7 @@ func TestDuplicatePersonaTagsInTickAreOnlyRegisteredOnce(t *testing.T) {
for i := 0; i < 10; i++ {
// Attempt to register many different signer addresses with the same persona tag.
- ecs.CreatePersonaTx.AddToQueue(world, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(world, ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: fmt.Sprintf("address-%d", i),
})
@@ -109,7 +109,7 @@ func TestDuplicatePersonaTagsInTickAreOnlyRegisteredOnce(t *testing.T) {
// Attempt to register this persona tag again in a different tick. We should still maintain the original
// signer address.
- ecs.CreatePersonaTx.AddToQueue(world, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(world, ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: "some-other-address",
})
@@ -122,19 +122,19 @@ func TestDuplicatePersonaTagsInTickAreOnlyRegisteredOnce(t *testing.T) {
}
func TestCanAuthorizeAddress(t *testing.T) {
- // Verify that the CreatePersonaTransaction is automatically created and registered with a world.
+ // Verify that the CreatePersona is automatically created and registered with a world.
world := ecs.NewTestWorld(t)
assert.NilError(t, world.LoadGameState())
wantTag := "CoolMage"
wantSigner := "123-456"
- ecs.CreatePersonaTx.AddToQueue(world, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(world, ecs.CreatePersona{
PersonaTag: wantTag,
SignerAddress: wantSigner,
})
wantAddr := "0xfoobar"
- ecs.AuthorizePersonaAddressTx.AddToQueue(world, ecs.AuthorizePersonaAddress{
+ ecs.AuthorizePersonaAddressMsg.AddToQueue(world, ecs.AuthorizePersonaAddress{
Address: wantAddr,
}, &sign.Transaction{PersonaTag: wantTag})
// PersonaTag registration doesn't take place until the relevant system is run during a game tick.
diff --git a/cardinal/ecs/query_test.go b/cardinal/ecs/query_test.go
index a7c65b403..e25691f75 100644
--- a/cardinal/ecs/query_test.go
+++ b/cardinal/ecs/query_test.go
@@ -69,7 +69,7 @@ func TestQueryEVM(t *testing.T) {
w := ecs.NewTestWorld(t)
err := w.RegisterQueries(fooQuery)
assert.NilError(t, err)
- err = w.RegisterTransactions(ecs.NewTransactionType[struct{}, struct{}]("blah"))
+ err = w.RegisterMessages(ecs.NewMessageType[struct{}, struct{}]("blah"))
assert.NilError(t, err)
s, err := evm.NewServer(w)
assert.NilError(t, err)
diff --git a/cardinal/ecs/receipt/receipt.go b/cardinal/ecs/receipt/receipt.go
index acee8e638..023a682e5 100644
--- a/cardinal/ecs/receipt/receipt.go
+++ b/cardinal/ecs/receipt/receipt.go
@@ -1,13 +1,11 @@
// Package receipt keeps track of transaction receipts for a number of ticks. A receipt consists
-// of any errors that were encountered while processing a transaction, as well as the transactions
-// result.
+// of any errors that were encountered while processing a transaction's message, as well as the message's result
package receipt
import (
"errors"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"sync/atomic"
-
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
)
var (
@@ -21,14 +19,14 @@ type History struct {
currTick *atomic.Uint64
ticksToStore uint64
// Receipts for a given tick are assigned to an index into this history slice which acts as a ring buffer.
- history []map[transaction.TxHash]Receipt
+ history []map[message.TxHash]Receipt
}
// Receipt contains a transaction hash, an arbitrary result, and a list of errors.
type Receipt struct {
- TxHash transaction.TxHash `json:"txHash"`
- Result any `json:"result"`
- Errs []error `json:"errs"`
+ TxHash message.TxHash `json:"txHash"`
+ Result any `json:"result"`
+ Errs []error `json:"errs"`
}
// NewHistory creates a object that can track transaction receipts over a number of ticks.
@@ -40,9 +38,9 @@ func NewHistory(currentTick uint64, ticksToStore int) *History {
// Store ticksToStore plus the "current" tick
ticksToStore: uint64(ticksToStore),
}
- h.history = make([]map[transaction.TxHash]Receipt, 0, ticksToStore)
+ h.history = make([]map[message.TxHash]Receipt, 0, ticksToStore)
for i := 0; i < ticksToStore; i++ {
- h.history = append(h.history, map[transaction.TxHash]Receipt{})
+ h.history = append(h.history, map[message.TxHash]Receipt{})
}
h.currTick.Store(currentTick)
return h
@@ -57,7 +55,7 @@ func (h *History) Size() uint64 {
func (h *History) NextTick() {
newCurr := h.currTick.Add(1)
mod := newCurr % h.ticksToStore
- h.history[mod] = map[transaction.TxHash]Receipt{}
+ h.history[mod] = map[message.TxHash]Receipt{}
}
func (h *History) SetTick(tick uint64) {
@@ -66,7 +64,7 @@ func (h *History) SetTick(tick uint64) {
// AddError associates the given error with the given transaction hash. Calling this multiple times will append
// the error any previously added errors.
-func (h *History) AddError(hash transaction.TxHash, err error) {
+func (h *History) AddError(hash message.TxHash, err error) {
tick := int(h.currTick.Load() % h.ticksToStore)
rec := h.history[tick][hash]
rec.TxHash = hash
@@ -76,7 +74,7 @@ func (h *History) AddError(hash transaction.TxHash, err error) {
// SetResult sets the given transaction hash to the given result. Calling this multiple times will replace any previous
// results.
-func (h *History) SetResult(hash transaction.TxHash, result any) {
+func (h *History) SetResult(hash message.TxHash, result any) {
tick := int(h.currTick.Load() % h.ticksToStore)
rec := h.history[tick][hash]
rec.TxHash = hash
@@ -86,7 +84,7 @@ func (h *History) SetResult(hash transaction.TxHash, result any) {
// GetReceipt gets the receipt (the transaction result and the list of errors) for the given transaction hash in the
// current tick. To get receipts from previous ticks use GetReceiptsForTick.
-func (h *History) GetReceipt(hash transaction.TxHash) (Receipt, bool) {
+func (h *History) GetReceipt(hash message.TxHash) (Receipt, bool) {
tick := int(h.currTick.Load() % h.ticksToStore)
rec, ok := h.history[tick][hash]
return rec, ok
diff --git a/cardinal/ecs/receipt/receipt_test.go b/cardinal/ecs/receipt/receipt_test.go
index 9be0d19c3..bf18eb88c 100644
--- a/cardinal/ecs/receipt/receipt_test.go
+++ b/cardinal/ecs/receipt/receipt_test.go
@@ -2,17 +2,17 @@ package receipt
import (
"errors"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"testing"
"github.com/google/uuid"
"gotest.tools/v3/assert"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
)
-func txHash(t *testing.T) transaction.TxHash {
+func txHash(t *testing.T) message.TxHash {
id, err := uuid.NewUUID()
assert.NilError(t, err)
- return transaction.TxHash(id.String())
+ return message.TxHash(id.String())
}
func TestCanSaveAndGetAnError(t *testing.T) {
diff --git a/cardinal/ecs/state_test.go b/cardinal/ecs/state_test.go
index e1aeaeb86..6bb8783ff 100644
--- a/cardinal/ecs/state_test.go
+++ b/cardinal/ecs/state_test.go
@@ -281,7 +281,7 @@ func TestWorldTickAndHistoryTickMatch(t *testing.T) {
func TestCanFindTransactionsAfterReloadingWorld(t *testing.T) {
type Msg struct{}
type Result struct{}
- someTx := ecs.NewTransactionType[Msg, Result]("some-tx")
+ someTx := ecs.NewMessageType[Msg, Result]("some-msg")
redisStore := miniredis.RunT(t)
ctx := context.Background()
@@ -289,10 +289,10 @@ func TestCanFindTransactionsAfterReloadingWorld(t *testing.T) {
// in a tick, and then find those transactions in the tx receipt history.
for reload := 0; reload < 5; reload++ {
world := testutil.InitWorldWithRedis(t, redisStore)
- assert.NilError(t, world.RegisterTransactions(someTx))
+ assert.NilError(t, world.RegisterMessages(someTx))
world.AddSystem(func(wCtx ecs.WorldContext) error {
for _, tx := range someTx.In(wCtx) {
- someTx.SetResult(wCtx, tx.TxHash, Result{})
+ someTx.SetResult(wCtx, tx.Hash, Result{})
}
return nil
})
diff --git a/cardinal/ecs/store/iface.go b/cardinal/ecs/store/iface.go
index 5b68353bc..3c4b3bfd1 100644
--- a/cardinal/ecs/store/iface.go
+++ b/cardinal/ecs/store/iface.go
@@ -2,6 +2,7 @@ package store
import (
"encoding/json"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"pkg.world.dev/world-engine/cardinal/ecs/archetype"
"pkg.world.dev/world-engine/cardinal/ecs/component/metadata"
@@ -9,7 +10,6 @@ import (
"pkg.world.dev/world-engine/cardinal/ecs/filter"
ecslog "pkg.world.dev/world-engine/cardinal/ecs/log"
"pkg.world.dev/world-engine/cardinal/ecs/storage"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
)
type Reader interface {
@@ -53,9 +53,9 @@ type Writer interface {
type TickStorage interface {
GetTickNumbers() (start, end uint64, err error)
- StartNextTick(txs []transaction.ITransaction, queues *transaction.TxQueue) error
+ StartNextTick(txs []message.Message, queues *message.TxQueue) error
FinalizeTick() error
- Recover(txs []transaction.ITransaction) (*transaction.TxQueue, error)
+ Recover(txs []message.Message) (*message.TxQueue, error)
}
// IManager represents all the methods required to track Component, Entity, and Archetype information
diff --git a/cardinal/ecs/tick_test.go b/cardinal/ecs/tick_test.go
index da0d98057..455af9329 100644
--- a/cardinal/ecs/tick_test.go
+++ b/cardinal/ecs/tick_test.go
@@ -318,14 +318,14 @@ func (PowerComp) Name() string {
func TestCanRecoverTransactionsFromFailedSystemRun(t *testing.T) {
rs := miniredis.RunT(t)
- errorBadPowerChange := errors.New("bad power change transaction")
+ errorBadPowerChange := errors.New("bad power change message")
for _, isBuggyIteration := range []bool{true, false} {
world := testutil.InitWorldWithRedis(t, rs)
assert.NilError(t, ecs.RegisterComponent[PowerComp](world))
- powerTx := ecs.NewTransactionType[PowerComp, PowerComp]("change_power")
- assert.NilError(t, world.RegisterTransactions(powerTx))
+ powerTx := ecs.NewMessageType[PowerComp, PowerComp]("change_power")
+ assert.NilError(t, world.RegisterMessages(powerTx))
world.AddSystem(func(wCtx ecs.WorldContext) error {
q, err := wCtx.NewSearch(ecs.Contains(PowerComp{}))
@@ -336,10 +336,10 @@ func TestCanRecoverTransactionsFromFailedSystemRun(t *testing.T) {
changes := powerTx.In(wCtx)
assert.Equal(t, 1, len(changes))
- entityPower.Val += changes[0].Value.Val
+ entityPower.Val += changes[0].Msg.Val
assert.NilError(t, component.SetComponent[PowerComp](wCtx, id, entityPower))
- if isBuggyIteration && changes[0].Value.Val == 666 {
+ if isBuggyIteration && changes[0].Msg.Val == 666 {
return errorBadPowerChange
}
return nil
@@ -379,7 +379,7 @@ func TestCanRecoverTransactionsFromFailedSystemRun(t *testing.T) {
powerTx.AddToQueue(world, PowerComp{666})
assert.ErrorIs(t, errorBadPowerChange, world.Tick(context.Background()))
} else {
- // Loading the game state above should successfully re-process that final 666 transactions.
+ // Loading the game state above should successfully re-process that final 666 messages.
assert.Equal(t, float64(3666), fetchPower())
// One more tick for good measure
diff --git a/cardinal/ecs/transaction.go b/cardinal/ecs/transaction.go
deleted file mode 100644
index 1f4644bb0..000000000
--- a/cardinal/ecs/transaction.go
+++ /dev/null
@@ -1,237 +0,0 @@
-package ecs
-
-import (
- "errors"
- "fmt"
- "reflect"
-
- ethereumAbi "github.com/ethereum/go-ethereum/accounts/abi"
- "pkg.world.dev/world-engine/cardinal/ecs/abi"
- "pkg.world.dev/world-engine/cardinal/ecs/codec"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
- "pkg.world.dev/world-engine/sign"
-)
-
-var (
- ErrEVMTypeNotSet = errors.New("EVM type is not set")
-)
-
-var _ transaction.ITransaction = &TransactionType[struct{}, struct{}]{}
-
-// TransactionType helps manage adding transactions (aka events) to the world transaction queue. It also assists
-// in the using of transactions inside of System functions.
-type TransactionType[In, Out any] struct {
- id transaction.TypeID
- isIDSet bool
- name string
- inEVMType *ethereumAbi.Type
- outEVMType *ethereumAbi.Type
-}
-
-func WithTxEVMSupport[In, Out any]() func(transactionType *TransactionType[In, Out]) {
- return func(txt *TransactionType[In, Out]) {
- var in In
- var err error
- txt.inEVMType, err = abi.GenerateABIType(in)
- if err != nil {
- panic(err)
- }
-
- var out Out
- txt.outEVMType, err = abi.GenerateABIType(out)
- if err != nil {
- panic(err)
- }
- }
-}
-
-func NewTransactionType[In, Out any](
- name string,
- opts ...func() func(*TransactionType[In, Out]),
-) *TransactionType[In, Out] {
- if name == "" {
- panic("cannot create transaction without name")
- }
- var in In
- var out Out
- inType := reflect.TypeOf(in)
- inKind := inType.Kind()
- inValid := false
- if (inKind == reflect.Pointer && inType.Elem().Kind() == reflect.Struct) || inKind == reflect.Struct {
- inValid = true
- }
- outType := reflect.TypeOf(out)
- outKind := inType.Kind()
- outValid := false
- if (outKind == reflect.Pointer && outType.Elem().Kind() == reflect.Struct) || outKind == reflect.Struct {
- outValid = true
- }
-
- if !outValid || !inValid {
- panic(fmt.Sprintf("Invalid TransactionType: %s: The In and Out must be both structs", name))
- }
-
- txt := &TransactionType[In, Out]{
- name: name,
- }
- for _, opt := range opts {
- opt()(txt)
- }
- return txt
-}
-
-func (t *TransactionType[In, Out]) Name() string {
- return t.name
-}
-
-func (t *TransactionType[In, Out]) IsEVMCompatible() bool {
- return t.inEVMType != nil && t.outEVMType != nil
-}
-
-func (t *TransactionType[In, Out]) ID() transaction.TypeID {
- if !t.isIDSet {
- panic(fmt.Sprintf("id on %v is not set", t))
- }
- return t.id
-}
-
-var emptySignature = &sign.Transaction{}
-
-// AddToQueue adds a transaction with the given data to the world object. The transaction will be executed
-// at the next game tick. An optional sign.Transaction can be associated with this transaction.
-func (t *TransactionType[In, Out]) AddToQueue(world *World, data In, sigs ...*sign.Transaction) transaction.TxHash {
- sig := emptySignature
- if len(sigs) > 0 {
- sig = sigs[0]
- }
- _, id := world.AddTransaction(t.ID(), data, sig)
- return id
-}
-
-func (t *TransactionType[In, Out]) SetID(id transaction.TypeID) error {
- if t.isIDSet {
- // In games implemented with Cardinal, transactions will only be initialized one time (on startup).
- // In tests, it's often useful to use the same transaction in multiple worlds. This check will allow for the
- // re-initialization of transactions, as long as the ID doesn't change.
- if id == t.id {
- return nil
- }
- return fmt.Errorf("id on transaction %v is already set to %v and cannot change to %d", t, t.id, id)
- }
- t.id = id
- t.isIDSet = true
- return nil
-}
-
-type TxData[In any] struct {
- TxHash transaction.TxHash
- Value In
- Sig *sign.Transaction
-}
-
-func (t *TransactionType[In, Out]) AddError(wCtx WorldContext, hash transaction.TxHash, err error) {
- wCtx.GetWorld().AddTransactionError(hash, err)
-}
-
-func (t *TransactionType[In, Out]) SetResult(wCtx WorldContext, hash transaction.TxHash, result Out) {
- wCtx.GetWorld().SetTransactionResult(hash, result)
-}
-
-func (t *TransactionType[In, Out]) GetReceipt(wCtx WorldContext, hash transaction.TxHash) (
- v Out, errs []error, ok bool,
-) {
- world := wCtx.GetWorld()
- iface, errs, ok := world.GetTransactionReceipt(hash)
- if !ok {
- return v, nil, false
- }
- // if iface is nil, maybe the result has never been set. The errors may still be valid.
- if iface == nil {
- return v, errs, true
- }
- value, ok := iface.(Out)
- if !ok {
- return v, nil, false
- }
- return value, errs, true
-}
-
-func (t *TransactionType[In, Out]) ForEach(wCtx WorldContext, fn func(TxData[In]) (Out, error)) {
- for _, tx := range t.In(wCtx) {
- if result, err := fn(tx); err != nil {
- wCtx.Logger().Err(err).Msgf("tx %s from %s encountered an error with tx=%+v", tx.TxHash,
- tx.Sig.PersonaTag, tx.Value)
- t.AddError(wCtx, tx.TxHash, err)
- } else {
- t.SetResult(wCtx, tx.TxHash, result)
- }
- }
-}
-
-// In extracts all the transactions in the transaction queue that match this TransactionType's ID.
-func (t *TransactionType[In, Out]) In(wCtx WorldContext) []TxData[In] {
- tq := wCtx.GetTxQueue()
- var txs []TxData[In]
- for _, tx := range tq.ForID(t.ID()) {
- if val, ok := tx.Value.(In); ok {
- txs = append(txs, TxData[In]{
- TxHash: tx.TxHash,
- Value: val,
- Sig: tx.Sig,
- })
- }
- }
- return txs
-}
-
-func (t *TransactionType[In, Out]) Encode(a any) ([]byte, error) {
- return codec.Encode(a)
-}
-
-func (t *TransactionType[In, Out]) Decode(bytes []byte) (any, error) {
- return codec.Decode[In](bytes)
-}
-
-// ABIEncode encodes the input to the transactions matching evm type. If the input is not either of the transactions
-// evm types, an error is returned.
-func (t *TransactionType[In, Out]) ABIEncode(v any) ([]byte, error) {
- if t.inEVMType == nil || t.outEVMType == nil {
- return nil, ErrEVMTypeNotSet
- }
-
- var args ethereumAbi.Arguments
- var input any
- //nolint:gocritic // its fine.
- switch in := v.(type) {
- case Out:
- input = in
- args = ethereumAbi.Arguments{{Type: *t.outEVMType}}
- case In:
- input = in
- args = ethereumAbi.Arguments{{Type: *t.inEVMType}}
- default:
- return nil, fmt.Errorf("expected input to be of type %T or %T, got %T", new(In), new(Out), v)
- }
-
- return args.Pack(input)
-}
-
-// DecodeEVMBytes decodes abi encoded solidity structs into the transaction's "In" type.
-func (t *TransactionType[In, Out]) DecodeEVMBytes(bz []byte) (any, error) {
- if t.inEVMType == nil {
- return nil, ErrEVMTypeNotSet
- }
- args := ethereumAbi.Arguments{{Type: *t.inEVMType}}
- unpacked, err := args.Unpack(bz)
- if err != nil {
- return nil, err
- }
- if len(unpacked) < 1 {
- return nil, fmt.Errorf("error decoding EVM bytes: no values could be unpacked into the abi type")
- }
- input, err := abi.SerdeInto[In](unpacked[0])
- if err != nil {
- return nil, err
- }
- return input, nil
-}
diff --git a/cardinal/ecs/world.go b/cardinal/ecs/world.go
index 78f113fa9..db17f1136 100644
--- a/cardinal/ecs/world.go
+++ b/cardinal/ecs/world.go
@@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"path/filepath"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"reflect"
"runtime"
"strconv"
@@ -23,7 +24,6 @@ import (
"pkg.world.dev/world-engine/cardinal/ecs/receipt"
"pkg.world.dev/world-engine/cardinal/ecs/storage"
"pkg.world.dev/world-engine/cardinal/ecs/store"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
"pkg.world.dev/world-engine/cardinal/events"
"pkg.world.dev/world-engine/cardinal/shard"
"pkg.world.dev/world-engine/chain/x/shard/types"
@@ -38,24 +38,24 @@ func (n Namespace) String() string {
}
type World struct {
- namespace Namespace
- nonceStore storage.NonceStorage
- entityStore store.IManager
- systems []System
- systemLoggers []*ecslog.Logger
- systemNames []string
- tick uint64
- nameToComponent map[string]metadata.ComponentMetadata
- registeredComponents []metadata.ComponentMetadata
- registeredTransactions []transaction.ITransaction
- registeredQueries []IQuery
- isComponentsRegistered bool
- isTransactionsRegistered bool
- stateIsLoaded bool
+ namespace Namespace
+ nonceStore storage.NonceStorage
+ entityStore store.IManager
+ systems []System
+ systemLoggers []*ecslog.Logger
+ systemNames []string
+ tick uint64
+ nameToComponent map[string]metadata.ComponentMetadata
+ registeredComponents []metadata.ComponentMetadata
+ registeredMessages []message.Message
+ registeredQueries []IQuery
+ isComponentsRegistered bool
+ isMessagesRegistered bool
+ stateIsLoaded bool
evmTxReceipts map[string]EVMTxReceipt
- txQueue *transaction.TxQueue
+ txQueue *message.TxQueue
receiptHistory *receipt.History
@@ -75,10 +75,10 @@ type World struct {
}
var (
- ErrTransactionRegistrationMustHappenOnce = errors.New("transaction registration must happen exactly 1 time")
- ErrStoreStateInvalid = errors.New("saved world state is not valid")
- ErrDuplicateTransactionName = errors.New("transaction names must be unique")
- ErrDuplicateQueryName = errors.New("query names must be unique")
+ ErrMessageRegistrationMustHappenOnce = errors.New("message registration must happen exactly 1 time")
+ ErrStoreStateInvalid = errors.New("saved world state is not valid")
+ ErrDuplicateMessageName = errors.New("message names must be unique")
+ ErrDuplicateQueryName = errors.New("query names must be unique")
)
const (
@@ -193,26 +193,26 @@ func (w *World) RegisterQueries(queries ...IQuery) error {
return nil
}
-func (w *World) RegisterTransactions(txs ...transaction.ITransaction) error {
+func (w *World) RegisterMessages(txs ...message.Message) error {
if w.stateIsLoaded {
- panic("cannot register transactions after loading game state")
+ panic("cannot register messages after loading game state")
}
- if w.isTransactionsRegistered {
- return ErrTransactionRegistrationMustHappenOnce
+ if w.isMessagesRegistered {
+ return ErrMessageRegistrationMustHappenOnce
}
- w.isTransactionsRegistered = true
- w.registerInternalTransactions()
- w.registeredTransactions = append(w.registeredTransactions, txs...)
+ w.isMessagesRegistered = true
+ w.registerInternalMessages()
+ w.registeredMessages = append(w.registeredMessages, txs...)
seenTxNames := map[string]bool{}
- for i, t := range w.registeredTransactions {
+ for i, t := range w.registeredMessages {
name := t.Name()
if seenTxNames[name] {
- return fmt.Errorf("duplicate tx %q: %w", name, ErrDuplicateTransactionName)
+ return fmt.Errorf("duplicate tx %q: %w", name, ErrDuplicateMessageName)
}
seenTxNames[name] = true
- id := transaction.TypeID(i + 1)
+ id := message.TypeID(i + 1)
if err := t.SetID(id); err != nil {
return err
}
@@ -220,10 +220,10 @@ func (w *World) RegisterTransactions(txs ...transaction.ITransaction) error {
return nil
}
-func (w *World) registerInternalTransactions() {
- w.registeredTransactions = append(w.registeredTransactions,
- CreatePersonaTx,
- AuthorizePersonaAddressTx,
+func (w *World) registerInternalMessages() {
+ w.registeredMessages = append(w.registeredMessages,
+ CreatePersonaMsg,
+ AuthorizePersonaAddressMsg,
)
}
@@ -231,11 +231,11 @@ func (w *World) ListQueries() []IQuery {
return w.registeredQueries
}
-func (w *World) ListTransactions() ([]transaction.ITransaction, error) {
- if !w.isTransactionsRegistered {
- return nil, errors.New("cannot list transactions until transaction registration occurs")
+func (w *World) ListMessages() ([]message.Message, error) {
+ if !w.isMessagesRegistered {
+ return nil, errors.New("cannot list messages until message registration occurs")
}
- return w.registeredTransactions, nil
+ return w.registeredMessages, nil
}
// NewWorld creates a new world.
@@ -251,7 +251,7 @@ func NewWorld(nonceStore storage.NonceStorage, entityStore store.IManager, opts
tick: 0,
systems: make([]System, 0),
nameToComponent: make(map[string]metadata.ComponentMetadata),
- txQueue: transaction.NewTxQueue(),
+ txQueue: message.NewTxQueue(),
Logger: logger,
isGameLoopRunning: atomic.Bool{},
endGameLoopCh: make(chan bool),
@@ -286,19 +286,19 @@ func (w *World) Remove(id entity.ID) error {
return w.StoreManager().RemoveEntity(id)
}
-// ConsumeEVMTxResult consumes a tx result from an EVM originated Cardinal transaction.
+// ConsumeEVMMsgResult consumes a tx result from an EVM originated Cardinal message.
// It will fetch the receipt from the map, and then delete ('consume') it from the map.
-func (w *World) ConsumeEVMTxResult(evmTxHash string) (EVMTxReceipt, bool) {
+func (w *World) ConsumeEVMMsgResult(evmTxHash string) (EVMTxReceipt, bool) {
r, ok := w.evmTxReceipts[evmTxHash]
delete(w.evmTxReceipts, evmTxHash)
return r, ok
}
// AddTransaction adds a transaction to the transaction queue. This should not be used directly.
-// Instead, use a TransactionType.AddToQueue to ensure type consistency. Returns the tick this transaction will be
+// Instead, use a MessageType.AddToQueue to ensure type consistency. Returns the tick this transaction will be
// executed in.
-func (w *World) AddTransaction(id transaction.TypeID, v any, sig *sign.Transaction) (
- tick uint64, txHash transaction.TxHash,
+func (w *World) AddTransaction(id message.TypeID, v any, sig *sign.Transaction) (
+ tick uint64, txHash message.TxHash,
) {
// TODO: There's no locking between getting the tick and adding the transaction, so there's no guarantee that this
// transaction is actually added to the returned tick.
@@ -307,8 +307,8 @@ func (w *World) AddTransaction(id transaction.TypeID, v any, sig *sign.Transacti
return tick, txHash
}
-func (w *World) AddEVMTransaction(id transaction.TypeID, v any, sig *sign.Transaction, evmTxHash string) (
- tick uint64, txHash transaction.TxHash,
+func (w *World) AddEVMTransaction(id message.TypeID, v any, sig *sign.Transaction, evmTxHash string) (
+ tick uint64, txHash message.TxHash,
) {
tick = w.CurrentTick()
txHash = w.txQueue.AddEVMTransaction(id, v, sig, evmTxHash)
@@ -338,7 +338,7 @@ func (w *World) Tick(_ context.Context) error {
}
txQueue := w.txQueue.CopyTransactions()
- if err := w.TickStore().StartNextTick(w.registeredTransactions, txQueue); err != nil {
+ if err := w.TickStore().StartNextTick(w.registeredMessages, txQueue); err != nil {
return err
}
@@ -384,7 +384,7 @@ type EVMTxReceipt struct {
EVMTxHash string
}
-func (w *World) setEvmResults(txs []transaction.TxAny) {
+func (w *World) setEvmResults(txs []message.TxData) {
// iterate over all EVM originated transactions
for _, tx := range txs {
// see if tx has a receipt. sometimes it won't because:
@@ -394,9 +394,9 @@ func (w *World) setEvmResults(txs []transaction.TxAny) {
continue
}
evmRec := EVMTxReceipt{EVMTxHash: tx.EVMSourceTxHash}
- itx := w.getITx(tx.TxID)
+ msg := w.getMessage(tx.MsgID)
if rec.Result != nil {
- abiBz, err := itx.ABIEncode(rec.Result)
+ abiBz, err := msg.ABIEncode(rec.Result)
if err != nil {
rec.Errs = append(rec.Errs, err)
}
@@ -416,8 +416,8 @@ func (w *World) StartGameLoop(ctx context.Context, tickStart <-chan time.Time, t
if !w.isComponentsRegistered {
w.Logger.Warn().Msg("No components registered.")
}
- if !w.isTransactionsRegistered {
- w.Logger.Warn().Msg("No transactions registered.")
+ if !w.isMessagesRegistered {
+ w.Logger.Warn().Msg("No messages registered.")
}
if len(w.registeredQueries) == 0 {
w.Logger.Warn().Msg("No queries registered.")
@@ -498,7 +498,7 @@ func (w *World) Shutdown() {
// a problem when running one of the Systems), the snapshotted state is recovered and the pending
// transactions for the incomplete tick are returned. A nil recoveredTxs indicates there are no pending
// transactions that need to be processed because the last tick was successful.
-func (w *World) recoverGameState() (recoveredTxs *transaction.TxQueue, err error) {
+func (w *World) recoverGameState() (recoveredTxs *message.TxQueue, err error) {
start, end, err := w.TickStore().GetTickNumbers()
if err != nil {
return nil, err
@@ -509,15 +509,15 @@ func (w *World) recoverGameState() (recoveredTxs *transaction.TxQueue, err error
//nolint:nilnil // its ok.
return nil, nil
}
- return w.TickStore().Recover(w.registeredTransactions)
+ return w.TickStore().Recover(w.registeredMessages)
}
func (w *World) LoadGameState() error {
if w.stateIsLoaded {
return errors.New("cannot load game state multiple times")
}
- if !w.isTransactionsRegistered {
- if err := w.RegisterTransactions(); err != nil {
+ if !w.isMessagesRegistered {
+ if err := w.RegisterMessages(); err != nil {
return err
}
}
@@ -600,15 +600,15 @@ func (w *World) RecoverFromChain(ctx context.Context) error {
if err != nil {
return err
}
- itx := w.getITx(transaction.TypeID(tx.TxId))
- if itx == nil {
+ msg := w.getMessage(message.TypeID(tx.TxId))
+ if msg == nil {
return fmt.Errorf("error recovering tx with ID %d: tx id not found", tx.TxId)
}
- v, err := itx.Decode(sp.Body)
+ v, err := msg.Decode(sp.Body)
if err != nil {
return err
}
- w.AddTransaction(transaction.TypeID(tx.TxId), v, w.protoTransactionToGo(sp))
+ w.AddTransaction(message.TypeID(tx.TxId), v, w.protoTransactionToGo(sp))
}
// run the tick for this batch
if err = w.Tick(ctx); err != nil {
@@ -647,16 +647,15 @@ func (w *World) decodeTransaction(bz []byte) (*shardv1.Transaction, error) {
return payload, err
}
-// getITx iterates over the registered transactions and returns the ITransaction associated with the TypeID.
-func (w *World) getITx(id transaction.TypeID) transaction.ITransaction {
- var itx transaction.ITransaction
- for _, tx := range w.registeredTransactions {
- if id == tx.ID() {
- itx = tx
- break
+// getMessage iterates over the all registered messages and returns the message.Message associated with the
+// message.TypeID.
+func (w *World) getMessage(id message.TypeID) message.Message {
+ for _, msg := range w.registeredMessages {
+ if id == msg.ID() {
+ return msg
}
}
- return itx
+ return nil
}
func (w *World) GetNonce(signerAddress string) (uint64, error) {
@@ -667,15 +666,15 @@ func (w *World) SetNonce(signerAddress string, nonce uint64) error {
return w.nonceStore.SetNonce(signerAddress, nonce)
}
-func (w *World) AddTransactionError(id transaction.TxHash, err error) {
+func (w *World) AddMessageError(id message.TxHash, err error) {
w.receiptHistory.AddError(id, err)
}
-func (w *World) SetTransactionResult(id transaction.TxHash, a any) {
+func (w *World) SetMessageResult(id message.TxHash, a any) {
w.receiptHistory.SetResult(id, a)
}
-func (w *World) GetTransactionReceipt(id transaction.TxHash) (any, []error, bool) {
+func (w *World) GetTransactionReceipt(id message.TxHash) (any, []error, bool) {
rec, ok := w.receiptHistory.GetReceipt(id)
if !ok {
return nil, nil, false
diff --git a/cardinal/ecs/world_context.go b/cardinal/ecs/world_context.go
index d2e81667f..5478570b6 100644
--- a/cardinal/ecs/world_context.go
+++ b/cardinal/ecs/world_context.go
@@ -2,11 +2,11 @@ package ecs
import (
"errors"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"github.com/rs/zerolog"
ecslog "pkg.world.dev/world-engine/cardinal/ecs/log"
"pkg.world.dev/world-engine/cardinal/ecs/store"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
)
type WorldContext interface {
@@ -18,7 +18,7 @@ type WorldContext interface {
GetWorld() *World
StoreReader() store.Reader
StoreManager() store.IManager
- GetTxQueue() *transaction.TxQueue
+ GetTxQueue() *message.TxQueue
IsReadOnly() bool
}
@@ -28,12 +28,12 @@ var (
type worldContext struct {
world *World
- txQueue *transaction.TxQueue
+ txQueue *message.TxQueue
logger *ecslog.Logger
readOnly bool
}
-func NewWorldContextForTick(world *World, queue *transaction.TxQueue, logger *ecslog.Logger) WorldContext {
+func NewWorldContextForTick(world *World, queue *message.TxQueue, logger *ecslog.Logger) WorldContext {
return &worldContext{
world: world,
txQueue: queue,
@@ -72,7 +72,7 @@ func (w *worldContext) GetWorld() *World {
return w.world
}
-func (w *worldContext) GetTxQueue() *transaction.TxQueue {
+func (w *worldContext) GetTxQueue() *message.TxQueue {
return w.txQueue
}
diff --git a/cardinal/ecs/world_test.go b/cardinal/ecs/world_test.go
index 3307caa02..90c79854e 100644
--- a/cardinal/ecs/world_test.go
+++ b/cardinal/ecs/world_test.go
@@ -38,8 +38,8 @@ func TestEVMTxConsume(t *testing.T) {
Y string
}
w := ecs.NewTestWorld(t)
- fooTx := ecs.NewTransactionType[FooIn, FooOut]("foo", ecs.WithTxEVMSupport[FooIn, FooOut])
- assert.NilError(t, w.RegisterTransactions(fooTx))
+ fooTx := ecs.NewMessageType[FooIn, FooOut]("foo", ecs.WithMsgEVMSupport[FooIn, FooOut])
+ assert.NilError(t, w.RegisterMessages(fooTx))
var returnVal FooOut
var returnErr error
w.AddSystem(func(wCtx ecs.WorldContext) error {
@@ -58,13 +58,13 @@ func TestEVMTxConsume(t *testing.T) {
returnVal = FooOut{Y: "hi"}
returnErr = nil
assert.NilError(t, w.Tick(ctx))
- evmTxReceipt, ok := w.ConsumeEVMTxResult(evmTxHash)
+ evmTxReceipt, ok := w.ConsumeEVMMsgResult(evmTxHash)
assert.Equal(t, ok, true)
assert.Check(t, len(evmTxReceipt.ABIResult) > 0)
assert.Equal(t, evmTxReceipt.EVMTxHash, evmTxHash)
assert.Equal(t, len(evmTxReceipt.Errs), 0)
// shouldn't be able to consume it again.
- _, ok = w.ConsumeEVMTxResult(evmTxHash)
+ _, ok = w.ConsumeEVMMsgResult(evmTxHash)
assert.Equal(t, ok, false)
// lets check against a system that returns an error
@@ -72,14 +72,14 @@ func TestEVMTxConsume(t *testing.T) {
returnErr = errors.New("omg error")
w.AddEVMTransaction(fooTx.ID(), FooIn{X: 32}, &sign.Transaction{PersonaTag: "foo"}, evmTxHash)
assert.NilError(t, w.Tick(ctx))
- evmTxReceipt, ok = w.ConsumeEVMTxResult(evmTxHash)
+ evmTxReceipt, ok = w.ConsumeEVMMsgResult(evmTxHash)
assert.Equal(t, ok, true)
assert.Equal(t, len(evmTxReceipt.ABIResult), 0)
assert.Equal(t, evmTxReceipt.EVMTxHash, evmTxHash)
assert.Equal(t, len(evmTxReceipt.Errs), 1)
// shouldn't be able to consume it again.
- _, ok = w.ConsumeEVMTxResult(evmTxHash)
+ _, ok = w.ConsumeEVMMsgResult(evmTxHash)
assert.Equal(t, ok, false)
}
diff --git a/cardinal/events/events_test.go b/cardinal/events/events_test.go
index 4490f8e78..a2cff6d5e 100644
--- a/cardinal/events/events_test.go
+++ b/cardinal/events/events_test.go
@@ -90,8 +90,8 @@ type SendEnergyTxResult struct{}
func TestEventsThroughSystems(t *testing.T) {
numberToTest := 5
w := ecs.NewTestWorld(t)
- sendTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("send-energy")
- assert.NilError(t, w.RegisterTransactions(sendTx))
+ sendTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("send-energy")
+ assert.NilError(t, w.RegisterMessages(sendTx))
counter1 := atomic.Int32{}
counter1.Store(0)
for i := 0; i < numberToTest; i++ {
diff --git a/cardinal/evm/server.go b/cardinal/evm/server.go
index b9a9dab7e..9723eeefb 100644
--- a/cardinal/evm/server.go
+++ b/cardinal/evm/server.go
@@ -8,11 +8,11 @@ import (
zerolog "github.com/rs/zerolog/log"
"net"
"os"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"pkg.world.dev/world-engine/cardinal/ecs"
"pkg.world.dev/world-engine/cardinal/ecs/component"
"pkg.world.dev/world-engine/cardinal/ecs/entity"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
"pkg.world.dev/world-engine/sign"
"google.golang.org/grpc"
@@ -43,7 +43,7 @@ type Server interface {
}
// txByName maps transaction type ID's to transaction types.
-type txByName map[string]transaction.ITransaction
+type txByName map[string]message.Message
// queryByName maps query resource names to the underlying IQuery.
type queryByName map[string]ecs.IQuery
@@ -71,7 +71,7 @@ type msgServerImpl struct {
func NewServer(w *ecs.World, opts ...Option) (Server, error) {
hasEVMTxsOrQueries := false
- txs, err := w.ListTransactions()
+ txs, err := w.ListMessages()
if err != nil {
return nil, err
}
@@ -244,7 +244,7 @@ func (s *msgServerImpl) SendMessage(_ context.Context, msg *routerv1.SendMessage
}
// check for the tx receipt.
- receipt, ok := s.world.ConsumeEVMTxResult(msg.EvmTxHash)
+ receipt, ok := s.world.ConsumeEVMMsgResult(msg.EvmTxHash)
if !ok {
return &routerv1.SendMessageResponse{
EvmTxHash: msg.EvmTxHash,
diff --git a/cardinal/evm/server_test.go b/cardinal/evm/server_test.go
index f75f16b67..769e6173b 100644
--- a/cardinal/evm/server_test.go
+++ b/cardinal/evm/server_test.go
@@ -31,10 +31,10 @@ func TestServer_SendMessage(t *testing.T) {
w := ecs.NewTestWorld(t)
// create the ECS transactions
- fooTx := ecs.NewTransactionType[FooTransaction, TxReply]("footx", ecs.WithTxEVMSupport[FooTransaction, TxReply])
- barTx := ecs.NewTransactionType[BarTransaction, TxReply]("bartx", ecs.WithTxEVMSupport[BarTransaction, TxReply])
+ fooTx := ecs.NewMessageType[FooTransaction, TxReply]("footx", ecs.WithMsgEVMSupport[FooTransaction, TxReply])
+ barTx := ecs.NewMessageType[BarTransaction, TxReply]("bartx", ecs.WithMsgEVMSupport[BarTransaction, TxReply])
- assert.NilError(t, w.RegisterTransactions(fooTx, barTx))
+ assert.NilError(t, w.RegisterMessages(fooTx, barTx))
// create some txs to submit
@@ -62,10 +62,10 @@ func TestServer_SendMessage(t *testing.T) {
assert.Equal(t, len(inFooTxs), len(fooTxs))
assert.Equal(t, len(inBarTxs), len(barTxs))
for i, tx := range inFooTxs {
- assert.DeepEqual(t, tx.Value, fooTxs[i])
+ assert.DeepEqual(t, tx.Msg, fooTxs[i])
}
for i, tx := range inBarTxs {
- assert.DeepEqual(t, tx.Value, barTxs[i])
+ assert.DeepEqual(t, tx.Msg, barTxs[i])
}
return nil
})
@@ -74,11 +74,11 @@ func TestServer_SendMessage(t *testing.T) {
sender := "0xHelloThere"
personaTag := "foo"
// create authorized addresses for the evm transaction's msg sender.
- ecs.CreatePersonaTx.AddToQueue(w, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(w, ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: "bar",
})
- ecs.AuthorizePersonaAddressTx.AddToQueue(w, ecs.AuthorizePersonaAddress{
+ ecs.AuthorizePersonaAddressMsg.AddToQueue(w, ecs.AuthorizePersonaAddress{
Address: sender,
}, &sign.Transaction{PersonaTag: personaTag})
err := w.Tick(context.Background())
@@ -135,7 +135,7 @@ func TestServer_Query(t *testing.T) {
w := ecs.NewTestWorld(t)
err := w.RegisterQueries(query)
assert.NilError(t, err)
- err = w.RegisterTransactions(ecs.NewTransactionType[struct{}, struct{}]("nothing"))
+ err = w.RegisterMessages(ecs.NewMessageType[struct{}, struct{}]("nothing"))
assert.NilError(t, err)
s, err := NewServer(w)
assert.NilError(t, err)
@@ -165,9 +165,9 @@ func TestServer_UnauthorizedAddress(t *testing.T) {
w := ecs.NewTestWorld(t)
// create the ECS transactions
- fooTxType := ecs.NewTransactionType[FooTransaction, TxReply]("footx", ecs.WithTxEVMSupport[FooTransaction, TxReply])
+ fooTxType := ecs.NewMessageType[FooTransaction, TxReply]("footx", ecs.WithMsgEVMSupport[FooTransaction, TxReply])
- assert.NilError(t, w.RegisterTransactions(fooTxType))
+ assert.NilError(t, w.RegisterMessages(fooTxType))
// create some txs to submit
diff --git a/cardinal/example_transactiontype_test.go b/cardinal/example_messagetype_test.go
similarity index 60%
rename from cardinal/example_transactiontype_test.go
rename to cardinal/example_messagetype_test.go
index 4277ec479..2da408d20 100644
--- a/cardinal/example_transactiontype_test.go
+++ b/cardinal/example_messagetype_test.go
@@ -17,33 +17,33 @@ type MovePlayerResult struct {
FinalY int
}
-var MoveTx = cardinal.NewTransactionType[MovePlayerMsg, MovePlayerResult]("move-player")
+var MoveMsg = cardinal.NewMessageType[MovePlayerMsg, MovePlayerResult]("move-player")
-func ExampleTransactionType() {
+func ExampleMessageType() {
world, err := cardinal.NewMockWorld()
if err != nil {
panic(err)
}
- err = cardinal.RegisterTransactions(world, MoveTx)
+ err = cardinal.RegisterMessages(world, MoveMsg)
if err != nil {
panic(err)
}
cardinal.RegisterSystems(world, func(wCtx cardinal.WorldContext) error {
- for _, tx := range MoveTx.In(wCtx) {
- msg := tx.Value()
- // handle the transaction
+ for _, tx := range MoveMsg.In(wCtx) {
+ msg := tx.Msg()
+ // handle the msg
// ...
// save the result
- MoveTx.SetResult(wCtx, tx.Hash(), MovePlayerResult{
+ MoveMsg.SetResult(wCtx, tx.Hash(), MovePlayerResult{
FinalX: msg.DeltaX,
FinalY: msg.DeltaY,
})
- // optionally, add an error to the transaction
- MoveTx.AddError(wCtx, tx.Hash(), errors.New("some error"))
+ // optionally, add an error
+ MoveMsg.AddError(wCtx, tx.Hash(), errors.New("some error"))
}
return nil
})
diff --git a/cardinal/message.go b/cardinal/message.go
new file mode 100644
index 000000000..5f402aad5
--- /dev/null
+++ b/cardinal/message.go
@@ -0,0 +1,105 @@
+package cardinal
+
+import (
+ "pkg.world.dev/world-engine/cardinal/ecs"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
+ "pkg.world.dev/world-engine/sign"
+)
+
+// AnyMessage is implemented by the return value of NewMessageType and is used in RegisterMessages; any
+// message created by NewMessageType can be registered with a World object via RegisterMessages.
+type AnyMessage interface {
+ Convert() message.Message
+}
+
+// TxData represents a single transaction.
+type TxData[T any] struct {
+ impl ecs.TxData[T]
+}
+
+// MessageType represents a type of message that can be executed on the World object. The Input struct represents
+// the input, and the Result struct represents the result of processing the message.
+type MessageType[Input, Result any] struct {
+ impl *ecs.MessageType[Input, Result]
+}
+
+// NewMessageType creates a new instance of a MessageType.
+func NewMessageType[Input, Result any](name string) *MessageType[Input, Result] {
+ return &MessageType[Input, Result]{
+ impl: ecs.NewMessageType[Input, Result](name),
+ }
+}
+
+// NewMessageTypeWithEVMSupport creates a new instance of a MessageType, with EVM messages enabled.
+// This allows this message to be sent from EVM smart contracts on the EVM base shard.
+func NewMessageTypeWithEVMSupport[Input, Result any](name string) *MessageType[Input, Result] {
+ return &MessageType[Input, Result]{
+ impl: ecs.NewMessageType[Input, Result](name, ecs.WithMsgEVMSupport[Input, Result]),
+ }
+}
+
+// AddToQueue is not meant to be used in production whatsoever, it is exposed here for usage in tests.
+func (t *MessageType[Input, Result]) AddToQueue(world *World, data Input, sigs ...*sign.Transaction) TxHash {
+ txHash := t.impl.AddToQueue(world.implWorld, data, sigs...)
+ return txHash
+}
+
+// AddError adds the given error to the transaction identified by the given hash. Multiple errors can be
+// added to the same message hash.
+func (t *MessageType[Input, Result]) AddError(wCtx WorldContext, hash TxHash, err error) {
+ t.impl.AddError(wCtx.getECSWorldContext(), hash, err)
+}
+
+// SetResult sets the result of the message identified by the given hash. Only one result may be associated
+// with a message hash, so calling this multiple times will clobber previously set results.
+func (t *MessageType[Input, Result]) SetResult(wCtx WorldContext, hash TxHash, result Result) {
+ t.impl.SetResult(wCtx.getECSWorldContext(), hash, result)
+}
+
+// GetReceipt returns the result (if any) and errors (if any) associated with the given hash. If false is returned,
+// the hash is not recognized, so the returned result and errors will be empty.
+func (t *MessageType[Input, Result]) GetReceipt(wCtx WorldContext, hash TxHash) (Result, []error, bool) {
+ return t.impl.GetReceipt(wCtx.getECSWorldContext(), hash)
+}
+
+func (t *MessageType[Input, Result]) ForEach(wCtx WorldContext, fn func(TxData[Input]) (Result, error)) {
+ adapterFn := func(ecsTxData ecs.TxData[Input]) (Result, error) {
+ adaptedTx := TxData[Input]{impl: ecsTxData}
+ return fn(adaptedTx)
+ }
+ t.impl.ForEach(wCtx.getECSWorldContext(), adapterFn)
+}
+
+// In returns the TxData in the given transaction queue that match this message's type.
+func (t *MessageType[Input, Result]) In(wCtx WorldContext) []TxData[Input] {
+ ecsTxData := t.impl.In(wCtx.getECSWorldContext())
+ out := make([]TxData[Input], 0, len(ecsTxData))
+ for _, tx := range ecsTxData {
+ out = append(out, TxData[Input]{
+ impl: tx,
+ })
+ }
+ return out
+}
+
+// Convert implements the AnyMessageType interface which allows a MessageType to be registered
+// with a World via RegisterMessages.
+func (t *MessageType[Input, Result]) Convert() message.Message {
+ return t.impl
+}
+
+// Hash returns the hash of a specific message, which is used to associated results and errors with a specific
+// message.
+func (t *TxData[T]) Hash() TxHash {
+ return t.impl.Hash
+}
+
+// Msg returns the input value of a message.
+func (t *TxData[T]) Msg() T {
+ return t.impl.Msg
+}
+
+// Tx returns the transaction data.
+func (t *TxData[T]) Tx() *sign.Transaction {
+ return t.impl.Tx
+}
diff --git a/cardinal/transaction_test.go b/cardinal/message_test.go
similarity index 84%
rename from cardinal/transaction_test.go
rename to cardinal/message_test.go
index 0f0d4a66e..ae65c6178 100644
--- a/cardinal/transaction_test.go
+++ b/cardinal/message_test.go
@@ -18,39 +18,39 @@ type AddHealthToEntityTx struct {
type AddHealthToEntityResult struct{}
-var addHealthToEntity = cardinal.NewTransactionType[AddHealthToEntityTx, AddHealthToEntityResult]("add_health")
+var addHealthToEntity = cardinal.NewMessageType[AddHealthToEntityTx, AddHealthToEntityResult]("add_health")
func TestApis(t *testing.T) {
// this test just makes sure certain signatures remain the same.
// If they change this test will trigger a compiler error.
x := cardinal.TxData[Alpha]{}
- x.Sig()
+ x.Tx()
x.Hash()
- assert.Equal(t, x.Value().Name(), "alpha")
+ assert.Equal(t, x.Msg().Name(), "alpha")
type randoTx struct{}
type randoTxResult struct{}
- cardinal.NewTransactionTypeWithEVMSupport[randoTx, randoTxResult]("rando_with_evm")
+ cardinal.NewMessageTypeWithEVMSupport[randoTx, randoTxResult]("rando_with_evm")
}
func TestTransactionExample(t *testing.T) {
world, doTick := testutils.MakeWorldAndTicker(t)
assert.NilError(t, cardinal.RegisterComponent[Health](world))
- assert.NilError(t, cardinal.RegisterTransactions(world, addHealthToEntity))
+ assert.NilError(t, cardinal.RegisterMessages(world, addHealthToEntity))
cardinal.RegisterSystems(world, func(worldCtx cardinal.WorldContext) error {
// test "In" method
for _, tx := range addHealthToEntity.In(worldCtx) {
- targetID := tx.Value().TargetID
+ targetID := tx.Msg().TargetID
err := cardinal.UpdateComponent[Health](worldCtx, targetID, func(h *Health) *Health {
- h.Value = tx.Value().Amount
+ h.Value = tx.Msg().Amount
return h
})
assert.Check(t, err == nil)
}
// test same as above but with forEach
addHealthToEntity.ForEach(worldCtx, func(tx cardinal.TxData[AddHealthToEntityTx]) (AddHealthToEntityResult, error) {
- targetID := tx.Value().TargetID
+ targetID := tx.Msg().TargetID
err := cardinal.UpdateComponent[Health](worldCtx, targetID, func(h *Health) *Health {
- h.Value = tx.Value().Amount
+ h.Value = tx.Msg().Amount
return h
})
assert.Check(t, err == nil)
diff --git a/cardinal/server/persona.go b/cardinal/server/persona.go
index b4c8e6a87..1b5f71dd4 100644
--- a/cardinal/server/persona.go
+++ b/cardinal/server/persona.go
@@ -2,9 +2,9 @@ package server
import (
"errors"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"pkg.world.dev/world-engine/cardinal/ecs"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
"pkg.world.dev/world-engine/sign"
)
@@ -50,11 +50,14 @@ func (handler *Handler) getPersonaSignerResponse(req *QueryPersonaSignerRequest)
return &res, nil
}
-func (handler *Handler) generateCreatePersonaResponseFromPayload(payload []byte, sp *sign.Transaction,
- tx transaction.ITransaction) (*TransactionReply, error) {
- txVal, err := tx.Decode(payload)
+func (handler *Handler) generateCreatePersonaResponseFromPayload(
+ payload []byte,
+ sp *sign.Transaction,
+ msg message.Message,
+) (*TransactionReply, error) {
+ msgVal, err := msg.Decode(payload)
if err != nil {
- return nil, errors.New("unable to decode transaction")
+ return nil, errors.New("unable to decode message in transaction")
}
- return handler.submitTransaction(txVal, tx, sp)
+ return handler.submitTransaction(msgVal, msg, sp)
}
diff --git a/cardinal/server/server.go b/cardinal/server/server.go
index a3921611e..e76126d10 100644
--- a/cardinal/server/server.go
+++ b/cardinal/server/server.go
@@ -21,7 +21,7 @@ import (
"pkg.world.dev/world-engine/cardinal/shard"
)
-// Handler is a type that contains endpoints for transactions and queries in a given ecs world.
+// Handler is a type that contains endpoints for messages and queries in a given ecs world.
type Handler struct {
w *ecs.World
Mux *http.ServeMux
@@ -48,7 +48,7 @@ const (
)
// NewHandler instantiates handler function for creating a swagger server that validates itself based on a swagger spec.
-// transactions and queries registered with the given world are automatically created. The server runs on a default port
+// messages and queries registered with the given world are automatically created. The server runs on a default port
// of 4040, but can be changed via options or by setting an environment variable with key CARDINAL_PORT.
func NewHandler(w *ecs.World, builder middleware.Builder, opts ...Option) (*Handler, error) {
h, err := newSwaggerHandlerEmbed(w, builder, opts...)
@@ -172,13 +172,13 @@ type EndpointsResult struct {
}
func createAllEndpoints(world *ecs.World) (*EndpointsResult, error) {
- txs, err := world.ListTransactions()
+ txs, err := world.ListMessages()
if err != nil {
return nil, err
}
txEndpoints := make([]string, 0, len(txs))
for _, tx := range txs {
- if tx.Name() == ecs.CreatePersonaTx.Name() {
+ if tx.Name() == ecs.CreatePersonaMsg.Name() {
txEndpoints = append(txEndpoints, "/tx/persona/"+tx.Name())
} else {
txEndpoints = append(txEndpoints, gameTxPrefix+tx.Name())
diff --git a/cardinal/server/server_test.go b/cardinal/server/server_test.go
index f52eaf623..33070ee1b 100644
--- a/cardinal/server/server_test.go
+++ b/cardinal/server/server_test.go
@@ -143,8 +143,8 @@ func TestShutDownViaSignal(t *testing.T) {
// If this test is frozen then it failed to shut down, create a failure with panic.
testutils.SetTestTimeout(t, 10*time.Second)
w := ecs.NewTestWorld(t)
- sendTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("sendTx")
- assert.NilError(t, w.RegisterTransactions(sendTx))
+ sendTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("sendTx")
+ assert.NilError(t, w.RegisterMessages(sendTx))
w.AddSystem(func(ecs.WorldContext) error {
return nil
})
@@ -176,8 +176,8 @@ func TestShutDownViaSignal(t *testing.T) {
func TestIfServeSetEnvVarForPort(t *testing.T) {
world := ecs.NewTestWorld(t)
- alphaTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("alpha")
- assert.NilError(t, world.RegisterTransactions(alphaTx))
+ alphaTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("alpha")
+ assert.NilError(t, world.RegisterMessages(alphaTx))
txh, err := server.NewHandler(world, nil, server.DisableSignatureVerification())
assert.NilError(t, err)
t.Cleanup(func() {
@@ -199,10 +199,10 @@ func TestIfServeSetEnvVarForPort(t *testing.T) {
func TestCanListTransactionEndpoints(t *testing.T) {
w := ecs.NewTestWorld(t)
- alphaTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("alpha")
- betaTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("beta")
- gammaTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("gamma")
- assert.NilError(t, w.RegisterTransactions(alphaTx, betaTx, gammaTx))
+ alphaTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("alpha")
+ betaTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("beta")
+ gammaTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("gamma")
+ assert.NilError(t, w.RegisterMessages(alphaTx, betaTx, gammaTx))
txh := testutils.MakeTestTransactionHandler(t, w, server.DisableSignatureVerification(), server.WithCORS())
client := &http.Client{}
req, err := http.NewRequest(http.MethodPost, txh.MakeHTTPURL("query/http/endpoints"), nil)
@@ -244,16 +244,16 @@ func TestHandleTransactionWithNoSignatureVerification(t *testing.T) {
endpoint := "move"
url := "tx/game/" + endpoint
w := ecs.NewTestWorld(t)
- sendTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult](endpoint)
- assert.NilError(t, w.RegisterTransactions(sendTx))
+ sendTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult](endpoint)
+ assert.NilError(t, w.RegisterMessages(sendTx))
count := 0
w.AddSystem(func(wCtx ecs.WorldContext) error {
txs := sendTx.In(wCtx)
assert.Equal(t, 1, len(txs))
tx := txs[0]
- assert.Equal(t, tx.Value.From, "me")
- assert.Equal(t, tx.Value.To, "you")
- assert.Equal(t, tx.Value.Amount, uint64(420))
+ assert.Equal(t, tx.Msg.From, "me")
+ assert.Equal(t, tx.Msg.To, "you")
+ assert.Equal(t, tx.Msg.Amount, uint64(420))
count++
return nil
})
@@ -302,8 +302,8 @@ func (garbageStructBeta) Name() string { return "beta" }
func TestHandleSwaggerServer(t *testing.T) {
w := ecs.NewTestWorld(t)
- sendTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("send-energy")
- assert.NilError(t, w.RegisterTransactions(sendTx))
+ sendTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("send-energy")
+ assert.NilError(t, w.RegisterMessages(sendTx))
w.AddSystem(func(ecs.WorldContext) error {
return nil
})
@@ -318,17 +318,17 @@ func TestHandleSwaggerServer(t *testing.T) {
_, err = component.CreateMany(wCtx, bothCount, garbageStructAlpha{}, garbageStructBeta{})
assert.NilError(t, err)
- // Queue up a CreatePersonaTx
+ // Queue up a CreatePersona
personaTag := "foobar"
signerAddress := "xyzzy"
- ecs.CreatePersonaTx.AddToQueue(w, ecs.CreatePersonaTransaction{
+ ecs.CreatePersonaMsg.AddToQueue(w, ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: signerAddress,
})
authorizedPersonaAddress := ecs.AuthorizePersonaAddress{
Address: signerAddress,
}
- ecs.AuthorizePersonaAddressTx.AddToQueue(w, authorizedPersonaAddress, &sign.Transaction{PersonaTag: personaTag})
+ ecs.AuthorizePersonaAddressMsg.AddToQueue(w, authorizedPersonaAddress, &sign.Transaction{PersonaTag: personaTag})
// PersonaTag registration doesn't take place until the relevant system is run during a game tick.
// create readers
@@ -495,15 +495,15 @@ func TestHandleWrappedTransactionWithNoSignatureVerification(t *testing.T) {
url := fmt.Sprintf("tx/game/%s", endpoint)
count := 0
w := ecs.NewTestWorld(t)
- sendTx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult](endpoint)
- assert.NilError(t, w.RegisterTransactions(sendTx))
+ sendTx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult](endpoint)
+ assert.NilError(t, w.RegisterMessages(sendTx))
w.AddSystem(func(wCtx ecs.WorldContext) error {
txs := sendTx.In(wCtx)
assert.Equal(t, 1, len(txs))
tx := txs[0]
- assert.Equal(t, tx.Value.From, "me")
- assert.Equal(t, tx.Value.To, "you")
- assert.Equal(t, tx.Value.Amount, uint64(420))
+ assert.Equal(t, tx.Msg.From, "me")
+ assert.Equal(t, tx.Msg.To, "you")
+ assert.Equal(t, tx.Msg.Amount, uint64(420))
count++
return nil
})
@@ -539,8 +539,8 @@ func TestHandleWrappedTransactionWithNoSignatureVerification(t *testing.T) {
func TestCanCreateAndVerifyPersonaSigner(t *testing.T) {
urlSet := []string{"tx/persona/create-persona", "query/persona/signer"}
world := ecs.NewTestWorld(t)
- tx := ecs.NewTransactionType[SendEnergyTx, SendEnergyTxResult]("some_tx")
- assert.NilError(t, world.RegisterTransactions(tx))
+ tx := ecs.NewMessageType[SendEnergyTx, SendEnergyTxResult]("some_tx")
+ assert.NilError(t, world.RegisterMessages(tx))
assert.NilError(t, world.LoadGameState())
assert.NilError(t, world.Tick(context.Background()))
txh := testutils.MakeTestTransactionHandler(t, world)
@@ -550,7 +550,7 @@ func TestCanCreateAndVerifyPersonaSigner(t *testing.T) {
assert.NilError(t, err)
signerAddr := crypto.PubkeyToAddress(privateKey.PublicKey).Hex()
- createPersonaTx := ecs.CreatePersonaTransaction{
+ createPersonaTx := ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: signerAddr,
}
@@ -618,7 +618,7 @@ func TestSigVerificationChecksNamespace(t *testing.T) {
personaTag := "some_dude"
signerAddr := crypto.PubkeyToAddress(privateKey.PublicKey).Hex()
- createPersonaTx := ecs.CreatePersonaTransaction{
+ createPersonaTx := ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: signerAddr,
}
@@ -656,7 +656,7 @@ func TestSigVerificationChecksNonce(t *testing.T) {
signerAddr := crypto.PubkeyToAddress(privateKey.PublicKey).Hex()
namespace := world.Namespace().String()
- createPersonaTx := ecs.CreatePersonaTransaction{
+ createPersonaTx := ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: signerAddr,
}
@@ -901,17 +901,17 @@ func TestCanGetTransactionReceiptsSwagger(t *testing.T) {
type ErrRequest struct{}
type ErrReply struct{}
- incTx := ecs.NewTransactionType[IncRequest, IncReply]("increment")
- dupeTx := ecs.NewTransactionType[DupeRequest, DupeReply]("duplicate")
- errTx := ecs.NewTransactionType[ErrRequest, ErrReply]("error")
+ incTx := ecs.NewMessageType[IncRequest, IncReply]("increment")
+ dupeTx := ecs.NewMessageType[DupeRequest, DupeReply]("duplicate")
+ errTx := ecs.NewMessageType[ErrRequest, ErrReply]("error")
world := ecs.NewTestWorld(t)
- assert.NilError(t, world.RegisterTransactions(incTx, dupeTx, errTx))
+ assert.NilError(t, world.RegisterMessages(incTx, dupeTx, errTx))
// System to handle incrementing numbers
world.AddSystem(func(wCtx ecs.WorldContext) error {
for _, tx := range incTx.In(wCtx) {
- incTx.SetResult(wCtx, tx.TxHash, IncReply{
- Number: tx.Value.Number + 1,
+ incTx.SetResult(wCtx, tx.Hash, IncReply{
+ Number: tx.Msg.Number + 1,
})
}
return nil
@@ -919,8 +919,8 @@ func TestCanGetTransactionReceiptsSwagger(t *testing.T) {
// System to handle duplicating strings
world.AddSystem(func(wCtx ecs.WorldContext) error {
for _, tx := range dupeTx.In(wCtx) {
- dupeTx.SetResult(wCtx, tx.TxHash, DupeReply{
- Str: tx.Value.Str + tx.Value.Str,
+ dupeTx.SetResult(wCtx, tx.Hash, DupeReply{
+ Str: tx.Msg.Str + tx.Msg.Str,
})
}
return nil
@@ -929,8 +929,8 @@ func TestCanGetTransactionReceiptsSwagger(t *testing.T) {
// System to handle error production
world.AddSystem(func(wCtx ecs.WorldContext) error {
for _, tx := range errTx.In(wCtx) {
- errTx.AddError(wCtx, tx.TxHash, wantError)
- errTx.AddError(wCtx, tx.TxHash, wantError)
+ errTx.AddError(wCtx, tx.Hash, wantError)
+ errTx.AddError(wCtx, tx.Hash, wantError)
}
return nil
})
@@ -1029,8 +1029,8 @@ func TestTransactionIDIsReturned(t *testing.T) {
urls := swaggerUrls
type MoveTx struct{}
world := ecs.NewTestWorld(t)
- moveTx := ecs.NewTransactionType[MoveTx, MoveTx]("move")
- assert.NilError(t, world.RegisterTransactions(moveTx))
+ moveTx := ecs.NewMessageType[MoveTx, MoveTx]("move")
+ assert.NilError(t, world.RegisterMessages(moveTx))
assert.NilError(t, world.LoadGameState())
ctx := context.Background()
// Preemptive tick so the tick isn't the zero value
@@ -1044,7 +1044,7 @@ func TestTransactionIDIsReturned(t *testing.T) {
namespace := world.Namespace().String()
nonce := uint64(99)
- createPersonaTx := ecs.CreatePersonaTransaction{
+ createPersonaTx := ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: signerAddr,
}
@@ -1115,8 +1115,8 @@ func TestTransactionsSubmittedToChain(t *testing.T) {
Direction string
}
world := ecs.NewTestWorld(t)
- moveTx := ecs.NewTransactionType[MoveTx, MoveTx]("move")
- assert.NilError(t, world.RegisterTransactions(moveTx))
+ moveTx := ecs.NewMessageType[MoveTx, MoveTx]("move")
+ assert.NilError(t, world.RegisterMessages(moveTx))
assert.NilError(t, world.LoadGameState())
adapter := adapterMock{}
txh := testutils.MakeTestTransactionHandler(t, world, server.WithAdapter(&adapter),
@@ -1127,7 +1127,7 @@ func TestTransactionsSubmittedToChain(t *testing.T) {
personaTag := "clifford_the_big_red_dog"
signerAddr := crypto.PubkeyToAddress(privateKey.PublicKey).Hex()
sigPayload, err := sign.NewSystemTransaction(privateKey, world.Namespace().String(), 1,
- ecs.CreatePersonaTransaction{
+ ecs.CreatePersona{
PersonaTag: personaTag,
SignerAddress: signerAddr,
})
@@ -1163,8 +1163,8 @@ func TestTransactionNotSubmittedWhenRecovering(t *testing.T) {
err := world.RecoverFromChain(context.Background())
assert.NilError(t, err)
}()
- moveTx := ecs.NewTransactionType[MoveTx, MoveTx]("move")
- err := world.RegisterTransactions(moveTx)
+ moveTx := ecs.NewMessageType[MoveTx, MoveTx]("move")
+ err := world.RegisterMessages(moveTx)
assert.NilError(t, err)
assert.NilError(t, world.LoadGameState())
txh := testutils.MakeTestTransactionHandler(t, world, server.WithAdapter(&adapter),
diff --git a/cardinal/server/tx.go b/cardinal/server/tx.go
index 2ab73f60a..f5323cc73 100644
--- a/cardinal/server/tx.go
+++ b/cardinal/server/tx.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"net/http"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/middleware"
@@ -12,11 +13,10 @@ import (
"github.com/rs/zerolog/log"
"pkg.world.dev/world-engine/cardinal/ecs"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
"pkg.world.dev/world-engine/sign"
)
-func (handler *Handler) processTransaction(tx transaction.ITransaction, payload []byte, sp *sign.Transaction,
+func (handler *Handler) processTransaction(tx message.Message, payload []byte, sp *sign.Transaction,
) (*TransactionReply, error) {
txVal, err := tx.Decode(payload)
if err != nil {
@@ -25,8 +25,8 @@ func (handler *Handler) processTransaction(tx transaction.ITransaction, payload
return handler.submitTransaction(txVal, tx, sp)
}
-func getTxFromParams(pathParam string, params interface{}, txNameToTx map[string]transaction.ITransaction,
-) (transaction.ITransaction, error) {
+func getTxFromParams(pathParam string, params interface{}, txNameToTx map[string]message.Message,
+) (message.Message, error) {
mappedParams, ok := params.(map[string]interface{})
if !ok {
return nil, errors.New("params not readable")
@@ -71,12 +71,12 @@ func (handler *Handler) getBodyAndSigFromParams(
// register transaction handlers on swagger server.
func (handler *Handler) registerTxHandlerSwagger(api *untyped.API) error {
world := handler.w
- txs, err := world.ListTransactions()
+ txs, err := world.ListMessages()
if err != nil {
return err
}
- txNameToTx := make(map[string]transaction.ITransaction)
+ txNameToTx := make(map[string]message.Message)
for _, tx := range txs {
txNameToTx[tx.Name()] = tx
}
@@ -102,7 +102,7 @@ func (handler *Handler) registerTxHandlerSwagger(api *untyped.API) error {
return nil, err
}
- txReply, err := handler.generateCreatePersonaResponseFromPayload(payload, sp, ecs.CreatePersonaTx)
+ txReply, err := handler.generateCreatePersonaResponseFromPayload(payload, sp, ecs.CreatePersonaMsg)
if err != nil {
return nil, err
}
@@ -116,7 +116,7 @@ func (handler *Handler) registerTxHandlerSwagger(api *untyped.API) error {
}
// submitTransaction submits a transaction to the game world, as well as the blockchain.
-func (handler *Handler) submitTransaction(txVal any, tx transaction.ITransaction, sp *sign.Transaction,
+func (handler *Handler) submitTransaction(txVal any, tx message.Message, sp *sign.Transaction,
) (*TransactionReply, error) {
log.Debug().Msgf("submitting transaction %d: %v", tx.ID(), txVal)
tick, txHash := handler.w.AddTransaction(tx.ID(), txVal, sp)
diff --git a/cardinal/server/utils.go b/cardinal/server/utils.go
index d3ad9975d..d56a8ce25 100644
--- a/cardinal/server/utils.go
+++ b/cardinal/server/utils.go
@@ -26,11 +26,11 @@ func decode[T any](buf []byte) (T, error) {
}
func getSignerAddressFromPayload(sp sign.Transaction) (string, error) {
- createPersonaTx, err := decode[ecs.CreatePersonaTransaction](sp.Body)
+ msg, err := decode[ecs.CreatePersona](sp.Body)
if err != nil {
return "", err
}
- return createPersonaTx.SignerAddress, nil
+ return msg.SignerAddress, nil
}
func (handler *Handler) verifySignature(sp *sign.Transaction, isSystemTransaction bool,
diff --git a/cardinal/testing.go b/cardinal/testing.go
index 862939699..4896261fa 100644
--- a/cardinal/testing.go
+++ b/cardinal/testing.go
@@ -19,8 +19,8 @@ func (w *World) TestingGetTransactionReceiptsForTick(tick uint64) ([]Receipt, er
// The following type and function are exported temporarily pending a refactor of
// how Persona works with the different components of Cardinal.
-type CreatePersonaTransaction = ecs.CreatePersonaTransaction
+type CreatePersonaTransaction = ecs.CreatePersona
func (w *World) TestingAddCreatePersonaTxToQueue(data CreatePersonaTransaction) {
- ecs.CreatePersonaTx.AddToQueue(w.implWorld, data)
+ ecs.CreatePersonaMsg.AddToQueue(w.implWorld, data)
}
diff --git a/cardinal/testutils/test_utils.go b/cardinal/testutils/test_utils.go
index d291cd9e9..8d781f692 100644
--- a/cardinal/testutils/test_utils.go
+++ b/cardinal/testutils/test_utils.go
@@ -160,13 +160,13 @@ func UniqueSignature() *sign.Transaction {
func AddTransactionToWorldByAnyTransaction(
world *cardinal.World,
- cardinalTx cardinal.AnyTransaction,
+ cardinalTx cardinal.AnyMessage,
value any,
tx *sign.Transaction) {
worldCtx := WorldToWorldContext(world)
ecsWorld := cardinal.TestingWorldContextToECSWorld(worldCtx)
- txs, err := ecsWorld.ListTransactions()
+ txs, err := ecsWorld.ListMessages()
if err != nil {
panic(err)
}
diff --git a/cardinal/transaction.go b/cardinal/transaction.go
deleted file mode 100644
index f4da15063..000000000
--- a/cardinal/transaction.go
+++ /dev/null
@@ -1,105 +0,0 @@
-package cardinal
-
-import (
- "pkg.world.dev/world-engine/cardinal/ecs"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
- "pkg.world.dev/world-engine/sign"
-)
-
-// AnyTransaction is implemented by the return value of NewTransactionType and is used in RegisterTransactions; any
-// transaction created by NewTransactionType can be registered with a World object via RegisterTransactions.
-type AnyTransaction interface {
- Convert() transaction.ITransaction
-}
-
-// TxData represents a single transaction.
-type TxData[T any] struct {
- impl ecs.TxData[T]
-}
-
-// TransactionType represents a type of transaction that can be executed on the World object. The Msg struct represents
-// the input for a specific transaction, and the Result struct represents the result of processing the transaction.
-type TransactionType[Msg, Result any] struct {
- impl *ecs.TransactionType[Msg, Result]
-}
-
-// NewTransactionType creates a new instance of a TransactionType.
-func NewTransactionType[Msg, Result any](name string) *TransactionType[Msg, Result] {
- return &TransactionType[Msg, Result]{
- impl: ecs.NewTransactionType[Msg, Result](name),
- }
-}
-
-// NewTransactionTypeWithEVMSupport creates a new instance of a TransactionType, with EVM transactions enabled.
-// This allows this transaction to be sent from EVM smart contracts on the EVM base shard.
-func NewTransactionTypeWithEVMSupport[Msg, Result any](name string) *TransactionType[Msg, Result] {
- return &TransactionType[Msg, Result]{
- impl: ecs.NewTransactionType[Msg, Result](name, ecs.WithTxEVMSupport[Msg, Result]),
- }
-}
-
-// AddToQueue is not meant to be used in production whatsoever, it is exposed here for usage in tests.
-func (t *TransactionType[Msg, Result]) AddToQueue(world *World, data Msg, sigs ...*sign.Transaction) TxHash {
- txHash := t.impl.AddToQueue(world.implWorld, data, sigs...)
- return txHash
-}
-
-// AddError adds the given error to the transaction identified by the given hash. Multiple errors can be
-// added to the same transaction hash.
-func (t *TransactionType[Msg, Result]) AddError(wCtx WorldContext, hash TxHash, err error) {
- t.impl.AddError(wCtx.getECSWorldContext(), hash, err)
-}
-
-// SetResult sets the result of the transaction identified by the given hash. Only one result may be associated
-// with a transaction hash, so calling this multiple times will clobber previously set results.
-func (t *TransactionType[Msg, Result]) SetResult(wCtx WorldContext, hash TxHash, result Result) {
- t.impl.SetResult(wCtx.getECSWorldContext(), hash, result)
-}
-
-// GetReceipt returns the result (if any) and errors (if any) associated with the given hash. If false is returned,
-// the hash is not recognized, so the returned result and errors will be empty.
-func (t *TransactionType[Msg, Result]) GetReceipt(wCtx WorldContext, hash TxHash) (Result, []error, bool) {
- return t.impl.GetReceipt(wCtx.getECSWorldContext(), hash)
-}
-
-func (t *TransactionType[Msg, Result]) ForEach(wCtx WorldContext, fn func(TxData[Msg]) (Result, error)) {
- adapterFn := func(ecsTxData ecs.TxData[Msg]) (Result, error) {
- adaptedTx := TxData[Msg]{impl: ecsTxData}
- return fn(adaptedTx)
- }
- t.impl.ForEach(wCtx.getECSWorldContext(), adapterFn)
-}
-
-// In returns the transactions in the given transaction queue that match this transaction's type.
-func (t *TransactionType[Msg, Result]) In(wCtx WorldContext) []TxData[Msg] {
- ecsTxData := t.impl.In(wCtx.getECSWorldContext())
- out := make([]TxData[Msg], 0, len(ecsTxData))
- for _, tx := range ecsTxData {
- out = append(out, TxData[Msg]{
- impl: tx,
- })
- }
- return out
-}
-
-// Convert implements the AnyTransactionType interface which allows a TransactionType to be registered
-// with a World via RegisterTransactions.
-func (t *TransactionType[Msg, Result]) Convert() transaction.ITransaction {
- return t.impl
-}
-
-// Hash returns the hash of a specific transaction, which is used to associated results and errors with a specific
-// transaction.
-func (t *TxData[T]) Hash() TxHash {
- return t.impl.TxHash
-}
-
-// Value returns the input value of a transaction.
-func (t *TxData[T]) Value() T {
- return t.impl.Value
-}
-
-// Sig returns the signature that was used to sign this transaction.
-func (t *TxData[T]) Sig() *sign.Transaction {
- return t.impl.Sig
-}
diff --git a/cardinal/util.go b/cardinal/util.go
index 123ea9acf..aa43a4d27 100644
--- a/cardinal/util.go
+++ b/cardinal/util.go
@@ -2,12 +2,12 @@ package cardinal
import (
"pkg.world.dev/world-engine/cardinal/ecs"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"pkg.world.dev/world-engine/cardinal/server"
)
-func toITransactionType(ins []AnyTransaction) []transaction.ITransaction {
- out := make([]transaction.ITransaction, 0, len(ins))
+func toMessageType(ins []AnyMessage) []message.Message {
+ out := make([]message.Message, 0, len(ins))
for _, t := range ins {
out = append(out, t.Convert())
}
diff --git a/cardinal/world.go b/cardinal/world.go
index 5f9b4378a..ba68a6a63 100644
--- a/cardinal/world.go
+++ b/cardinal/world.go
@@ -6,6 +6,7 @@ import (
"os"
"os/signal"
"path/filepath"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
"reflect"
"runtime"
"sync/atomic"
@@ -20,7 +21,6 @@ import (
"pkg.world.dev/world-engine/cardinal/ecs/entity"
"pkg.world.dev/world-engine/cardinal/ecs/receipt"
"pkg.world.dev/world-engine/cardinal/ecs/storage"
- "pkg.world.dev/world-engine/cardinal/ecs/transaction"
"pkg.world.dev/world-engine/cardinal/events"
"pkg.world.dev/world-engine/cardinal/evm"
"pkg.world.dev/world-engine/cardinal/server"
@@ -43,7 +43,7 @@ type (
// EntityID represents a single entity in the World. An EntityID is tied to
// one or more components.
EntityID = entity.ID
- TxHash = transaction.TxHash
+ TxHash = message.TxHash
Receipt = receipt.Receipt
// System is a function that process the transaction in the given transaction queue.
@@ -171,8 +171,8 @@ func (w *World) handleShutdown() {
}
// StartGame starts running the world game loop. Each time a message arrives on the tickChannel, a world tick is
-// attempted. In addition, an HTTP server (listening on the given port) is created so that game transactions can be sent
-// to this world. After StartGame is called, RegisterComponent, RegisterTransactions, RegisterQueries, and AddSystem may
+// attempted. In addition, an HTTP server (listening on the given port) is created so that game messages can be sent
+// to this world. After StartGame is called, RegisterComponent, RegisterMessages, RegisterQueries, and AddSystem may
// not be called. If StartGame doesn't encounter any errors, it will block forever, running the server and ticking
// the game in the background.
func (w *World) StartGame() error {
@@ -197,7 +197,7 @@ func (w *World) StartGame() error {
if !errors.Is(err, evm.ErrNoEVMTypes) {
return err
}
- w.implWorld.Logger.Debug().Msg("no EVM transactions or queries specified. EVM server will not run")
+ w.implWorld.Logger.Debug().Msg("no EVM messages or queries specified. EVM server will not run")
} else {
w.implWorld.Logger.Debug().Msg("running world with EVM server")
err = w.evmServer.Serve()
@@ -265,10 +265,10 @@ func RegisterComponent[T metadata.Component](world *World) error {
return ecs.RegisterComponent[T](world.implWorld)
}
-// RegisterTransactions adds the given transactions to the game world. HTTP endpoints to queue up/execute these
-// transaction will automatically be created when StartGame is called. This Register method must only be called once.
-func RegisterTransactions(w *World, txs ...AnyTransaction) error {
- return w.implWorld.RegisterTransactions(toITransactionType(txs)...)
+// RegisterMessages adds the given messages to the game world. HTTP endpoints to queue up/execute these
+// messages will automatically be created when StartGame is called. This Register method must only be called once.
+func RegisterMessages(w *World, msgs ...AnyMessage) error {
+ return w.implWorld.RegisterMessages(toMessageType(msgs)...)
}
// RegisterQueries adds the given query capabilities to the game world. HTTP endpoints to use these queries
diff --git a/chain/proto/proto_generate.sh b/chain/proto/proto_generate.sh
index 01507a015..37416d96a 100755
--- a/chain/proto/proto_generate.sh
+++ b/chain/proto/proto_generate.sh
@@ -43,7 +43,6 @@ for dir in $proto_dirs; do
done
done
-# move proto files to the right places
cp -r pkg.world.dev/world-engine/chain/* ../
rm -rf pkg.world.dev
diff --git a/docs/pages/Cardinal/API-Reference/Events.mdx b/docs/pages/Cardinal/API-Reference/Events.mdx
index ad9429cc8..8300fb754 100644
--- a/docs/pages/Cardinal/API-Reference/Events.mdx
+++ b/docs/pages/Cardinal/API-Reference/Events.mdx
@@ -14,12 +14,12 @@ func exampleSystem(ctx cardinal.WorldContext) {
## Emit Events
-The `EmitEvent` method on `cardinal.WorldContext` will emit event to all clients under the subject "event".
+The `EmitEvent` method on `cardinal.WorldContext` will emit events to all clients under the subject "event".
To see how to receive notifications go here: https://heroiclabs.com/docs/nakama/concepts/notifications/#receive-notifications (Unity)
```go
-func (wCtx *worldContext) EmitEvent(event string)
+func (wCtx *WorldContext) EmitEvent(event string)
```
### Parameters
diff --git a/docs/pages/Cardinal/API-Reference/Transactions.mdx b/docs/pages/Cardinal/API-Reference/Messages.mdx
similarity index 51%
rename from docs/pages/Cardinal/API-Reference/Transactions.mdx
rename to docs/pages/Cardinal/API-Reference/Messages.mdx
index 9ab911589..236aea2a3 100644
--- a/docs/pages/Cardinal/API-Reference/Transactions.mdx
+++ b/docs/pages/Cardinal/API-Reference/Messages.mdx
@@ -1,114 +1,107 @@
-
import { Callout } from 'nextra/components'
import Link from 'next/link'
-# Transactions
+# Messages
-Transactions enable Cardinal to handle state mutating requests in systems.
+Messages enable Cardinal to handle state mutating requests in systems.
```go
-package tx
+package msg
import "pkg.world.dev/world-engine/cardinal"
-// AttackMsg is the input for the Attack transaction.
-type AttackMsg struct {
+// AttackInput is the input for the Attack message.
+type AttackInput struct {
TargetID uint64
}
-// AttackResult is the result of the Attack transaction.
+// AttackResult is the result of the Attack message.
type AttackResult struct {
Success bool
}
-// AttackTx is an attack transaction.
-var AttackTx = cardinal.NewTransactionType[AttackMsg, AttackResult](
- "attack",
-)
+// Attack is an attack message.
+var Attack = cardinal.NewMessageType[AttackInput, AttackResult]("attack")
```
-## NewTransactionType
+## NewMessageType
-`NewTransactionType` creates a new `TransactionType`. `TransactionType`s wrap around a `Msg` and `Result` type. The `Msg` specifies the input for a transaction and the `Result` represents the result of the transaction's execution.
+`NewMessageType` creates a new `MessageType`. `MessageType`s wrap around an `Input` and `Result` type. The `Input` specifies the input for a message and the `Result` represents the result of the message's execution.
```go
-func NewTransactionType[Msg, Result any](
- name string,
-) *TransactionType[Msg, Result]
+func NewMessageType[Input, Result any](name string) *MessageType[Input, Result]
```
### Type Parameters
| Type Parameter | Type | Description |
|----------------|------|-------------------------------------------------|
-| Msg | any | The input type of the transaction. |
-| Result | any | The result type of the transaction. |
+| Input | any | The input type of the message. |
+| Result | any | The result type of the message. |
### Parameters
| Parameter | Type | Description |
|-----------|---------------------------------------|-----------------------------------------------------|
-| name | string | The name of the transaction.|
+| name | string | The name of the message.|
### Return Value
-| Type | Description |
-|----------------------|---------------------------------------------------|
-| *TransactionType[Msg, Result] | A pointer to a new instance of TransactionType[Msg, Result]. |
+| Type | Description |
+|-----------------------|---------------------------------------------------|
+| *MessageType[Msg, Result] | A pointer to a new instance of MessageType[Msg, Result]. |
-## NewTransactionTypeWithEVMSupport
+## NewMessageTypeWithEVMSupport
-`NewTransactionTypeWithEVMSupport` creates a new `TransactionType` with EVM support. This adds additional configuration to the transaction which enables it to handle requests originating from EVM smart contracts.
+`NewMessageTypeWithEVMSupport` creates a new `MessageType` with EVM support. This adds additional configuration to the message which enables it to handle requests originating from EVM smart contracts.
- Not all Go types are supported when using EVM supported transactions. Read More
+ Not all Go types are supported when using EVM supported messages. Read More
```go
-func NewTransactionTypeWithEVMSupport[Msg, Result any](
- name string,
-) *TransactionType[Msg, Result]
+func NewMessageTypeWithEVMSupport[Msg, Result any](name string) *MessageType[Msg, Result]
```
### Type Parameters
| Type Parameter | Type | Description |
|----------------|------|-------------------------------------------------|
-| Msg | any | The input type of the transaction. |
-| Result | any | The result type of the transaction. |
+| Input | any | The input type of the message. |
+| Result | any | The result type of the message. |
### Parameters
| Parameter | Type | Description |
|-----------|---------------------------------------|-----------------------------------------------------|
-| name | string | The name of the transaction. |
+| name | string | The name of the message. |
### Return Value
| Type | Description |
|----------------------|---------------------------------------------------|
-| *TransactionType[Msg, Result] | A pointer to a new instance of TransactionType[Msg, Result]. |
+| *MessageType[Input, Result] | A pointer to a new instance of MessageType[Input, Result]. |
## Methods
### AddError
-`AddError` adds an error to a specific transaction that signifies an issue has occurred with the transaction's execution.
+`AddError` adds an error to a specific message that signifies an issue has occurred with the message's execution.
```go
-func (t *TransactionType[Msg, Result]) AddError(world *World, hash TxHash, err error)
+func (t *MessageType[Msg, Result]) AddError(world *World, hash TxHash, err error)
```
#### Example
```go
-AttackTx.AddError(
+Attack.AddError(
w,
txHash,
- fmt.Errorf("player does with id %d does not exist", txID),
+ errors.New("attack failed"),
)
```
@@ -117,15 +110,15 @@ AttackTx.AddError(
| Parameter | Type | Description |
|-------------|----------------------|-------------------------------------------------------|
| world | *World | A pointer to a World instance. |
-| hash | TxHash | The hash of the transaction. |
-| err | error | The error to be associated with the transaction. |
+| hash | TxHash | The hash of the transaction data. |
+| err | error | The error to be associated with the message. |
### SetResult
-`SetResult` sets the result for a transaction's execution. `SetResult` requires the transaction type's output data structure for the result data.
+`SetResult` sets the result for a message's execution. `SetResult` requires the message type's output data structure for the result data.
```go
-func (t *TransactionType[Msg, Result]) SetResult(
+func (t *MessageType[Input, Result]) SetResult(
world *World,
hash TxHash,
result Result,
@@ -135,7 +128,7 @@ func (t *TransactionType[Msg, Result]) SetResult(
#### Example
```go
-AttackTx.SetResult(w, txHash, AttackResult{Success: true})
+Attack.SetResult(w, txHash, AttackResult{Success: true})
```
#### Parameters
@@ -143,24 +136,21 @@ AttackTx.SetResult(w, txHash, AttackResult{Success: true})
| Parameter | Type | Description |
|-------------|----------------------|-------------------------------------------------------|
| world | *World | A pointer to a World instance. |
-| hash | TxHash | The hash of the transaction. |
-| result | Result | The result to be associated with the transaction. |
+| hash | TxHash | The hash of the transaction data. |
+| result | Result | The result to be associated with the message. |
### GetReceipt
-`GetReceipt` gets the result and errors, if any, associated with a specific transaction.
+`GetReceipt` gets the result and errors, if any, associated with a specific message type.
```go
-func (t *TransactionType[Msg, Result]) GetReceipt(
- world *World,
- hash TxHash,
-) (r Result, errs []error, ok bool)
+func (t *MessageType[Msg, Result]) GetReceipt(world *World, hash TxHash) (r Result, errs []error, ok bool)
```
#### Example
```go
-result, errs, ok := AttackTx.GetReceipt(w, txHash)
+result, errs, ok := Attack.GetReceipt(w, txHash)
```
#### Parameters
@@ -168,24 +158,22 @@ result, errs, ok := AttackTx.GetReceipt(w, txHash)
| Parameter | Type | Description |
|-------------|----------------------|-----------------------------------------------------|
| world | *World | A pointer to a World instance. |
-| hash | TxHash | The hash of the transaction. |
+| hash | TxHash | The hash of the transaction data. |
#### Return Values
| Type | Description |
|--------------------|-----------------------------------------------------------------|
-| Result | The result of the transaction associated with the transaction hash. |
-| []error | Any errors that may have occurred with the transaction associated with the transaction hash. |
-| bool | A boolean indicating if a receipt was found for the transaction associated with the transaction hash. |
+| Result | The result of the message associated with the transaction hash. |
+| []error | Any errors that may have occurred with the message associated with the transaction hash. |
+| bool | A boolean indicating if a receipt was found for the message associated with the transaction hash. |
### In
-`In` is a method primarily used in Systems that retrieves all transactions of the `TransactionType` from the `World`'s `TransactionQueue`.
+`In` is a method primarily used in Systems that retrieves all messages of the `MessageType` from the `World`'s `TransactionQueue`.
```go
-func (t *TransactionType[Msg, Result]) In(
- tq *TransactionQueue,
-) []TxData[In]
+func (t *MessageType[Msg, Result]) In(tq *TransactionQueue) []TxData[In]
```
#### Example
@@ -193,10 +181,10 @@ func (t *TransactionType[Msg, Result]) In(
```go
txs := AttackTx.In(tq)
for _, tx := range txs {
- // ... do something with each tx
- txVal := tx.Value()
+ // ... do something with each msg
+ msg := tx.Msg()
hash := tx.Hash()
- sig := tx.Sig()
+ txData := tx.Tx()
}
```
@@ -204,11 +192,11 @@ for _, tx := range txs {
| Parameter | Type | Description |
|-------------|----------------------|-------------------------------------------------------|
-| tq | *TransactionQueue | A pointer to a TransactionQueue containing transactions. |
+| tq | *TransactionQueue | A pointer to a TransactionQueue containing transaction data and messages. |
#### Return Value
| Type | Description |
|--------------------|-----------------------------------------------------------------|
-| []TxData[Msg] | A slice of TxData - containing TxHash, Msg value, and Signature.|
+| []TxData[Msg] | A slice of TxData - containing Transaction data and Message value.|
diff --git a/docs/pages/Cardinal/API-Reference/Systems.mdx b/docs/pages/Cardinal/API-Reference/Systems.mdx
index b556c4a33..5da9908ce 100644
--- a/docs/pages/Cardinal/API-Reference/Systems.mdx
+++ b/docs/pages/Cardinal/API-Reference/Systems.mdx
@@ -19,19 +19,19 @@ func AttackSystem(world *World, queue *TransactionQueue, logger *Logger) error {
txs := AttackTransaction.In(queue)
for _, tx := range txs {
// do something with each tx...
- msg := tx.Value()
+ msg := tx.Msg()
hash := tx.Hash()
- sig := tx.Sig()
+ txData := tx.Tx()
}
}
```
## TxData
```go
-type TxData[Msg any] struct {
- ID transaction.TxHash // unique transaction hash
- Value Msg // transaction input
- Sig *sign.Transaction // Transaction data (signature, hash, message data)
+type TxData[Input any] struct {
+ Hash message.TxHash // unique transaction hash
+ Msg Msg // transaction input
+ Tx *sign.Transaction // Transaction data (signature, hash, message data)
}
```
@@ -47,7 +47,7 @@ type Health struct {
var HealthComponent = cardinal.NewComponentType[Health]()
// define an attack transaction
-type AttackMsg struct {
+type AttackInput struct {
TargetPlayer uint64
Amount uint64
}
@@ -56,30 +56,30 @@ type AttackResult struct {
Success bool
}
-var AttackTx = cardinal.NewTransactionType[AttackMsg, AttackResult]("attack")
+var Attack = cardinal.NewMessageType[AttackInput, AttackResult]("attack")
// implement the system
func AttackSystem(world *cardinal.World, queue *cardinal.TransactionQueue, logger cardinal.Logger) error {
// get all attack transactions in the queue
- txs := AttackTx.In(queue)
+ txs := Attack.In(queue)
for _, tx := range txs {
// get the underlying attack tx struct
- atk := tx.Value()
+ msg := tx.Msg()
// update the component based on the attack
- err := HealthComponent.Update(world, entity.ID(atk.TargetPlayer), func(health Health) Health {
- health.Amount -= atk.Amount
+ err := HealthComponent.Update(world, entity.ID(msg.TargetPlayer), func(health Health) Health {
+ health.Amount -= msg.Amount
return health
})
// if an error occurred, set the result, and add the error to the transaction.
if err != nil {
- AttackTx.SetResult(world, tx.Hash(), AttackResult{Success: false})
- AttackTx.AddError(world, tx.Hash(), err)
+ Attack.SetResult(world, tx.Hash(), AttackResult{Success: false})
+ Attack.AddError(world, tx.Hash(), err)
continue
}
// set result for success case
- AttackTx.SetResult(world, tx.Hash(), AttackResult{Success: true})
+ Attack.SetResult(world, tx.Hash(), AttackResult{Success: true})
}
return nil
}
diff --git a/docs/pages/Cardinal/API-Reference/World.mdx b/docs/pages/Cardinal/API-Reference/World.mdx
index 668157eb4..a9f2337c2 100644
--- a/docs/pages/Cardinal/API-Reference/World.mdx
+++ b/docs/pages/Cardinal/API-Reference/World.mdx
@@ -2,7 +2,7 @@ import { Callout } from 'nextra/components'
# World
-The `World` object is the manager of everything happening in the game. It deals with registering components, systems, transactions, and queries, as well as ticking the game simulation forward. `World` objects use [Redis](https://redis.io/) to store the game's state.
+The `World` object is the manager of everything happening in the game. It deals with registering components, systems, messages, and queries, as well as ticking the game simulation forward. `World` objects use [Redis](https://redis.io/) to store the game's state.
```go
@@ -269,16 +269,16 @@ func main() {
|--------|-----------------------------------------------------------------------------|
| error | An error indicating any issues that occurred during the query registration. |
-### RegisterTransactions
+### RegisterMessages
-`RegisterTransactions` registers the transactions in the `World`. This allows transaction endpoints to be automatically generated.
+`RegisterMessages` registers messages in the `World`. This allows message endpoints to be automatically generated.
- `RegisterTransactions` can be only be called once. Subsequent calls to the method will return an error.
+ `RegisterMessages` can be only be called once. Subsequent calls to the method will return an error.
```go
-func (w *World) RegisterTransactions(txs ...AnyTransaction) error
+func (w *World) RegisterMessages(msgs ...AnyMessage) error
```
#### Example
@@ -288,15 +288,15 @@ package main
import (
"log"
- "github.com/my-username/my-world-engine-project/tx"
+ "github.com/my-username/my-world-engine-project/msg"
)
func main() {
// ... world setup ...
- err := world.RegisterTransactions(
- tx.MoveTx,
- tx.AttackTx,
+ err := world.RegisterMessages(
+ msg.Move,
+ msg.Attack,
)
if err != nil {
log.Fatal(err)
@@ -307,12 +307,12 @@ func main() {
#### Parameters
| Parameter | Type | Description |
|------------------|---------------------|----------------------------------------------------------------|
-| txs | ...AnyTransaction | Variadic parameter for ITransaction instances to be registered. |
+| msgs | ...AnyMessage | Variadic parameter for Message instances to be registered. |
#### Return Value
| Type | Description |
|--------|---------------------------------------------------------------------------|
-| error | An error indicating any issues that occurred during the transaction registration. |
+| error | An error indicating any issues that occurred during the message registration. |
### CreateMany
@@ -458,7 +458,7 @@ func main() {
### StartGame
-`StartGame` starts the game by loading any previously saved game state, spinning up the transaction/query handler, and starting the game ticks. This method blocks the main Go routine. If for whatever reason execution needs to continue after calling this method, it should be called in a separate go routine.
+`StartGame` starts the game by loading any previously saved game state, spinning up the message/query handler, and starting the game ticks. This method blocks the main Go routine. If for whatever reason execution needs to continue after calling this method, it should be called in a separate go routine.
```go
func (w *World) StartGame() error
diff --git a/docs/pages/Cardinal/API-Reference/_meta.json b/docs/pages/Cardinal/API-Reference/_meta.json
index b04e05a77..34c860d6c 100644
--- a/docs/pages/Cardinal/API-Reference/_meta.json
+++ b/docs/pages/Cardinal/API-Reference/_meta.json
@@ -3,7 +3,7 @@
},
"Systems":{
},
- "Transactions":{
+ "Messages":{
},
"Reads": {},
"World": {},
diff --git a/docs/pages/Cardinal/API-Reference/evm-support.mdx b/docs/pages/Cardinal/API-Reference/evm-support.mdx
index f56177034..371624740 100644
--- a/docs/pages/Cardinal/API-Reference/evm-support.mdx
+++ b/docs/pages/Cardinal/API-Reference/evm-support.mdx
@@ -2,11 +2,11 @@ import { Callout } from 'nextra/components'
# EVM Support
-Transactions and Reads can be sent from smart contracts in the EVM. This is by an opt-in basis, so you'll need to pass in the corresponding option when instantiating your transactions and reads to enable EVM support.
+Messages and Reads can be sent from smart contracts in the EVM. This is by an opt-in basis, so you'll need to use the EVM message/query constructors when instantiating your messages and queries to enable EVM support.
## Supported Types
-Below are the Go types available to use in struct fields when utilizing the `EVMSupport` options.
+Below are the Go types available to use in struct fields when utilizing using EVM supported messages and queries.
- []byte (resolves to `bytes` in ABI encoding)
- string
diff --git a/go.work.sum b/go.work.sum
index 73369cbdf..108bf38ec 100644
--- a/go.work.sum
+++ b/go.work.sum
@@ -4,6 +4,10 @@
4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU=
bitbucket.org/creachadair/shell v0.0.6 h1:reJflDbKqnlnqb4Oo2pQ1/BqmY/eCWcNGHrIUO8qIzc=
buf.build/gen/go/argus-labs/cardinal/grpc/go v1.2.0-20230419204405-6273c6504412.4/go.mod h1:P6Hq7NMh0HM0S0p13UMWB7aT1swECD7BXP8vgGIrxws=
+buf.build/gen/go/argus-labs/world-engine/grpc/go v1.3.0-20230808004839-11a21a99bf62.1 h1:KTKofmwG4LXiPZXN18ZFFEzc4kaaNs/1u4+6xBxmriY=
+buf.build/gen/go/argus-labs/world-engine/grpc/go v1.3.0-20230808004839-11a21a99bf62.1/go.mod h1:An45ezFccbEA0RBZH0YmSymWoANevLOQwdAHhcV7slE=
+buf.build/gen/go/argus-labs/world-engine/protocolbuffers/go v1.31.0-20230808004839-11a21a99bf62.1 h1:R3aZLWrmuvNk1OaRdbcTPyqvgv24u3d7porxedyV8XI=
+buf.build/gen/go/argus-labs/world-engine/protocolbuffers/go v1.31.0-20230808004839-11a21a99bf62.1/go.mod h1:znJrAqamygZMR7LrV3nDqY7HQcgUnFxDiqidxu1nh8A=
buf.build/gen/go/cosmos/cosmos-proto/grpc/go v1.2.0-20211202220400-1935555c206d.4/go.mod h1:4BLD3qB5/QzdNdFnviF26v7IPBEbVXhl717CSs/x1SE=
buf.build/gen/go/cosmos/cosmos-proto/grpc/go v1.3.0-20211202220400-1935555c206d.1 h1:lMoezaY7PUlR3DxGjRuUAzHQnnhwuaX21eJNURRCq9U=
buf.build/gen/go/cosmos/cosmos-proto/protocolbuffers/go v1.30.0-20211202220400-1935555c206d.1 h1:Kj8t58XPssDLZoHgrsQ1+0JuVLWY82LXfWCsD2vSq74=
@@ -237,6 +241,7 @@ cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6Esb
cloud.google.com/go/edgecontainer v1.1.1 h1:zhHWnLzg6AqzE+I3gzJqiIwHfjEBhWctNQEzqb+FaRo=
cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk=
cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0=
+cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
cloud.google.com/go/essentialcontacts v1.4.0 h1:b6csrQXCHKQmfo9h3dG/pHyoEh+fQG1Yg78a53LAviY=
cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M=
cloud.google.com/go/essentialcontacts v1.6.2 h1:OEJ0MLXXCW/tX1fkxzEZOsv/wRfyFsvDVNaHWBAvoV0=
@@ -824,6 +829,7 @@ github.com/celestiaorg/go-header v0.2.9/go.mod h1:i9OpY70+PJ1xPw1IgMfF0Pk6vBD6VW
github.com/celestiaorg/go-header v0.2.12/go.mod h1:NhiWq97NtAYyRBu8quzYOUghQULjgOzO2Ql0iVEFOf0=
github.com/celestiaorg/go-header v0.3.0/go.mod h1:H8xhnDLDLbkpwmWPhCaZyTnIV3dlVxBHPnxNXS2Qu6c=
github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
+github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4=
github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ=
github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To=
@@ -860,6 +866,8 @@ github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUK
github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA=
github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304=
github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk=
+github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b h1:ACGZRIr7HsgBKHsueQ1yM4WaVaXh21ynwqsF8M8tXhA=
github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195 h1:58f1tJ1ra+zFINPlwLWvQsR9CzAKt2e+EWV2yX9oXQ4=
github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
@@ -953,6 +961,7 @@ github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0=
github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI=
github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI=
github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
+github.com/deckarep/golang-set/v2 v2.2.0 h1:2pMQd3Soi6qfw7E5MMKaEh5W5ES18bW3AbFFnGl6LgQ=
github.com/deckarep/golang-set/v2 v2.2.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
github.com/decred/dcrd/lru v1.0.0 h1:Kbsb1SFDsIlaupWPwsPp+dkxiBY1frcS07PCPgotKz8=
@@ -1019,6 +1028,7 @@ github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.
github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM=
github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g=
github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY=
+github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
github.com/envoyproxy/protoc-gen-validate v0.10.0 h1:oIfnZFdC0YhpNNEX+SuIqko4cqqVZeN9IGTrhZje83Y=
github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8=
@@ -1142,6 +1152,7 @@ github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iauee
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8=
@@ -1225,6 +1236,7 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZ
github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec h1:lJwO/92dFXWeXOZdoGXgptLmNLwynMSHUmU6besqtiw=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -1278,12 +1290,14 @@ github.com/google/pprof v0.0.0-20221203041831-ce31453925ec/go.mod h1:dDKJzRmX4S3
github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=
github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
+github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc=
github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
github.com/google/safehtml v0.0.2 h1:ZOt2VXg4x24bW0m2jtzAOkhoXV0iM8vNKc0paByCZqM=
github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU=
github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE=
github.com/google/trillian v1.3.11 h1:pPzJPkK06mvXId1LHEAJxIegGgHzzp/FUnycPYfoCMI=
github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
+github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k=
github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
@@ -1291,6 +1305,7 @@ github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw=
+github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4=
github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI=
github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4=
@@ -1321,7 +1336,9 @@ github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJr
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
@@ -1749,6 +1766,7 @@ github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCE
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8=
github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M=
+github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
github.com/lyft/protoc-gen-star/v2 v2.0.1 h1:keaAo8hRuAT0O3DfJ/wM3rufbAjGeJ1lAtWZHDjKGB0=
github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o=
github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o=
@@ -1796,6 +1814,7 @@ github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0=
github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
+github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q=
github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
@@ -1949,6 +1968,8 @@ github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfad
github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=
+github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034=
+github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ=
github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w=
github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg=
github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU=
@@ -2254,9 +2275,11 @@ github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkC
github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk=
github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4=
github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
+github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA=
github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
+github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=
github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966 h1:j6JEOq5QWFker+d7mFQYOhjTZonQ7YkLTHm56dbn+yM=
@@ -2361,6 +2384,7 @@ github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3Ifn
github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI=
github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
+github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0=
@@ -2483,6 +2507,7 @@ golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeap
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4=
golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs=
@@ -2520,11 +2545,14 @@ golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
+golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
+golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU=
golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk=
golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU=
golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc=
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -2553,6 +2581,7 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
@@ -2564,6 +2593,7 @@ golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
+golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -2597,9 +2627,11 @@ google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
+google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o=
google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750=
google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
@@ -2716,8 +2748,12 @@ pkg.berachain.dev/polaris/eth v0.0.0-20230717165123-80a30c3435c3 h1:+3xS3Zlpm8wd
pkg.berachain.dev/polaris/eth v0.0.0-20230717165123-80a30c3435c3/go.mod h1:xNzoj0My9F53EHpKm4Z3qVkniWpq80XQLg6o+TY4jXk=
pkg.berachain.dev/polaris/eth v0.0.0-20230827184022-e3cec7a2c178 h1:DA/8zY2CSIvTteP5L1wxYT+8jjKaqVYGUe4sx9+uiOY=
pkg.berachain.dev/polaris/eth v0.0.0-20230827184022-e3cec7a2c178/go.mod h1:W6VZU0W9AFSeIfp53ST3HHJ85HbvQLctffW7Z9AaXN8=
+pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697 h1:d+w0G+qOE9s1tYNOdMDaOmNbUCcP0EjUeXXMFT5jg2M=
+pkg.berachain.dev/polaris/eth v0.0.0-20230830221145-a6c6454d3697/go.mod h1:Ry+Ldr32oNPMJVVfDCMYymqA2BlXsL5oyrZTVLxIT1A=
pkg.berachain.dev/polaris/lib v0.0.0-20230717165123-80a30c3435c3 h1:Lgswicb60tdTLZak6ud5DxelnTnO9DlJfDqxMHFKIyk=
pkg.berachain.dev/polaris/lib v0.0.0-20230717165123-80a30c3435c3/go.mod h1:JZtndZdLnGavd5b+IiHYew5nMAOoL968nE2cTxk+dEI=
+pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697 h1:wgvK5vI7UlQYBs3kB2wZBgsxUjYK1lCV0LFJ4YF2u/4=
+pkg.berachain.dev/polaris/lib v0.0.0-20230830221145-a6c6454d3697/go.mod h1:+3IkGuGJ/kV2d90ImTqPSrI9g+M6nV0eX1MAmtIfFZA=
pkg.world.dev/world-engine/sign v0.1.5-alpha/go.mod h1:JcKXhdeYvCPRAgsCUSFEDcAJgf67VgMWWrA2Y2VZJSg=
pkg.world.dev/world-engine/sign v0.1.11-alpha/go.mod h1:MOwYe8JeB8qAXZnp+jlJnAjYgfzru/S6pllQCrNoMZw=
rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
diff --git a/internal/e2e/e2e_test.go b/internal/e2e/e2e_test.go
index 44c120ca1..7610f4461 100644
--- a/internal/e2e/e2e_test.go
+++ b/internal/e2e/e2e_test.go
@@ -12,7 +12,7 @@ const (
adminNakamaID = "00000000-0000-0000-0000-000000000000"
)
-type ClaimPersonaTx struct {
+type ClaimPersona struct {
PersonaTag string `json:"personaTag"`
}
@@ -34,13 +34,13 @@ func TestTransactionStoredOnChain(t *testing.T) {
err := c.registerDevice(user, adminNakamaID)
assert.NilError(t, err)
- res, err := c.rpc("nakama/claim-persona", ClaimPersonaTx{PersonaTag: persona})
+ res, err := c.rpc("nakama/claim-persona", ClaimPersona{PersonaTag: persona})
assert.NilError(t, err)
assert.Equal(t, 200, res.StatusCode, "claim persona failed with code %d: body: %v", res.StatusCode, res.Body)
time.Sleep(time.Second * 3)
- res, err = c.rpc("nakama/show-persona", ClaimPersonaTx{PersonaTag: persona})
+ res, err = c.rpc("nakama/show-persona", ClaimPersona{PersonaTag: persona})
assert.NilError(t, err)
assert.Equal(t, 200, res.StatusCode, "show persona failed with code %d: body: %v", res.StatusCode, res.Body)
diff --git a/internal/e2e/tester/cardinal/go.mod b/internal/e2e/tester/cardinal/go.mod
index 9c9324ce1..8069e46cb 100644
--- a/internal/e2e/tester/cardinal/go.mod
+++ b/internal/e2e/tester/cardinal/go.mod
@@ -13,11 +13,9 @@ replace (
github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
)
-require pkg.world.dev/world-engine/cardinal v0.1.47-alpha.0.20231027233932-e499c1f032cd
+require pkg.world.dev/world-engine/cardinal v0.1.47-alpha.0.20231106232923-a4d2b1526011
require (
- buf.build/gen/go/argus-labs/world-engine/grpc/go v1.3.0-20230808004839-11a21a99bf62.1 // indirect
- buf.build/gen/go/argus-labs/world-engine/protocolbuffers/go v1.31.0-20230808004839-11a21a99bf62.1 // indirect
cosmossdk.io/api v0.7.0 // indirect
cosmossdk.io/collections v0.4.0 // indirect
cosmossdk.io/core v0.10.0 // indirect
@@ -135,8 +133,8 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.1 // indirect
- pkg.world.dev/world-engine/chain v0.1.11-alpha // indirect
- pkg.world.dev/world-engine/rift v0.0.4 // indirect
- pkg.world.dev/world-engine/sign v0.1.9-alpha // indirect
+ pkg.world.dev/world-engine/chain v0.1.12-alpha // indirect
+ pkg.world.dev/world-engine/rift v0.0.5 // indirect
+ pkg.world.dev/world-engine/sign v0.1.10-alpha // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
diff --git a/internal/e2e/tester/cardinal/go.sum b/internal/e2e/tester/cardinal/go.sum
index 0e44247b8..b980b4f47 100644
--- a/internal/e2e/tester/cardinal/go.sum
+++ b/internal/e2e/tester/cardinal/go.sum
@@ -1,394 +1,5 @@
-buf.build/gen/go/argus-labs/world-engine/grpc/go v1.3.0-20230808004839-11a21a99bf62.1 h1:KTKofmwG4LXiPZXN18ZFFEzc4kaaNs/1u4+6xBxmriY=
-buf.build/gen/go/argus-labs/world-engine/grpc/go v1.3.0-20230808004839-11a21a99bf62.1/go.mod h1:An45ezFccbEA0RBZH0YmSymWoANevLOQwdAHhcV7slE=
-buf.build/gen/go/argus-labs/world-engine/protocolbuffers/go v1.28.1-20230808004839-11a21a99bf62.4/go.mod h1:4MaNgQtb43WIueUejxPifpusXSZttMJwX4g7Baqz9Y0=
-buf.build/gen/go/argus-labs/world-engine/protocolbuffers/go v1.31.0-20230808004839-11a21a99bf62.1 h1:R3aZLWrmuvNk1OaRdbcTPyqvgv24u3d7porxedyV8XI=
-buf.build/gen/go/argus-labs/world-engine/protocolbuffers/go v1.31.0-20230808004839-11a21a99bf62.1/go.mod h1:znJrAqamygZMR7LrV3nDqY7HQcgUnFxDiqidxu1nh8A=
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.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.44.3/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.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
-cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
-cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
-cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
-cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
-cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
-cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
-cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
-cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
-cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
-cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
-cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
-cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
-cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
-cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
-cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
-cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
-cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
-cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
-cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
-cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
-cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
-cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
-cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=
-cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
-cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
-cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
-cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=
-cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
-cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
-cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
-cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=
-cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=
-cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=
-cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=
-cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=
-cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=
-cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=
-cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=
-cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=
-cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=
-cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=
-cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=
-cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=
-cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=
-cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=
-cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=
-cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=
-cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=
-cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=
-cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
-cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
-cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
-cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
-cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
-cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=
-cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=
-cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=
-cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=
-cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=
-cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=
-cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=
-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/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
-cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
-cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=
-cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
-cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
-cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
-cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=
-cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=
-cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=
-cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=
-cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=
-cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=
-cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=
-cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=
-cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=
-cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=
-cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=
-cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
-cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
-cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
-cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
-cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
-cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=
-cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
-cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
-cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
-cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
-cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
-cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
-cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
-cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
-cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
-cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=
-cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
-cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=
-cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
-cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
-cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
-cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
-cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
-cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
-cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=
-cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=
-cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
-cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
-cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
-cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=
-cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=
-cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=
-cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=
-cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=
-cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=
-cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=
-cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=
-cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=
-cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=
-cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=
-cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=
-cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=
-cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=
-cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=
-cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=
-cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=
-cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=
-cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=
-cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
-cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
-cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
-cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=
-cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=
-cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=
-cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=
-cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=
-cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=
-cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=
-cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=
-cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=
-cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=
-cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=
-cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=
-cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=
-cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=
-cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=
-cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
-cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
-cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
-cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
-cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
-cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
-cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
-cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=
-cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=
-cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=
-cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
-cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
-cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
-cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
-cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=
-cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=
-cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=
-cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=
-cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=
-cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=
-cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=
-cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=
-cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=
-cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=
-cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=
-cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=
-cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=
-cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
-cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
-cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
-cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
-cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
-cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
-cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
-cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=
-cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
-cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
-cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
-cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=
-cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
-cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
-cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
-cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
-cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
-cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
-cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
-cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
-cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
-cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
-cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
-cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
-cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
-cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
-cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
-cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
-cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
-cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
-cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
-cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
-cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
-cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=
-cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=
-cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=
-cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=
-cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=
-cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=
-cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=
-cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=
-cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
-cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
-cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
-cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
-cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=
-cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=
-cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=
-cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=
-cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=
-cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=
-cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=
-cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=
-cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=
-cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=
-cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=
-cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=
-cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=
-cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=
-cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=
-cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=
-cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=
-cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=
-cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=
-cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=
-cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=
-cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=
-cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=
-cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=
-cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=
-cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=
-cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=
-cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=
-cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=
-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/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=
-cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
-cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
-cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
-cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
-cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
-cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=
-cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=
-cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=
-cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=
-cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=
-cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=
-cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=
-cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=
-cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=
-cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=
-cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=
-cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=
-cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=
-cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=
-cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=
-cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
-cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
-cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=
-cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=
-cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=
-cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=
-cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=
-cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=
-cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=
-cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=
-cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=
-cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=
-cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=
-cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=
-cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=
-cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=
-cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=
-cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=
-cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=
-cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=
-cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=
-cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=
-cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=
-cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=
-cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=
-cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=
-cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=
-cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=
-cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=
-cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=
-cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=
-cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=
-cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=
-cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
-cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
-cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
-cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
-cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
-cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
-cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
-cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=
-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=
-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
-cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
-cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
-cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
-cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
-cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
-cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
-cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
-cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=
-cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=
-cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=
-cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=
-cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=
-cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=
-cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=
-cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
-cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
-cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
-cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=
-cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=
-cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
-cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=
-cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=
-cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=
-cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=
-cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=
-cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=
-cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=
-cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
-cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
-cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
-cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=
-cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
-cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
-cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
-cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
-cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=
-cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=
-cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=
-cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=
-cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=
-cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=
-cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
-cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cosmossdk.io/api v0.7.0 h1:QsEMIWuv9xWDbF2HZnW4Lpu1/SejCztPu0LQx7t6MN4=
cosmossdk.io/api v0.7.0/go.mod h1:kJFAEMLN57y0viszHDPLMmieF0471o5QAwwApa+270M=
cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s=
@@ -407,7 +18,6 @@ cosmossdk.io/store v1.0.0-rc.0 h1:9DwOjuUYxDtYxn/REkTxGQAmxlIGfRroB35MQ8TrxF4=
cosmossdk.io/store v1.0.0-rc.0/go.mod h1:FtBDOJmwtOZfmKKF65bKZbTYgS3bDNjjo3nP76dAegk=
cosmossdk.io/x/tx v0.9.1 h1:9pmmXA9Vs4qdouOFnzhsdsff2mif0f0kylMq5xTGhRI=
cosmossdk.io/x/tx v0.9.1/go.mod h1:/YFGTXG6+kyihd8YbfuJiXHV4R/mIMm2uvVzo80CIhA=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek=
filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs=
@@ -415,7 +25,6 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN
github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o=
github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
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/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
@@ -483,8 +92,6 @@ github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEe
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
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=
@@ -497,17 +104,6 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8=
@@ -552,8 +148,8 @@ github.com/cosmos/ledger-cosmos-go v0.13.0/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
-github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
+github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
+github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -592,16 +188,7 @@ github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
-github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
-github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
-github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
-github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=
@@ -625,9 +212,6 @@ github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
-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-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/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-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU=
@@ -713,22 +297,11 @@ github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x
github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0=
github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
-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/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/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/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -736,19 +309,14 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a
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.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
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.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -756,8 +324,6 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
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/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/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM=
@@ -766,16 +332,8 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a
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.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/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.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
-github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
@@ -784,49 +342,14 @@ 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/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us=
github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20=
-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/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo=
-github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE=
+github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/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/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
-github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
-github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
-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/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
-github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
-github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
-github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
-github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
-github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=
-github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
-github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
-github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
-github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
+github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
@@ -839,8 +362,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDa
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU=
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
@@ -855,14 +376,13 @@ github.com/hashicorp/go-metrics v0.5.1 h1:rfPwUqFU6uZXNvGl4hzjY8LEBsqFVU4si1H9/H
github.com/hashicorp/go-metrics v0.5.1/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
-github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk=
-github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0=
+github.com/hashicorp/go-plugin v1.5.0 h1:g6Lj3USwF5LaB8HlvCxPjN2X4nFE08ko2BJNVpl7TIE=
+github.com/hashicorp/go-plugin v1.5.0/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4=
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
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 v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4=
@@ -884,11 +404,8 @@ github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY=
github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
-github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ=
github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -925,8 +442,6 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
@@ -944,7 +459,6 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk=
-github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
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.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -985,8 +499,6 @@ github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCy
github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4=
github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE=
github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg=
-github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
-github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
@@ -1072,8 +584,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
-github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
+github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI=
+github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ=
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/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
@@ -1101,8 +613,6 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
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/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -1180,9 +690,6 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
-github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY=
github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
@@ -1208,12 +715,10 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
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.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
@@ -1240,12 +745,8 @@ github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE=
github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo=
@@ -1259,13 +760,6 @@ go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4x
go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW8Y=
go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
-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.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
@@ -1274,8 +768,6 @@ go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26
go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
-go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI=
go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU=
go.uber.org/fx v1.20.0 h1:ZMC/pnRvhsthOZh9MZjMq5U8Or3mA9zBSPaLnzs3ihQ=
@@ -1288,58 +780,20 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
-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-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
-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/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-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.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1350,84 +804,20 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r
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-20190628185345-da137c7871d7/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-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
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-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
-golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/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.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
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/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
-golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
-golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
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=
@@ -1435,17 +825,10 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20200625203802-6e8e738ad208/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-20201207232520-09787c993a3a/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.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
-golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
+golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
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=
@@ -1453,358 +836,71 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/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-20190531175056-4c3a928424d2/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-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/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-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/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-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/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-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211210111614-af8b64212486/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-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-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-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/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-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-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-20191130070609-6e064ea0cf2d/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-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
-golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
-golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
+golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc=
+golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
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=
-golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o=
gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=
-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/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
-google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
-google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
-google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
-google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
-google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
-google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
-google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
-google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
-google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
-google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
-google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
-google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
-google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
-google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
-google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
-google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
-google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
-google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
-google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
-google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
-google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
-google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
-google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
-google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g=
-google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
-google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
-google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI=
-google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
-google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
-google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
-google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08=
-google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
-google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=
-google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0=
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/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.7/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-20180831171423-11092d34479b/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-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-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
-google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
-google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
-google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
-google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
-google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
-google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
-google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE=
-google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc=
-google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw=
-google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
-google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
-google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U=
-google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
-google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
-google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
-google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
-google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=
-google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA=
google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI=
@@ -1812,61 +908,21 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.
google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA=
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.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
-google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
-google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
-google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
-google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
-google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
-google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ=
google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
-google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
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.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
@@ -1900,28 +956,20 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
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.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI=
lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw=
pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
-pkg.world.dev/world-engine/cardinal v0.1.47-alpha.0.20231027233932-e499c1f032cd h1:D7K+PQdN2fMfxN0Rc4IY3aHwNLkGCt8WeBK/TWZ3y8E=
-pkg.world.dev/world-engine/cardinal v0.1.47-alpha.0.20231027233932-e499c1f032cd/go.mod h1:MBrEr9e5+LiMqMuwzo+VTEnaEk4zD5YkBCQoP1NsrRM=
-pkg.world.dev/world-engine/chain v0.1.11-alpha h1:a+a+eZUIG2XuO+PL5WBr+IgQZoGRnm8plk5bP1KKoR4=
-pkg.world.dev/world-engine/chain v0.1.11-alpha/go.mod h1:qpm1QXHj2RyXIiwkEolaZMMqeNVcMX+hH4OQ9nE0/5M=
-pkg.world.dev/world-engine/rift v0.0.4 h1:c7lyRK/V/vZUNVQGhkcYuXDR/3vNN+zGpDWpFh7Igq4=
-pkg.world.dev/world-engine/rift v0.0.4/go.mod h1:RHasfPKE1pDLm7cJ/AjqbP2O3m/8ldkybHyUjmTSEAw=
-pkg.world.dev/world-engine/sign v0.1.9-alpha h1:aNF6SqB8btPtZHYo/39t4e+mCmNQHc1qW80veEZo+MI=
-pkg.world.dev/world-engine/sign v0.1.9-alpha/go.mod h1:Fd+52+2VelCuzi8wbU14/eWGyYL6+suibX3sIx8MSAM=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+pkg.world.dev/world-engine/cardinal v0.1.47-alpha.0.20231106232923-a4d2b1526011 h1:auc6ySDEyJw3/lJ/1xQG9eONb5UIr7JFYIBh3ZxPDos=
+pkg.world.dev/world-engine/cardinal v0.1.47-alpha.0.20231106232923-a4d2b1526011/go.mod h1:jMiUj/LsaacvhhbrZzJjLpOc1w7zOw0DqZsArA068dY=
+pkg.world.dev/world-engine/chain v0.1.12-alpha h1:5iHYDJoJKYJ6kC/gxhC+UIOqeQMq+zvP7yBx2q4t+GU=
+pkg.world.dev/world-engine/chain v0.1.12-alpha/go.mod h1:1b70VXbEdiX10x/SShSAm65Rg2VF7TkluAMFPVEaSXs=
+pkg.world.dev/world-engine/rift v0.0.5 h1:nRoIIyilio+i5jqflroKcwlLDUa7+8FpWkLI3+za/Cg=
+pkg.world.dev/world-engine/rift v0.0.5/go.mod h1:SAo0qDI8C2yFC2WOD3t35H+h9j+RXdap9hDBzw21CWs=
+pkg.world.dev/world-engine/sign v0.1.10-alpha h1:UEkMfsPrhtncVI9n5UWsUSwE0sVwGLZ7b1Go6Zk9Shw=
+pkg.world.dev/world-engine/sign v0.1.10-alpha/go.mod h1:MOwYe8JeB8qAXZnp+jlJnAjYgfzru/S6pllQCrNoMZw=
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/internal/e2e/tester/cardinal/main.go b/internal/e2e/tester/cardinal/main.go
index f5045e597..d03052446 100644
--- a/internal/e2e/tester/cardinal/main.go
+++ b/internal/e2e/tester/cardinal/main.go
@@ -2,13 +2,13 @@ package main
import (
"errors"
+ "github.com/argus-labs/world-engine/example/tester/msg"
"log"
"os"
"github.com/argus-labs/world-engine/example/tester/comp"
"github.com/argus-labs/world-engine/example/tester/query"
"github.com/argus-labs/world-engine/example/tester/sys"
- "github.com/argus-labs/world-engine/example/tester/tx"
"pkg.world.dev/world-engine/cardinal"
"pkg.world.dev/world-engine/cardinal/shard"
)
@@ -37,7 +37,7 @@ func main() {
if err != nil {
log.Fatal(err)
}
- err = cardinal.RegisterTransactions(world, tx.JoinTx, tx.MoveTx)
+ err = cardinal.RegisterMessages(world, msg.JoinMsg, msg.MoveMsg)
if err != nil {
log.Fatal(err)
}
diff --git a/internal/e2e/tester/cardinal/tx/join.go b/internal/e2e/tester/cardinal/msg/join.go
similarity index 51%
rename from internal/e2e/tester/cardinal/tx/join.go
rename to internal/e2e/tester/cardinal/msg/join.go
index 8bd61b20e..5f18aa97b 100644
--- a/internal/e2e/tester/cardinal/tx/join.go
+++ b/internal/e2e/tester/cardinal/msg/join.go
@@ -1,4 +1,4 @@
-package tx
+package msg
import (
"pkg.world.dev/world-engine/cardinal"
@@ -9,4 +9,4 @@ type JoinInput struct {
type JoinOutput struct{}
-var JoinTx = cardinal.NewTransactionTypeWithEVMSupport[JoinInput, JoinOutput]("join")
+var JoinMsg = cardinal.NewMessageTypeWithEVMSupport[JoinInput, JoinOutput]("join")
diff --git a/internal/e2e/tester/cardinal/tx/move.go b/internal/e2e/tester/cardinal/msg/move.go
similarity index 61%
rename from internal/e2e/tester/cardinal/tx/move.go
rename to internal/e2e/tester/cardinal/msg/move.go
index 7b334421c..f469a3881 100644
--- a/internal/e2e/tester/cardinal/tx/move.go
+++ b/internal/e2e/tester/cardinal/msg/move.go
@@ -1,4 +1,4 @@
-package tx
+package msg
import (
"pkg.world.dev/world-engine/cardinal"
@@ -12,4 +12,4 @@ type MoveOutput struct {
X, Y int64
}
-var MoveTx = cardinal.NewTransactionTypeWithEVMSupport[MoveInput, MoveOutput]("move")
+var MoveMsg = cardinal.NewMessageTypeWithEVMSupport[MoveInput, MoveOutput]("move")
diff --git a/internal/e2e/tester/cardinal/sys/join.go b/internal/e2e/tester/cardinal/sys/join.go
index 54ea800c5..35efb88b0 100644
--- a/internal/e2e/tester/cardinal/sys/join.go
+++ b/internal/e2e/tester/cardinal/sys/join.go
@@ -2,9 +2,9 @@ package sys
import (
"fmt"
+ "github.com/argus-labs/world-engine/example/tester/msg"
"github.com/argus-labs/world-engine/example/tester/comp"
- "github.com/argus-labs/world-engine/example/tester/tx"
"pkg.world.dev/world-engine/cardinal"
"pkg.world.dev/world-engine/cardinal/ecs/entity"
)
@@ -13,23 +13,23 @@ var PlayerEntityID = make(map[string]entity.ID)
func Join(ctx cardinal.WorldContext) error {
logger := ctx.Logger()
- tx.JoinTx.ForEach(ctx, func(jtx cardinal.TxData[tx.JoinInput]) (tx.JoinOutput, error) {
- logger.Info().Msgf("got join transaction from: %s", jtx.Sig().PersonaTag)
+ msg.JoinMsg.ForEach(ctx, func(jtx cardinal.TxData[msg.JoinInput]) (msg.JoinOutput, error) {
+ logger.Info().Msgf("got join transaction from: %s", jtx.Tx().PersonaTag)
entityID, err := cardinal.Create(ctx, comp.Location{}, comp.Player{})
if err != nil {
- return tx.JoinOutput{}, err
+ return msg.JoinOutput{}, err
}
err = cardinal.UpdateComponent[comp.Player](ctx, entityID, func(c *comp.Player) *comp.Player {
- c.ID = jtx.Sig().PersonaTag
+ c.ID = jtx.Tx().PersonaTag
return c
})
if err != nil {
- return tx.JoinOutput{}, err
+ return msg.JoinOutput{}, err
}
- PlayerEntityID[jtx.Sig().PersonaTag] = entityID
- logger.Info().Msgf("player %s successfully joined", jtx.Sig().PersonaTag)
+ PlayerEntityID[jtx.Tx().PersonaTag] = entityID
+ logger.Info().Msgf("player %s successfully joined", jtx.Tx().PersonaTag)
ctx.EmitEvent(fmt.Sprintf("%d player created", entityID))
- return tx.JoinOutput{}, nil
+ return msg.JoinOutput{}, nil
})
return nil
}
diff --git a/internal/e2e/tester/cardinal/sys/move.go b/internal/e2e/tester/cardinal/sys/move.go
index 63649e193..b710bbbfa 100644
--- a/internal/e2e/tester/cardinal/sys/move.go
+++ b/internal/e2e/tester/cardinal/sys/move.go
@@ -3,21 +3,21 @@ package sys
import (
"fmt"
"github.com/argus-labs/world-engine/example/tester/comp"
- "github.com/argus-labs/world-engine/example/tester/tx"
+ "github.com/argus-labs/world-engine/example/tester/msg"
"pkg.world.dev/world-engine/cardinal"
)
func Move(ctx cardinal.WorldContext) error {
logger := ctx.Logger()
- tx.MoveTx.ForEach(ctx, func(mtx cardinal.TxData[tx.MoveInput]) (tx.MoveOutput, error) {
- logger.Info().Msgf("got move transaction from: %s", mtx.Sig().PersonaTag)
- playerEntityID, ok := PlayerEntityID[mtx.Sig().PersonaTag]
+ msg.MoveMsg.ForEach(ctx, func(mtx cardinal.TxData[msg.MoveInput]) (msg.MoveOutput, error) {
+ logger.Info().Msgf("got move transaction from: %s", mtx.Tx().PersonaTag)
+ playerEntityID, ok := PlayerEntityID[mtx.Tx().PersonaTag]
if !ok {
- return tx.MoveOutput{}, fmt.Errorf("player %s has not joined yet", mtx.Sig().PersonaTag)
+ return msg.MoveOutput{}, fmt.Errorf("player %s has not joined yet", mtx.Tx().PersonaTag)
}
var resultingLoc comp.Location
err := cardinal.UpdateComponent[comp.Location](ctx, playerEntityID, func(location *comp.Location) *comp.Location {
- switch mtx.Value().Direction {
+ switch mtx.Msg().Direction {
case "up":
location.Y++
case "down":
@@ -31,10 +31,10 @@ func Move(ctx cardinal.WorldContext) error {
return location
})
if err != nil {
- return tx.MoveOutput{}, err
+ return msg.MoveOutput{}, err
}
- logger.Info().Msgf("player %s now at (%d, %d)", mtx.Sig().PersonaTag, resultingLoc.X, resultingLoc.Y)
- return tx.MoveOutput{X: resultingLoc.X, Y: resultingLoc.Y}, err
+ logger.Info().Msgf("player %s now at (%d, %d)", mtx.Tx().PersonaTag, resultingLoc.X, resultingLoc.Y)
+ return msg.MoveOutput{X: resultingLoc.X, Y: resultingLoc.Y}, err
})
return nil
}
From 6474b36d743e2157ed5e40d2c1bf626e49073973 Mon Sep 17 00:00:00 2001
From: anon <1806857+pyrofolium@users.noreply.github.com>
Date: Wed, 8 Nov 2023 14:48:21 -0800
Subject: [PATCH 3/4] feat(cardinal): create new init system. (#407)
---
cardinal/cardinal_test.go | 21 +++++++++++++--------
cardinal/ecs/world.go | 21 ++++++++++++++++++++-
cardinal/world.go | 11 +++++++----
3 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/cardinal/cardinal_test.go b/cardinal/cardinal_test.go
index 355c1f8f0..08d2d9886 100644
--- a/cardinal/cardinal_test.go
+++ b/cardinal/cardinal_test.go
@@ -32,10 +32,9 @@ func TestCanQueryInsideSystem(t *testing.T) {
world, doTick := testutils.MakeWorldAndTicker(t, cardinal.WithCORS())
assert.NilError(t, cardinal.RegisterComponent[Foo](world))
wantNumOfEntities := 10
- world.Init(func(worldCtx cardinal.WorldContext) {
- _, err := cardinal.CreateMany(worldCtx, wantNumOfEntities, Foo{})
- assert.NilError(t, err)
- })
+ wCtx := cardinal.TestingWorldToWorldContext(world)
+ _, err := cardinal.CreateMany(wCtx, wantNumOfEntities, Foo{})
+ assert.NilError(t, err)
gotNumOfEntities := 0
cardinal.RegisterSystems(world, func(worldCtx cardinal.WorldContext) error {
q, err := worldCtx.NewSearch(cardinal.Exact(Foo{}))
@@ -50,7 +49,7 @@ func TestCanQueryInsideSystem(t *testing.T) {
doTick()
assert.Equal(t, world.CurrentTick(), uint64(1))
- err := world.ShutDown()
+ err = world.ShutDown()
assert.Assert(t, err)
assert.Equal(t, gotNumOfEntities, wantNumOfEntities)
}
@@ -63,9 +62,12 @@ func TestShutdownViaSignal(t *testing.T) {
assert.NilError(t, cardinal.RegisterComponent[Foo](world))
assert.NilError(t, err)
wantNumOfEntities := 10
- world.Init(func(worldCtx cardinal.WorldContext) {
- _, err := cardinal.CreateMany(worldCtx, wantNumOfEntities, Foo{})
- assert.NilError(t, err)
+ world.Init(func(worldCtx cardinal.WorldContext) error {
+ _, err := cardinal.CreateMany(worldCtx, wantNumOfEntities/2, Foo{})
+ if err != nil {
+ return err
+ }
+ return nil
})
wg.Add(1)
go func() {
@@ -77,6 +79,9 @@ func TestShutdownViaSignal(t *testing.T) {
// wait until game loop is running
time.Sleep(500 * time.Millisecond)
}
+ wCtx := cardinal.TestingWorldToWorldContext(world)
+ _, err = cardinal.CreateMany(wCtx, wantNumOfEntities/2, Foo{})
+ assert.NilError(t, err)
// test CORS with cardinal
client := &http.Client{}
req, err := http.NewRequest(http.MethodPost, "http://localhost:4040/query/http/endpoints", nil)
diff --git a/cardinal/ecs/world.go b/cardinal/ecs/world.go
index db17f1136..b0c2a379d 100644
--- a/cardinal/ecs/world.go
+++ b/cardinal/ecs/world.go
@@ -6,14 +6,16 @@ import (
"errors"
"fmt"
"path/filepath"
- "pkg.world.dev/world-engine/cardinal/ecs/message"
"reflect"
"runtime"
"strconv"
"sync/atomic"
"time"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
+
"google.golang.org/protobuf/proto"
+
shardv1 "pkg.world.dev/world-engine/rift/shard/v1"
"github.com/rs/zerolog"
@@ -43,6 +45,8 @@ type World struct {
entityStore store.IManager
systems []System
systemLoggers []*ecslog.Logger
+ initSystem System
+ initSystemLogger *ecslog.Logger
systemNames []string
tick uint64
nameToComponent map[string]metadata.ComponentMetadata
@@ -141,6 +145,12 @@ func (w *World) AddSystemWithName(system System, functionName string) {
w.systems = append(w.systems, system)
}
+func (w *World) AddInitSystem(system System) {
+ logger := w.Logger.CreateSystemLogger("InitSystem")
+ w.initSystemLogger = &logger
+ w.initSystem = system
+}
+
func RegisterComponent[T metadata.Component](world *World) error {
if world.stateIsLoaded {
panic("cannot register components after loading game state")
@@ -250,6 +260,7 @@ func NewWorld(nonceStore storage.NonceStorage, entityStore store.IManager, opts
namespace: "world",
tick: 0,
systems: make([]System, 0),
+ initSystem: func(_ WorldContext) error { return nil },
nameToComponent: make(map[string]metadata.ComponentMetadata),
txQueue: message.NewTxQueue(),
Logger: logger,
@@ -342,6 +353,14 @@ func (w *World) Tick(_ context.Context) error {
return err
}
+ if w.CurrentTick() == 0 {
+ wCtx := NewWorldContextForTick(w, txQueue, w.initSystemLogger)
+ err := w.initSystem(wCtx)
+ if err != nil {
+ return err
+ }
+ }
+
for i, sys := range w.systems {
nameOfCurrentRunningSystem = w.systemNames[i]
wCtx := NewWorldContextForTick(w, txQueue, w.systemLoggers[i])
diff --git a/cardinal/world.go b/cardinal/world.go
index ba68a6a63..23685b6a9 100644
--- a/cardinal/world.go
+++ b/cardinal/world.go
@@ -6,13 +6,14 @@ import (
"os"
"os/signal"
"path/filepath"
- "pkg.world.dev/world-engine/cardinal/ecs/message"
"reflect"
"runtime"
"sync/atomic"
"syscall"
"time"
+ "pkg.world.dev/world-engine/cardinal/ecs/message"
+
"github.com/rs/zerolog/log"
"pkg.world.dev/world-engine/cardinal/ecs"
"pkg.world.dev/world-engine/cardinal/ecs/component"
@@ -285,7 +286,9 @@ func (w *World) Tick(ctx context.Context) error {
return w.implWorld.Tick(ctx)
}
-func (w *World) Init(fn func(WorldContext)) {
- ecsWorldCtx := ecs.NewWorldContext(w.implWorld)
- fn(&worldContext{implContext: ecsWorldCtx})
+// Init Registers a system that only runs once on a new game before tick 0.
+func (w *World) Init(system System) {
+ w.implWorld.AddInitSystem(func(ecsWctx ecs.WorldContext) error {
+ return system(&worldContext{implContext: ecsWctx})
+ })
}
From dee26ddc373a7b3491c725638f22f2bb028380b5 Mon Sep 17 00:00:00 2001
From: Tyler <48813565+technicallyty@users.noreply.github.com>
Date: Wed, 8 Nov 2023 18:14:04 -0800
Subject: [PATCH 4/4] feat(chain): implement x/namespace tx & query CLI
commands (WORLD-492, WORLD-495) (#401)
---
chain/app/config.go | 52 +++++-----
chain/config/config.go | 8 +-
chain/proto/namespace/module/v1/module.proto | 1 -
chain/scripts/start.sh | 2 +-
chain/x/namespace/cli/query/query.go | 79 ++++++++++++++
chain/x/namespace/cli/tx/tx.go | 102 +++++++++++++++++++
chain/x/namespace/keeper/keeper.go | 8 +-
chain/x/namespace/keeper/namespace_test.go | 2 +-
chain/x/namespace/module.go | 46 +++++----
chain/x/namespace/types/keys.go | 3 +
docker-compose.yml | 2 +-
11 files changed, 246 insertions(+), 59 deletions(-)
create mode 100644 chain/x/namespace/cli/query/query.go
create mode 100644 chain/x/namespace/cli/tx/tx.go
create mode 100644 chain/x/namespace/types/keys.go
diff --git a/chain/app/config.go b/chain/app/config.go
index 139696563..80cfa7088 100644
--- a/chain/app/config.go
+++ b/chain/app/config.go
@@ -46,9 +46,11 @@ import (
"os"
shardmodulev1 "pkg.world.dev/world-engine/chain/api/shard/module/v1"
"pkg.world.dev/world-engine/chain/shard"
- "pkg.world.dev/world-engine/chain/x/namespace"
shardmodule "pkg.world.dev/world-engine/chain/x/shard"
+ namespacemodule "pkg.world.dev/world-engine/chain/api/namespace/module/v1"
+ namespacetypes "pkg.world.dev/world-engine/chain/x/namespace/types"
+
"github.com/cosmos/cosmos-sdk/runtime"
"github.com/cosmos/cosmos-sdk/types/module"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
@@ -72,22 +74,21 @@ import (
evmmodulev1alpha1 "pkg.berachain.dev/polaris/cosmos/api/polaris/evm/module/v1alpha1"
evmtypes "pkg.berachain.dev/polaris/cosmos/x/evm/types"
- _ "cosmossdk.io/x/evidence" // import for side-effects
- _ "cosmossdk.io/x/upgrade" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/auth/vesting" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/authz/module" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/bank" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/consensus" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/crisis" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/distribution" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/mint" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/params" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/slashing" // import for side-effects
- _ "github.com/cosmos/cosmos-sdk/x/staking" // import for side-effects
- _ "pkg.berachain.dev/polaris/cosmos/x/evm" // import for side-effects
-
- namespacemodule "pkg.world.dev/world-engine/chain/api/namespace/module/v1"
+ _ "cosmossdk.io/x/evidence" // import for side effects
+ _ "cosmossdk.io/x/upgrade" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/auth/vesting" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/authz/module" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/bank" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/consensus" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/crisis" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/distribution" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/mint" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/params" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/slashing" // import for side effects
+ _ "github.com/cosmos/cosmos-sdk/x/staking" // import for side effects
+ _ "pkg.berachain.dev/polaris/cosmos/x/evm" // import for side effects
+ _ "pkg.world.dev/world-engine/chain/x/namespace" // import for side effects
)
var (
@@ -101,6 +102,7 @@ var (
{Account: govtypes.ModuleName, Permissions: []string{authtypes.Burner}},
{Account: evmtypes.ModuleName, Permissions: []string{authtypes.Minter, authtypes.Burner}},
{Account: shard.Name},
+ {Account: namespacetypes.ModuleName},
}
// blocked account addresses.
@@ -119,7 +121,7 @@ var (
//
//nolint:funlen
func MakeAppConfig(bech32prefix string) depinject.Config {
- namespaceAuth := os.Getenv("NAMESPACE_AUTHORITY_ADDR")
+ namespaceAuthAddr := os.Getenv("NAMESPACE_AUTHORITY_ADDR")
if bech32prefix == "" {
bech32prefix = "world"
}
@@ -177,7 +179,7 @@ func MakeAppConfig(bech32prefix string) depinject.Config {
vestingtypes.ModuleName,
consensustypes.ModuleName,
evmtypes.ModuleName,
- namespace.ModuleName,
+ namespacetypes.ModuleName,
shardmodule.ModuleName,
},
// When ExportGenesis is not specified, the export genesis module order
@@ -263,16 +265,16 @@ func MakeAppConfig(bech32prefix string) depinject.Config {
Name: evmtypes.ModuleName,
Config: appconfig.WrapAny(&evmmodulev1alpha1.Module{}),
},
- {
- Name: namespace.ModuleName,
- Config: appconfig.WrapAny(&namespacemodule.Module{
- Authority: namespaceAuth,
- }),
- },
{
Name: shardmodule.ModuleName,
Config: appconfig.WrapAny(&shardmodulev1.Module{}),
},
+ {
+ Name: namespacetypes.ModuleName,
+ Config: appconfig.WrapAny(&namespacemodule.Module{
+ Authority: namespaceAuthAddr,
+ }),
+ },
},
}),
depinject.Supply(
diff --git a/chain/config/config.go b/chain/config/config.go
index 0e1bba1e2..df59c0a15 100644
--- a/chain/config/config.go
+++ b/chain/config/config.go
@@ -9,8 +9,8 @@ type WorldEngineConfig struct {
// Bech32Prefix is the prefix that all accounts on the chain will have. (i.e. cosmos, akash, evmos...).
Bech32Prefix string `json:"bech32Prefix" yaml:"bech32Prefix"`
- // NamespaceAuthority is the address that will be able to update the shard namespace mapping.
- // If left blank, the governance module address will be used, and router namespaces will be updated via
- // chain governance.
- NamespaceAuthority string `json:"routerAuthority" yaml:"routerAuthority"`
+ // NamespaceAuthority is the address that will be able to update the game shard namespace mapping.
+ // If left blank, the governance module address will be used allowing namespaces will be updated via
+ // cosmos sdk governance module.
+ NamespaceAuthority string `json:"namespaceAuthority" yaml:"namespaceAuthority"`
}
diff --git a/chain/proto/namespace/module/v1/module.proto b/chain/proto/namespace/module/v1/module.proto
index 4b7cabe7b..7e7d0c11e 100644
--- a/chain/proto/namespace/module/v1/module.proto
+++ b/chain/proto/namespace/module/v1/module.proto
@@ -7,7 +7,6 @@ import "cosmos/app/v1alpha1/module.proto";
// Module is the config object of the namespace module.
message Module {
option (cosmos.app.v1alpha1.module) = {go_import: "pkg.world.dev/world-engine/chain/x/namespace"};
-
// authority defines the custom module authority. If not set, defaults to the governance module.
string authority = 1;
}
diff --git a/chain/scripts/start.sh b/chain/scripts/start.sh
index cbb05ede3..802ccda3e 100755
--- a/chain/scripts/start.sh
+++ b/chain/scripts/start.sh
@@ -46,4 +46,4 @@ done
echo "starting rollup..."
# Run the command with or without the --build flag based on the build_flag
-docker compose up $build_flag chain
+docker compose up $build_flag chain --exit-code-from celestia-devnet
diff --git a/chain/x/namespace/cli/query/query.go b/chain/x/namespace/cli/query/query.go
new file mode 100644
index 000000000..c541434fa
--- /dev/null
+++ b/chain/x/namespace/cli/query/query.go
@@ -0,0 +1,79 @@
+package query
+
+import (
+ "errors"
+ "fmt"
+ "github.com/cosmos/cosmos-sdk/client"
+ "github.com/cosmos/cosmos-sdk/version"
+ "github.com/spf13/cobra"
+ "pkg.world.dev/world-engine/chain/x/namespace/types"
+)
+
+func NewQueryCmd() *cobra.Command {
+ queryCmd := &cobra.Command{
+ Use: types.ModuleName,
+ Short: "Namespace query subcommands",
+ DisableFlagParsing: true,
+ SuggestionsMinimumDistance: 2, //nolint:gomnd // not needed
+ RunE: client.ValidateCmd,
+ }
+
+ queryCmd.AddCommand(
+ NewQueryNamespacesCmd(),
+ NewQueryAddressCmd(),
+ )
+ return queryCmd
+}
+
+func NewQueryNamespacesCmd() *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "list",
+ Short: "Return a list of all namespace:grpc address pairs",
+ Example: fmt.Sprintf("%s query namespace list", version.AppName),
+ Args: cobra.ExactArgs(0),
+ RunE: func(cmd *cobra.Command, args []string) error {
+ clientCtx, err := client.GetClientTxContext(cmd)
+ if err != nil {
+ return err
+ }
+ query := types.NamespacesRequest{}
+
+ queryClient := types.NewQueryServiceClient(clientCtx)
+ res, err := queryClient.Namespaces(cmd.Context(), &query)
+ if err != nil {
+ return err
+ }
+ return clientCtx.PrintProto(res)
+ },
+ }
+ return cmd
+}
+
+func NewQueryAddressCmd() *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "address [namespace]",
+ Short: "Return the address associated with a given namespace",
+ Example: fmt.Sprintf("%s query namespace address foobar", version.AppName),
+ Args: cobra.ExactArgs(1),
+ RunE: func(cmd *cobra.Command, args []string) error {
+ clientCtx, err := client.GetClientTxContext(cmd)
+ if err != nil {
+ return err
+ }
+
+ ns := args[0]
+ if ns == "" {
+ return errors.New("namespace is required")
+ }
+ query := types.AddressRequest{Namespace: ns}
+
+ queryClient := types.NewQueryServiceClient(clientCtx)
+ res, err := queryClient.Address(cmd.Context(), &query)
+ if err != nil {
+ return err
+ }
+ return clientCtx.PrintProto(res)
+ },
+ }
+ return cmd
+}
diff --git a/chain/x/namespace/cli/tx/tx.go b/chain/x/namespace/cli/tx/tx.go
new file mode 100644
index 000000000..eefa07108
--- /dev/null
+++ b/chain/x/namespace/cli/tx/tx.go
@@ -0,0 +1,102 @@
+package tx
+
+import (
+ "errors"
+ "fmt"
+ "github.com/cosmos/cosmos-sdk/client"
+ "github.com/cosmos/cosmos-sdk/client/flags"
+ "github.com/cosmos/cosmos-sdk/client/tx"
+ "github.com/cosmos/cosmos-sdk/version"
+ "github.com/spf13/cobra"
+ "net"
+ namespacetypes "pkg.world.dev/world-engine/chain/x/namespace/types"
+ "strings"
+)
+
+// NewTxCmd returns a root CLI command handler for all x/bank transaction commands.
+func NewTxCmd() *cobra.Command {
+ txCmd := &cobra.Command{
+ Use: namespacetypes.ModuleName,
+ Short: "Namespace transaction subcommands",
+ DisableFlagParsing: true,
+ SuggestionsMinimumDistance: 2, //nolint:gomnd // not needed.
+ RunE: client.ValidateCmd,
+ }
+
+ txCmd.AddCommand(
+ NewRegisterNamespaceCmd(),
+ )
+
+ return txCmd
+}
+
+// NewRegisterNamespaceCmd returns a CLI command handler for registering a namespace + game shard address pair.
+// The gRPC address is used for Router calls.
+func NewRegisterNamespaceCmd() *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "register [namespace] [gRPC address]",
+ Short: "Register a game shard's gRPC address",
+ Long: `Register a game shard's gRPC address, allowing for cross-shard communication from the EVM.'`,
+ Example: fmt.Sprintf("%s tx namespace register foobar api.cool.game:9601", version.AppName),
+ Args: cobra.ExactArgs(2), //nolint:gomnd // not needed
+ RunE: func(cmd *cobra.Command, args []string) error {
+ namespace := args[0]
+ grpcAddress := args[1]
+
+ if namespace == "" {
+ return errors.New("namespace is required")
+ }
+ if grpcAddress == "" {
+ return errors.New("gRPC address is required")
+ }
+
+ if !isValidGRPCAddress(grpcAddress) {
+ return errors.New("invalid gRPC address. please ensure format is `host:port_number`")
+ }
+
+ clientCtx, err := client.GetClientTxContext(cmd)
+ if err != nil {
+ return err
+ }
+
+ msg := namespacetypes.UpdateNamespaceRequest{
+ Authority: clientCtx.GetFromAddress().String(),
+ Namespace: &namespacetypes.Namespace{
+ ShardName: namespace,
+ ShardAddress: grpcAddress,
+ },
+ }
+
+ return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
+ },
+ }
+
+ flags.AddTxFlagsToCmd(cmd)
+
+ return cmd
+}
+
+func isValidGRPCAddress(address string) bool {
+ // Split the address into host and port
+ parts := strings.Split(address, ":")
+ if len(parts) != 2 { //nolint:gomnd // not needed here.
+ return false
+ }
+
+ // Check if the host is a valid IP address or hostname
+ host := parts[0]
+ if net.ParseIP(host) == nil {
+ // If it's not a valid IP, check if it's a valid hostname
+ if _, err := net.LookupHost(host); err != nil {
+ return false
+ }
+ }
+
+ // Check if the port is a valid number
+ port := parts[1]
+ if _, err := net.LookupPort("tcp", port); err != nil {
+ return false
+ }
+
+ return true
+}
diff --git a/chain/x/namespace/keeper/keeper.go b/chain/x/namespace/keeper/keeper.go
index 1f84d53e7..af1c79ec2 100644
--- a/chain/x/namespace/keeper/keeper.go
+++ b/chain/x/namespace/keeper/keeper.go
@@ -4,7 +4,7 @@ import (
storetypes "cosmossdk.io/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
- routertypes "pkg.world.dev/world-engine/chain/x/namespace/types"
+ namespacetypes "pkg.world.dev/world-engine/chain/x/namespace/types"
)
type Keeper struct {
@@ -20,13 +20,13 @@ func NewKeeper(storeKey *storetypes.KVStoreKey, auth string) *Keeper {
}
}
-func (k *Keeper) InitGenesis(ctx sdk.Context, gen *routertypes.Genesis) {
+func (k *Keeper) InitGenesis(ctx sdk.Context, gen *namespacetypes.Genesis) {
for _, ns := range gen.Namespaces {
k.setNamespace(ctx, ns)
}
}
-func (k *Keeper) ExportGenesis(ctx sdk.Context) *routertypes.Genesis {
+func (k *Keeper) ExportGenesis(ctx sdk.Context) *namespacetypes.Genesis {
nameSpaces := k.getAllNamespaces(ctx)
- return &routertypes.Genesis{Namespaces: nameSpaces}
+ return &namespacetypes.Genesis{Namespaces: nameSpaces}
}
diff --git a/chain/x/namespace/keeper/namespace_test.go b/chain/x/namespace/keeper/namespace_test.go
index f2bfc736f..c78edb282 100644
--- a/chain/x/namespace/keeper/namespace_test.go
+++ b/chain/x/namespace/keeper/namespace_test.go
@@ -38,7 +38,7 @@ func (s *TestSuite) SetupTest() {
s.addrs = simtestutil.CreateIncrementalAccounts(3)
s.authority = s.addrs[0]
s.encCfg = moduletestutil.MakeTestEncodingConfig(namespace.AppModuleBasic{})
- key := storetypes.NewKVStoreKey(namespace.ModuleName)
+ key := storetypes.NewKVStoreKey(namespacetypes.ModuleName)
testCtx := testutil.DefaultContextWithDB(s.T(), key, storetypes.NewTransientStoreKey("transient_test"))
s.ctx = testCtx.Ctx.WithHeaderInfo(header.Info{Time: time.Now().Round(0).UTC()})
diff --git a/chain/x/namespace/module.go b/chain/x/namespace/module.go
index 4034d79ac..72e23d9eb 100644
--- a/chain/x/namespace/module.go
+++ b/chain/x/namespace/module.go
@@ -4,6 +4,8 @@ import (
"context"
"encoding/json"
"fmt"
+ "pkg.world.dev/world-engine/chain/x/namespace/cli/query"
+ "pkg.world.dev/world-engine/chain/x/namespace/cli/tx"
abci "github.com/cometbft/cometbft/abci/types"
@@ -17,11 +19,10 @@ import (
"github.com/spf13/cobra"
"pkg.world.dev/world-engine/chain/x/namespace/keeper"
- routertypes "pkg.world.dev/world-engine/chain/x/namespace/types"
+ namespacetypes "pkg.world.dev/world-engine/chain/x/namespace/types"
)
const (
- ModuleName = "namespace"
ConsensusVersion = 1
)
@@ -29,70 +30,71 @@ var (
_ module.HasServices = AppModule{}
_ module.AppModuleBasic = AppModuleBasic{}
_ module.AppModuleGenesis = AppModule{}
+ _ module.HasGenesis = AppModule{}
)
// ==============================================================================
// AppModuleBasic
// ==============================================================================
-// AppModuleBasic defines the basic application module used by the router module.
+// AppModuleBasic defines the basic application module used by the module.
type AppModuleBasic struct{}
-// Name returns the router module's name.
+// Name returns the module's name.
func (AppModuleBasic) Name() string {
- return ModuleName
+ return namespacetypes.ModuleName
}
-// RegisterLegacyAminoCodec registers the router module's types on the given LegacyAmino codec.
+// RegisterLegacyAminoCodec registers the module's types on the given LegacyAmino codec.
func (AppModuleBasic) RegisterLegacyAminoCodec(_ *codec.LegacyAmino) {
// types.RegisterLegacyAminoCodec(cdc)
}
// RegisterInterfaces registers the module's interface types.
func (b AppModuleBasic) RegisterInterfaces(r codectypes.InterfaceRegistry) {
- routertypes.RegisterInterfaces(r)
+ namespacetypes.RegisterInterfaces(r)
}
-// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the router module.
+// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module.
func (AppModuleBasic) RegisterGRPCGatewayRoutes(ctx client.Context, mux *gwruntime.ServeMux) {
- err := routertypes.RegisterQueryServiceHandlerClient(
+ err := namespacetypes.RegisterQueryServiceHandlerClient(
context.Background(),
mux,
- routertypes.NewQueryServiceClient(ctx),
+ namespacetypes.NewQueryServiceClient(ctx),
)
if err != nil {
panic(err)
}
}
-// GetTxCmd returns no root tx command for the router module.
+// GetTxCmd returns no root tx command for the module.
func (AppModuleBasic) GetTxCmd() *cobra.Command {
- return nil
+ return tx.NewTxCmd()
}
-// GetQueryCmd returns the root query command for the router module.
+// GetQueryCmd returns the root query command for the module.
func (AppModuleBasic) GetQueryCmd() *cobra.Command {
- return nil
+ return query.NewQueryCmd()
}
// ==============================================================================
// AppModule
// ==============================================================================
-// AppModule implements an application module for the router module.
+// AppModule implements an application module for the module.
type AppModule struct {
AppModuleBasic
keeper *keeper.Keeper
}
func (am AppModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
- return cdc.MustMarshalJSON(routertypes.DefaultGenesis())
+ return cdc.MustMarshalJSON(namespacetypes.DefaultGenesis())
}
func (am AppModule) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error {
- var g routertypes.Genesis
+ var g namespacetypes.Genesis
if err := cdc.UnmarshalJSON(bz, &g); err != nil {
- return fmt.Errorf("failed to unmarshal %s genesis state: %w", ModuleName, err)
+ return fmt.Errorf("failed to unmarshal %s genesis state: %w", namespacetypes.ModuleName, err)
}
return g.Validate()
}
@@ -102,7 +104,7 @@ func (am AppModule) InitGenesis(
cdc codec.JSONCodec,
bz json.RawMessage,
) []abci.ValidatorUpdate {
- var g routertypes.Genesis
+ var g namespacetypes.Genesis
cdc.MustUnmarshalJSON(bz, &g)
am.keeper.InitGenesis(ctx, &g)
return []abci.ValidatorUpdate{}
@@ -129,14 +131,14 @@ func (am AppModule) IsOnePerModuleType() {}
// IsAppModule implements the appmodule.AppModule interface.
func (am AppModule) IsAppModule() {}
-// RegisterInvariants registers the router module invariants.
+// RegisterInvariants registers the module invariants.
func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {}
// RegisterServices registers a gRPC query service to respond to the
// module-specific gRPC queries.
func (am AppModule) RegisterServices(cfg module.Configurator) {
- routertypes.RegisterMsgServer(cfg.MsgServer(), am.keeper)
- routertypes.RegisterQueryServiceServer(cfg.QueryServer(), am.keeper)
+ namespacetypes.RegisterMsgServer(cfg.MsgServer(), am.keeper)
+ namespacetypes.RegisterQueryServiceServer(cfg.QueryServer(), am.keeper)
}
// ConsensusVersion implements AppModule/ConsensusVersion.
diff --git a/chain/x/namespace/types/keys.go b/chain/x/namespace/types/keys.go
new file mode 100644
index 000000000..c2abc3d09
--- /dev/null
+++ b/chain/x/namespace/types/keys.go
@@ -0,0 +1,3 @@
+package types
+
+const ModuleName = "namespace"
diff --git a/docker-compose.yml b/docker-compose.yml
index 19b630293..f7456d010 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -65,7 +65,7 @@ services:
## Get AUTH_TOKEN from celestia_devnet container: `docker logs celestia_devnet 2>&1 | grep CELESTIA_NODE_AUTH_TOKEN -A 5 | tail -n 1`
- DA_AUTH_TOKEN=${DA_AUTH_TOKEN:-}
- CARDINAL_EVM_LISTENER_ADDR=game:9020
- - NAMESPACE_AUTHORITY_ADDR:world142fg37yzx04cslgeflezzh83wa4xlmjpms0sg5
+ - NAMESPACE_AUTHORITY_ADDR=world142fg37yzx04cslgeflezzh83wa4xlmjpms0sg5
build:
context: chain
dockerfile: Dockerfile